
- •Содержание
- •Введение
- •1. Цель работы.
- •2. Теоретические основы.
- •2.1. Команды целочисленной арифметики ia-32
- •4. Команда обмена данных
- •2.2. Пример линейной программы
- •X sword ?
- •2.3. Организация ввода-вывода
- •Vvod: Invoke StdOut,addr zapros
- •Invoke StdIn,addr buffer,LengthOf buffer
- •Invoke StripLf,addr buffer
- •3. Используемое оборудование.
- •5. Порядок выполнения работы.
- •Варианты
- •Литература
X sword ?
.CODE
Start: mov CX,D
add CX,8; CX:=D+8
mov BX,B
dec BX ; BX:=B-1
mov AX,A
add AX,B; AX:=A+B
imul BX ; DX:AX:=(A+B)*(B-1)
idiv CX ; AX:=(DX:AX):CX
mov X,AX
. . .
2.3. Организация ввода-вывода
Библиотека MASM32.lib содержит специальные подпрограммы ввода-вывода консольного режима:
1. Процедура ввода:
StdIn PROC lpszBuffer:DWORD, bLen:DWORD
Первый операнд – адрес буфера ввода, второй – размер буфера ввода (до 128 байт). В буфере ввода введенная строка завершается символом конца строки (13, 10).
2. Процедура замены символов конца строки нулем:
StripLF PROC lpszBuffer:DWORD ; буфер ввода
3. Функция преобразования завершающейся нулем строки в число:
atol proc lpszBuffer:DWORD ; результат – в EAX
Пример программирования ввода:
.DATA
zapros DB 'Input value:',13,10,0 ; запрос
buffer DB 10 dup ('0') ; буфер ввода
.CODE
. . .
Vvod: Invoke StdOut,addr zapros
Invoke StdIn,addr buffer,LengthOf buffer
Invoke StripLf,addr buffer
; Преобразование в SDWORD
Invoke atol,ADDR buffer ;результат в EAX
. . .
4. Процедура вывода завершающейся нулем строки в окно консоли:
StdOut PROC lpszBuffer:DWORD ; буфер вывода, зав. нулем
5. Процедура преобразования числа в строку:
dwtoa PROC public dwValue:DWORD, lpBuffer:PTR BYTE
Пример программирования вывода:
.DATA
result DWORD ? ; поле результата
string DB 13,10,'Result =' ; заголовок вывода
resstr DB 16 dup (?) ; выводимое число
.CODE
. . .
; Преобразование
Invoke dwtoa,result,ADDR resstr
; Вывод
Invoke StdOut,ADDR string
. . .
Версия программы раздела 3 с вводом-выводом:
; Template for console application
.586
.MODEL flat, stdcall
OPTION CASEMAP:NONE
Include kernel32.inc
Include masm32.inc
IncludeLib kernel32.lib
IncludeLib masm32.lib
.CONST
MsgExit DB 13,10,"Press Enter to Exit",0AH,0DH,0
.DATA
B SWORD -6
D SWORD 11
X SWORD ?
fX SWORD 0 ; старшее слово результата
Zapros DB 13,10,'Input A',13,10,0
Result DB 'Result='
ResStr DB 16 DUP (' '),0
.DATA?
A SWORD ?
fA SWORD ? ; старшее слово переменной A
Buffer DB 10 DUP (?)
inbuf DB 100 DUP (?)
.CODE
Start: Invoke StdOut,ADDR Zapros
Invoke StdIn,ADDR Buffer,LengthOf Buffer
Invoke StripLF,ADDR Buffer
; Преобразование в SDWORD
Invoke atol,ADDR Buffer ;результат в EAX
mov DWORD PTR A,EAX
; Вычисления
mov CX,D
add CX,8; CX:=D+8
mov BX,B
dec BX ; BX:=B-1
mov AX,A
add AX,B; AX:=A+B
imul BX ; DX:AX:=(A+B)*(B-1)
idiv CX ; AX:=(DX:AX):CX
mov X,AX
; Преобразование
Invoke dwtoa,X,ADDR ResStr
; Вывод
Invoke StdOut,ADDR Result
XOR EAX,EAX
Invoke StdOut,ADDR MsgExit
Invoke StdIn,ADDR inbuf,LengthOf inbuf
Invoke ExitProcess,0
End Start