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

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


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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


 
 
 

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