Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 596
от 08.11.2006, 19:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 362, Экспертов: 23
В номере:Вопросов: 4, Ответов: 6


Вопрос № 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 в командной строке,
а то это слишком долго и неудобно.
Зарание спасибо.....
Отправлен: 02.11.2006, 20:12
Вопрос задал: Яковец Юрий Сергеевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: В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), для чего, если я правильно понимаю, необходимо преобразовать это числовое значение в текстовое.

для этого написал следующее приложение, которое, к сожалению, по непонятным мне причинам не работает (компилируется без ошибок, но программа не запускается) =

подскажите, пожалуйста, в чем ошибка; корректно ли реализован приведенный алгоритм и рационально ли его использовать?

буду признателен за помощь.
с уважением, Дмитрий.

Приложение:

Отправлен: 03.11.2006, 02:48
Вопрос задал: boot_sector (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: 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 можно нарисовать квадрат и что бы он при нажатии определнных клавиш двигался по экрану.
Отправлен: 03.11.2006, 13:10
Вопрос задал: Чеканов Владимир Витальевич/Chekanoff (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное