.:: Категории каталога ::. |
Разное
[5]
Различные темы по программированию
|
Пакет SWT
[4]
Практикуемся в написании оконных приложений на Java
|
Среды разработки, компиляторы и т.п
[3]
Сравнения, описания, плюсы и минусы сред разработки. Сравнение компиляторов.
|
Java
[8]
Объектно-ориентированные соображения.
|
Си++
[19]
Коротко и ясно
|
Ассемблер
[6]
Машинные коды, побитно :)
|
|
|
.:: Коментируем ::. |
 |
Программа с лекции по ассемблеру
Code .386 model flat, STDCALL include wincon32.inc extrn WriteConsoleA:PROC extrn ReadConsoleA:PROC extrn GetStdHandle:PROC extrn ExitProcess:PROC extrn FreeConsole:PROC extrn AllocConsole:PROC
.data num1 dd 0 mess dd 80 num2 dd 0 buf_v db 80 dup (0) box dw 0
.code start: call FreeConsole call AllocConsole call GetStdHandle, STD_INPUT_HANDLE ;--------------------------------------------- push 0 ;резерв push offset num1 ;число введёных символов push mess ;макс. число ввод. символов push offset buf_v ;адрес массива для записи символов push eax ;указатель потока ввода call ReadConsoleA<br> ;-------------------------------------------------- call GetStdHandle, STD_OUTPUT_HANDLE ;------------------------------------------------- call WriteConsoleA, eax, offset buf_v, mess, offset num2, 0 ;-------------------------------------------------------------------- call GetStdHandle, STD_INPUT_HANDLE call ReadConsoleA, eax, offset buf_v, mess, offset num1, 0 call ExitProcess, 0 end start Вот такой код. Код не рабочий (под MASM), как я правильно предположил, когда первый раз его увидел. Я так решил, потому, что программирую на MASM, а это код на TASM, как позднее оказалось. Разберём. 1. Перед model ставится точка, т.к. это директива. 2. Файл wincon32.inc не стандартен, даже в интернете я не смог найти ни одной ссылки, можно предположить что он самописный. (об этом дальше) 3. Переменная box нигде не используется (по крайней мере в этой программе), поэтому её можно убрать. 4. Вызовы функций через call так, как они представлены в примере я вообще не разу не видел. Для программирующих на TASM такой синтаксис не смущает я думаю. Немного поразмыслив я накатал следующий код под MASM, немного его упростил.
Code .386 .model flat, STDCALL
extrn GetStdHandle :PROC extrn FreeConsole:PROC extrn AllocConsole:PROC extrn ReadConsole:PROC extrn ExitProcess:PROC
.data num1 dd 0 mess dd 80 buf_v db 80 dup (0)
.code start: call FreeConsole call AllocConsole push -10 call GetStdHandle push 0 push offset num1 push mess push offset buf_v push eax call ReadConsoleA push 0 call ExitProcess end start Вызов функций call осуществляется так, занося в стек аргументы, которые использует функция. STD_INPUT_HANDLE заменил на значение -10, эта константа описана в windows.inc При сборке линкер выдал следующие ошибки: wrong_lab1.obj : error LNK2001: unresolved external symbol _GetStdHandle wrong_lab1.obj : error LNK2001: unresolved external symbol _FreeConsole wrong_lab1.obj : error LNK2001: unresolved external symbol _AllocConsole wrong_lab1.obj : error LNK2001: unresolved external symbol _ReadConsoleA wrong_lab1.obj : error LNK2001: unresolved external symbol _ExitProcess Что делать ? Полазив по инету, спросил на форуме WASM.ru Натолкнули на мысль, что используя extrn линкер должен знать откуда брать эти функции, поэксперементировал и получилось вот что.
Code .386 .model flat, STDCALL
GetStdHandle equ GetStdHandle@4 extrn GetStdHandle :PROC extrn FreeConsole@0:PROC extrn AllocConsole@0:PROC extrn ReadConsoleA@20:PROC extrn ExitProcess@4:PROC
includelib kernel32.lib
.data num1 dd 0 mess dd 80 buf_v db 80 dup (0)
.code start: call FreeConsole@0 call AllocConsole@0 push -10 call GetStdHandle push 0 push offset num1 push mess push offset buf_v push eax call ReadConsoleA@20 push 0 call ExitProcess@4 end start Названия функций в таком виде находятся в библиотеке импорта kernel32.lib Строку GetStdHandle equ GetStdHandle@4 я написал, чтобы проверить своё предположение о том, что в файле wincon32.inc какраз и находятся такие строки, для использования нормально читаемых имён и подключения библиотеки kernel32.lib Т.е. если создать файл wincon32.inc и заполнить его следующим образом:
Code STD_INPUT_HANDLE equ -10 STD_OUTPUT_HANDLE equ -11
GetStdHandle equ GetStdHandle@4 FreeConsole equ FreeConsole@0 AllocConsole equ AllocConsole@0 ReadConsole equ ReadConsoleA@20 ExitProcess equ ExitProcess@4
includelib kernel32.lib то, пример данный в самом начале будет работать (точку перед model только надо поставить, удалить переменную box и правильно использовать call) Вот ещё пример, каторый будет работать.
Code .386 .model flat, STDCALL
include windows.inc include kernel32.inc includelib kernel32.lib
.data num1 dd 0 mess dd 80 num2 dd 0 buf_v db 80 dup (0)
.code start: call FreeConsole call AllocConsole invoke GetStdHandle, STD_INPUT_HANDLE invoke ReadConsoleA, eax, addr buf_v, mess, addr num1, 0 invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsoleA, eax, addr buf_v, mess, addr num2, 0 invoke GetStdHandle, STD_INPUT_HANDLE invoke ReadConsoleA, eax, addr buf_v, mess, addr num1, 0 invoke ExitProcess, 0 end start Как вам этот вариант ? Эротично, не правда ли ? На этом всё, пишите коменты, задавайте вопросы.
|
Категория: Ассемблер | Добавил: C0demaker (15.03.2009)
|
Просмотров: 4010
| Рейтинг: 0.0/0 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|
|