Суббота, 19.07.2025, 08:06
Приветствую Вас Гость | RSS
Главная | Каталог статей | Регистрация | Вход
.:: Меню ::.
.:: Категории каталога ::.
Разное [5]
Различные темы по программированию
Пакет SWT [4]
Практикуемся в написании оконных приложений на Java
Среды разработки, компиляторы и т.п [3]
Сравнения, описания, плюсы и минусы сред разработки. Сравнение компиляторов.
Java [8]
Объектно-ориентированные соображения.
Си++ [19]
Коротко и ясно
Ассемблер [6]
Машинные коды, побитно :)
Форма входа
.:: Поиск ::.
.:: Дополнительно ::.
    Хостинг от Loqo.ru
             .:: Коментируем ::.
Главная » Статьи » Текстовый материал » Ассемблер

Программа с лекции по ассемблеру
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
Всего комментариев: 0

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Ant1 © 2025