Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Рассмотрим консольное приложение, выполняющее знаковое деление 64- битового операнда на 32-разрядный (листинг 2.17). Частное будет находиться в регистре ЕАХ, а остаток — в регистре EDX.
Листинг 2.17. Программа, выполняющая деление 64-битового операнда на 32-разрядный ;
386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32. lib
.data
conTitle DB "Sign division", 0
mes DB "The result of sign division 2788/(-360) = ", 0
len mes EQU $-mes
charBuf DB ", 0
len charBuf DD $-charBuf
idl DQ 2788
id2 DD -360
ires DQ 0
sign DB " + "
lpFmt DB "%d",- 0
lpFmtMix DB "%c%d", 0
readBuf DB ?
lenReadBuf DD 1
hStdln DD 0
hStdOut DD 0
chrsRead DD 0
chrsWritten DD 0

STD_INP_HNDL DD -10'
STD_OUTP_HNDL DD -11
. code
start:
call AllocConsole
test EAX, EAX
jz ex
push offset conTitle
call SetConsoieTitieA
test EAX, EAX
j z ex
call getout_hndl
call getinp_hndl
; операция деления б4-битовой переменной idl
; на 32-разрядный делитель id2
mov ЕАХ, DWORD PTR idl
mov EDX, DWORD PTR idl+4
mov EBX, id2
idiv EBX
; сохранить' частное по адресу ires+4
; и остаток по адресу ires
mov DWORD PTR ires+4, EAX
mov DWORD PTR ires, EDX
; преобразование значения частного в строку
push DWORD PTR ires+4
push offset lpFmt
push offset charBuf
call wsprintf
add ESP, 12
push EBX
3 Зак. 1064
mov EBX, offset mes
mov ECX, len_mes
call write_con
pop EBX
; вывод на экран значения частного
push ЕВХ
mov ЕВХ, offset charBuf
mov ECX, len_charBuf
call write_con
pop EBX
; очистка строкового буфера
call clear_buf
; преобразование в строку остатка от деления
push DWORD PTR ires
push DWORD PTR sign
push offset lpFmtMix
push offset charBuf
call wsprintf
add ESP, 16
; вывод на экран значения остатка от деления
push ЕВХ
mov ЕВХ, offset charBuf
mov ЕСХ, len_charBuf
call write_con
pop EBX
; ожидание ввода с консоли и выход
call read con
ех:
push О
call ExitProcess
; подпрограммы
getout_hndl proc
push STD_OUTP_HNDL
call GetStdHandle
ret
getout_hndl endp
getinp_hndl proc
push STD_INP_HNDL
call GetStdHandle
mov hStdln, EAX
ret
getinp_hndl endp
write_con proc
push 0
push chrsWritten
push ECX
push EBX
push hStdOut
call WriteConsoleA
ret
write_con endp
read_con proc
push 0
push chrsRead
push lenReadBuf
push offset readBuf
push hStdln
call ReadConsoleA
ret
read_con endp
mov hStdOuf, EAX
clear_buf proc
eld
lea EDI, BYTE PTR charBuf
mov ECX, len_charBuf
mov AL, 20h
rep stosb
ret
clear_buf endp
end start


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru