138
mov edi,Chislo ; заносим в регистр
edi адрес строки для
записи числа цифрами
add edi,5 ; записывать цифры будем начиная с правой,
поэтому
переходим к концу строки
l: xor dx,dx ; обнуление dx
div [schisl] ; после выполнения
div в dl автоматически
заносится остаток от деления
add d
l,'0' ; для получения кода цифры прибавляем к числу код
нуля
mov [edi],dl ;
пересылаем в память, где хранится запись
числа цифрами, очередную
dec edi ;передвигаемся к следующему байту — идем от
конца
or ax,ax ; проверяем ax, где остается частное, на
равенство
нулю, если нет -
jnz l ; продолжаем делить
; вызов WinAPI MessageBox
для вывода строки
invoke MessageBox,HWND_DESKTOP,Chislo,"
Сумма
нечетных",MB_OK
ret
Итак, сначала мы заносим в регистр EDI (расширенная версия DI,
используется из-за 32-разрядной архитектуры) адрес начала будущей
записи числа цифрами в памяти с помощью команды mov edi,Chislo.
Однако вспомним, что при формировании позиционной записи мы пишем
остатки справа налево — следовательно, нужно перейти к концу строки.
Поскольку мы отвели пять позиций под запись числа, добавляем 5 к адресу
командой add edi,5 (адресная арифметика в ассемблере). Следующая
строка — начало цикла, поэтому она помечена l. В ней первая команда
иллюстрирует программистский трюк — для обнуления регистра DX
используется xor значения самого с собой — команда выполняется
быстрее, нежели mov dx,0. Далее с помощью div [schisl]
производится деление солержимого AX на основание системы счисления,
извлекаемое из соответствующей ячейки памяти с помощью косвенной
адресации. Особенностью команды div является то, что в данном случае
остаток от деления автоматически попадает в младшие биты регистра DX,
называемые DL. А нам именно этот остаток и нужен! Пересылаем его по
адресу, на который указывает EDI (косвенная адресация), однако
предварительно превращаем остаток, который сам по себе является числом
от 0 до 9 при основании системы счисления 10, в соответствующий код
символа. Сделать это несложно , поскольку в используемой кодировке
коды цифр идут подряд. Достаточно с помощью команды add dl,'0'
прибавить код нуля, чтобы получить необходимый символ — цифру. С
помощью команды dec edi переходим к предыдущей позиции в памяти.
140
<
тело>
ENDM
При выполнении макроподстановки в тексте программы <
имя> будет
заменено на <
тело> с подстановкой в нем указываемых фактических
параметров вместо формальных. Параметры макроса записываются через
запятую или пробел. Размещать макроопределения в тексте
программыследует до первой макрокоманды, использующей макрос.
Макросредства при программировании на языках ассемблера настолько
популярны, что сам язык иногда называют
макроассемблером.
Достарыңызбен бөлісу: