Вопрос № 61056: Здравствуйте уважаемые эксперты!
У меня возникли проблемы с
интерфейсом Ассемблера и Си.
Просто у меня задание такое-
вызвать процедуру из асм
в Си, но без использования всавок asm{}.
В Паскале всё просто:
компилируешь *.a...Вопрос № 61091: доброго времени суток, уважаемые кодеры.
помогите, пожалуйста, со следующей проблемой; есть числовое значение переменной, которое необходимо вывести текстом в рабочей области win32 приложения (DrawText, TextOut), для чего, если я правильно понима...Вопрос № 61144: Подскажите пожалуйста как в Assembler можно нарисовать квадрат и что бы он при нажатии определнных клавиш двигался по экрану....Вопрос № 61168: Опять Xtreme и опять по асму.
Заранее хочу поблагодарить Виктора за его подробное объяснение(всё сразу прояснилось).RESPECT!
1)Если я знаю ,что адрес сообщения находится в смещении 0109h,я пишу mov dx,0109h.
Но когда я пишу вместо э...
Вопрос № 61.056
Здравствуйте уважаемые эксперты!
У меня возникли проблемы с
интерфейсом Ассемблера и Си.
Просто у меня задание такое-
вызвать процедуру из асм
в Си, но без использования всавок asm{}.
В Паскале всё просто:
компилируешь *.asm файл в объектный
*.obj с помощью TASM, затем копируешь его в
директорию среды Turbo Pascal(BIN),а в исходнике
*.pas в начале пишешь {$L имя_obj_файла} и все работает
на ура.
Подскажите ПЛЗ, что либо подобное можно сделать в Си,
кроме как tcc имя_файла_1.cpp имя_файла_2.asm в командной строке,
а то это слишком долго и неудобно.
Зарание спасибо.....
Отвечает: Вiктор
Здравствуйте, Яковец Юрий Сергеевич!
Я знаю 2 способа: через асм-вставки, которые вы не будете использовать, и через трансляцию асм-функции в объектный файл с последующией прилинковкой этого файла к си-шному объектному файлу, но вам похоже и второй способ не подходит. Если вы работаете в виндовс, то можно ещё сделать DLL на асм-е, а потом вызывать асм-функции из DLL.
Между прочим, можно транслировать асм-функцию в obj-файл, затем этот объектный файл поместить в *.lib файл, а затем этот библиотечный файл подключить к исходнику си с помощью
#pragma comment (lib, "asm_fn.lib"),
и это будет почти то же самое что паскалевское {$L имя_obj_файла}, только дополнительная морока с переводом obj->lib.
Но я думаю что ни один из способов, что я знаю, вам не подойдёт.
--------- Флаг вам в руки! (sti, stc, etc)
Ответ отправил: Вiктор (статус: 8-ой класс)
Ответ отправлен: 03.11.2006, 13:25 Оценка за ответ: 4
Вопрос № 61.091
доброго времени суток, уважаемые кодеры.
помогите, пожалуйста, со следующей проблемой; есть числовое значение переменной, которое необходимо вывести текстом в рабочей области win32 приложения (DrawText, TextOut), для чего, если я правильно понимаю, необходимо преобразовать это числовое значение в текстовое.
для этого написал следующее приложение, которое, к сожалению, по непонятным мне причинам не работает (компилируется без ошибок, но программа не запускается) =
подскажите, пожалуйста, в чем ошибка; корректно ли реализован приведенный алгоритм и рационально ли его использовать?
Отвечает: Bob Johnson
Здравствуйте, boot_sector!
16-битный код по виндой... оригинально...
вообще, для преобразование числа в строку его обычно делят циклически на 10 и используют остаток от деления как очередную цифру результата (результат получается правда справа-налево).
но эту задачу за тебя давно решили, в windows есть функция wsprintf, которая в состоянии это сделать:
wsprintf (buffer, "%i", number). соглашение ее вызова - __cdecl, т.е. вернуть указатель стека на место после вызова - задача твоя:
push [number]
push offset format_string;
push offset buffer
call wsprintf
add esp, 12
Ответ отправил: Bob Johnson (статус: Академик) Россия, Калуга WWW:Программирование ---- Ответ отправлен: 03.11.2006, 18:35
Вопрос № 61.144
Подскажите пожалуйста как в Assembler можно нарисовать квадрат и что бы он при нажатии определнных клавиш двигался по экрану.
Отвечает: Lonely Wolf / ENS
Здравствуйте, Чеканов Владимир Витальевич/Chekanoff!
Квадрат, ровно как и любую другую геометрическую фигуру можно нарисовать при помощи OpenGL, двигать, поворачивать, прятать и что только вашей душе угодно.
Я думаю Вас интересует как это сделать на АСМе при помощи API функции. Ну так вот квадрат рисуется при помощи Rectangle(HDC, int, int, int, int);(2 ,3 - X и Y начала квадрата, 4,5- X,Y конца квадрата)
Клавиши обрабатываются WM_CHAR:обрабатываем нужную нам клавишу и меняем 2-5 параметры.
А вообще, рисуют с помощью OpenGL,DirectX etc. А вот передвигают АСМом, выполняют арифметические операции, расчитывают что-либо.
Приложение:
--------- Ассемблер FOREVER!!!
Ответ отправил: Lonely Wolf / ENS (статус: 8-ой класс)
Ответ отправлен: 03.11.2006, 20:00
Вопрос № 61.168
Опять Xtreme и опять по асму.
Заранее хочу поблагодарить Виктора за его подробное объяснение(всё сразу прояснилось).RESPECT!
1)Если я знаю ,что адрес сообщения находится в смещении 0109h,я пишу mov dx,0109h.
Но когда я пишу вместо этого mov ds:[di],0109h,то на экран НЕ выводится моё сообщение.
Инстукции разве не выполняют одно и то же?
2)Не очень понятно вычисление,по которому узнаётся ,сколько байт занимает данная операция!
Например,c начала com-проги(0100h) производится операция ,а в отладчике IP=0103h,тогда
0103h-0100h=0003h.Но 0003h-это же не 3 байта!!
3)Когда я прогу,которая выводит рожицу на синем фоне,запустил под отладчиком всё заработало.
А что ещё страннее ,когда я вышёл из Far Manager'a ,вошёл и запустил прогу методом тыка-опять ОБЛОМ!!!
Отправлен: 03.11.2006, 17:53
Вопрос задал: Xtreme (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: Mihasic
Здравствуйте, Xtreme!
1) команда mov ds:[di], 0109h заносит двухбайтовое значение 0109h в ячейку памяти с адресом, сегмент которого содержится в ds, а смещение в di.
Кстати, ИМХО лучше данную команду писать так:
mov word ptr ds:[di], 0109h ; таким образом явно указывая размер приемника
2) я не совсем все понял, но подозреваю, что отладчик сразу выполнил первую команду...
3) с данной программой было связано много обсуждений, но я в них не участвовал и не видел ее кода, поэтому рекомендую воспользоваться поиском
Ответ отправил: Mihasic (статус: 8-ой класс)
Ответ отправлен: 03.11.2006, 18:02
Отвечает: Pinkbyte
Здравствуйте, Xtreme!
Небольшое дополнение:
2) Да ну? Позвольте вас просветить: числа от 0 до 9 что в шестнадцаричной, что в десятичной системе одинаковы. ТО есть 3h = 3, 5h=5 и так далее
3) Это из-за специфики работы Windows с консольными и ДОС-приложениями
--------- Нейтральность - высшее достижение сознания
Ответ отправил: Pinkbyte (статус: 3-ий класс)
Ответ отправлен: 04.11.2006, 00:14
Отвечает: Волков Павел Юрьевич
Здравствуйте, Xtreme!
1)
mov dx,0109h - помещает число 0109h в регистр dx
mov ds:[di],0109h - помещает число 0109h по адресу,
значение сегмента + значение смещения в di
Для вывода изображения на экран, поместите в es:di адресс видео-памяти, в соответствии с выбранным режимом видеоадаптера, поместите слово, состоящее из младшего байта - символа ascii, старшего байта - аттрибуты символа и экрана.
2)
IP указывает на текущее смещение в программе.
Вы получили смещение на 3 байта.
Для вычисления длины команды можно взять код по интересующему адресу и выделить опкод инструкции.
m:
mov di,offset m
mov al,[di] ;определяем первый байт инструкции
Или через call:
m:
mov dx,offset m
call n ;можно заменить на call $+3 для 16-разрядных инструкций
n:
pop ax
sub ax,3 ;вычитаем длину инструкции call n
sub ax,dx ;в ax - длина mov dx,offset m
3)
пользуйтесь поиском по рассылке, тема не раз поднималась.
вставьте в начало программы:
mov ah,3
int 10h
--------- Век живи, век учись.
Ответ отправил: Волков Павел Юрьевич (статус: 8-ой класс)
Ответ отправлен: 04.11.2006, 07:01