Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
В этом фрагменте кода для суммирования элементов массива iarray используется
цикл. На каждой итерации в регистр E S I загружается адрес двойного
слова. Суммирование элементов выполняется с использованием 16-
разрядного регистра АХ. Количество итераций определяется содержимым
счетчика на регистре ЕСХ. В регистр ЕСХ загружается размер массива в двойных
словах. Результат выполнения каждой итерации добавляется к сумме,
полученной ранее, и хранится в переменной ISUM.
Преобразование целочисленной переменной ISUM в строку выполняется, как
мы уже знаем, функцией WIN API wsprintf. Вывод результата в окно приложения
выполняется, как обычно, функцией writecon
Следующими математическими операциями, которые мы рассмотрим, будут
операции умножения и деления. Вначале расскажу коротко о том, как выполняются
операции умножения. Существуют две команды умножения.
Команда mui используется для умножения двух целых чисел без знака и дает
беззнаковый результат. Команда imul используется для умножения целых
чисел со знаком.
Команда mui выполняет умножение 8-, 16- или 32-разрядных операндов.
Множимое помещается в регистр AL, АХ ИЛИ ЕАХ, в зависимости от размера
операнда. Множителем может быть 8-, 16- или 32-разрядное число. Размерности
операндов множимого и множителя должны быть одинаковыми.
Размерность результата умножения в два раза больше размерности каждого
из операндов. Так, если в операции умножения используется регистр AL, ТО
результат помещается в регистр АХ. ЕСЛИ используется регистр АХ, ТО результат
помещается в регистры DX:AX, причем, в регистре DX содержатся старшие
16 бит результата, а в регистре А Х — младшие 16 бит. Наконец, если в
качестве множимого используется регистр ЕАХ, ТО результат помещается в
регистры EDX : ЕАХ. Старшие 32 бита результата помещаются в регистр EDX,
младшие — в регистр ЕАХ.
В операции умножения не допускается использование непосредственных
операндов.
Следующий пример показывает, как выполняется операция умножения беззнаковых
чисел в программе на ассемблере. В этой программе мы будем
использовать 32-разрядные операнды. Особое внимание хочется обратить на
технику обработки результата умножения в этом примере. Поскольку в результате
умножения 32-битовых операндов мы получаем 64-битовый результат,
то преобразование его в строковую переменную функцией wsprintf
будет выглядеть сложнее, чем для 32-разрядных чисел. Исходный текст программы
представлен в листинге 2.16.
Листинг 2.16. Программа умножения беззнаковых чисел
.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
STD_INP_HNDL DD -10
STD_OUTP_HNDL DD -11
. code
start:
call AiiocConsoie
test EAX, EAX
j z ex
push offset conTitle
call SetConsoleTitleA
test EAX, EAX
jz ex
call getout_hndl
call getinp_hndl
; умножение 32-разрядных операндов
mov EAX, il
mov EDX, i2
mul EDX
mov DWORD PTR ires, EAX
mov DWORD PTR ires+4, EDX
. data
conTitle DB "Multiplication of integers", 0
mes DB "The result of muliplying the ints = ", 0
len_mes EQU $-mes
charBuf DB " 0
len_charBuf DD $-charBuf
11 DD 95
12 DD 34
ires DQ 0
lpFmt DB "%ld", 0
readBuf DB 0
lenReadBuf DD 1
hStdln DD 0
hStdOut DD 0"
chrsRead DD 0
chrsWritten DD 0
; преобразование 64-разрядного целого в строку
push DWORD PTR ires+4
push DWORD PTR ires
push offset lpFmt
push offset charBuf
call wsprintf
add ESP, 16
push EBX
mov EBX, offset mes
mov ECX, len_mes
call write_con
pop EBX
; вывод результата умножения на экран
push EBX
mov EBX, offset charBuf
mov ECX, len_charBuf
call write_con
pop EBX
; ожидание ввода с клавиатуры и выход
call read_con
ex:
push О
call ExitProcess
; объявления функций
end start
<< Назад В начало Далее >> |
|