endstart
Пример 3. Программа вывода символа на экран
modelsmall.stack 100h.datafdb 'ф' ;помещаем в переменную f выводимый символ.codestart: ;занесение в сегментный регистр адреса сегмента данныхmov ax, @datamov ds, ax ;помещаем в регистр ah номер функции, которая выводит символmovah, 02hmovdl, f ; помещаем в dl символint 21h ;выводим символ на экранmovax,4c00hint 21h;выход из программыendstart
Пример 4. Вывод строки на экран
model small.stack 100h.dataf db 'строкавывода$';f – строковая переменная, которая обязательно заканчивается знаком $.codestart: ;занесение в сегментный регистр адреса сегмента данныхmov ax, @datamov ds, ax ;помещаем в регистр ah номер функции, которая выводит строку на экранmovah, 09hmovdx, offsetf; помещаем в dx адрес строки, которую выводимint 21h ;выводим строкуmovax,4c00hint 21h;выход из программыendstart
Организация вычислений
Система команд микропроцессора содержит пять логических команд. Эти команды выполняют логические операции над битами операндов. Размерность операндов должна быть одинакова. В качестве операндов могут использоваться, регистры, ячейки памяти (переменные) и непосредственные операнды (числа). Любая логическая команда меняет значение следующих флагов of, sf,zf,pf,cf (переполнение, знак, нуля, паритет, перенос)
andоперанд_1,операнд_2 — операция логического умножения (И - конъюнкция).
and ah, 0a1h; ah:=ah٧0ah
and bx, cx; bx:=bx٧cx
and dx, x1; dx:=dx٧x1
Команда and может применяться для сброса определенных битов в 0 или для определения значения некоторых битов. Например, необходимо 5й бит числа находящегося в bl установить в 0, остальные биты не трогать.and bl, 11011111b или and bl, 0cfh Если необходимо определить чему равен 5й бит, тоand bl, 00100000b или and bl, 20hВ результате если в регистре blв 5м бите был 0, то после выполнения этой команды мы получим нулевой результат, обнулим весь регистр. Если же в регистре bl в 5м бите была 1, то мы получим не нулевой результат.orоперанд_1,операнд_2 — операция логического сложения (ИЛИ - дизъюнкцию)
or al, x1; al:=al & x1
or eax,edx; eax:=eax & edx
or dx, 0fa11h; dx:=dx & 0fa11h
Команда or может применяться для установки определенных бит в 1. Например, необходимо установить в единицу 4й и 7й биты регистра ah.
or ah, 10010000b или or ah, 90h
xorоперанд_1,операнд_2— операция логического исключающего сложения (исключающего ИЛИ ИЛИ-НЕ). Команда может применятся для выяснения того какие биты в операндах различаются ил для инвертирования состояния заданных бит в операнде_1. Например, необходимо определить совпадает ли содержимое регистров ax и dx
xorax, dx ;если содержимое совпадает то в регистре ах мы получим
;нулевой результат, иначе не нулевой результат.
xorbh,10b ; инвертировали 1й бит в регистре bh
testоперанд_1,операнд_2 — операция “проверить” (способом логического умножения). Команда выполняет поразрядно логическую операцию И над битами операндов операнд_1 и операнд_2. Состояние операндов остается прежним, изменяются только флаги zf, sf, и pf, что дает возможность анализировать состояние отдельных битов операнда без изменения их состояния.
notоперанд — операция логического отрицания. Команда выполняет поразрядное инвертирование (замену значения на обратное) каждого бита операнда. Результат записывается на место операнда.
notax ;ax:=
Пример 5. Логическое сложение двух однобайтных чисел.
model small.stack 100h.datax1 db 0c2h ;первоеслагаемоеx2 db 022h ;второе слагаемоеydb ? ;переменная результата.codestart:movax,@datamovds,axmoval, x1 ;в al помещаем первое слагаемоеoral, x2 ;осуществляем логическое сложение, результат в almovy, al ;помещаем результат на местоmov ax,4c00hint 21hend start
Следующие две команды позволяют осуществить поиск первого установленного в 1 бита операнда. Они появились в 486 процессоре.
bsfоперанд_1, операнд_2 – сканирование бит операнда_2 от младшего к старшему в поисках первого бита установленного в 1. Если такой обнаружится, то в операнд_1 заноситься номер этого бита в целочисленном формате.
Пример:
moval,02h
bsfbx,al ; bx:=1, т.к. 1й бит регистра al=1
bsrоперанд_1, операнд_2 – сканирование бит операнда_2 от старшего к младшему в поисках первого бита установленного в 1. Если такой обнаружится, то в операнд_1 заноситься номер этого бита в целочисленном формате.
Пример:
moval,82h
bsrbx,al ; bx:=6, т.к. 6й бит регистра al=1
Если операнд_2 равен 0 то вышеописанные две команды устанавливают флаг нуля zfв 1, иначе в 0.
incоперанд - операция инкремента, то есть увеличения значения операнда на 1;
incax; ax:=ax+1
incx1; х1:=х1+1
addоп1,оп2 - команда сложения с принципом действия: оп1 = оп1 + оп2 (addition)
add al, bl
add ax, 0fe2h
add ebx, x1+2
add x1, 0fh
addx2, ax
adcоп1,оп2 - команда сложения с учетом флага переноса cf. оп1 = оп1 + оп2 + знач_cf
Вычитание двоичных чисел
decоперанд — операция декремента, то есть уменьшения значения операнда на 1;
dec cx ;cx:=cx-1
dec x
subоперанд_1,операнд_2 — команда вычитания; ее принцип действия:
операнд_1 = операнд_1 – операнд_2
subal, bl; al:=al-bl
sub ax, x1
sub x2, dx
sub eax, 0f35h
sub x2, 22h
sbbоперанд_1,операнд_2 — команда вычитания с учетом заема (флага cf ):
операнд_1 = операнд_1 – операнд_2 – значение_cf
Пример 6. Сложение двух однобайтных чисел.
modelsmall.stack 100h.datax1 db 0c2h ;первое слагаемоеx2 db 022h ;второе слагаемоеydb ? ;результат.codestart:movax,@datamovds,axmoval, x1 ;помещаем в al первое слагаемоеaddal, x2 ;складываем х1 и х2movy, al ;помещаем результат на местоmov ax,4c00hint 21hend start
mul множитель_1 - операция умножения двух целых чисел без учета знака
Алгоритм работы:
Команда выполняет умножение двух операндов без учета знаков. Алгоритм зависит от формата операнда команды и требует явного указания местоположения только одного сомножителя, который может быть расположен в памяти или в регистре. Местоположение второго сомножителя фиксировано и зависит от размера первого сомножителя. Местоположение результата также зависит от размера первого сомножителя.
muldl; ax:=al*dl, dl- множитель_1 , al- множитель_2
mulx1; dx:ax=ax*0ad91h, x1 word- множитель_1 , ax- множитель_2
mulecx; edx:eax=eax*ecx, ecx- множитель_1 , eax- множитель_2
в результате умножения может возникнуть ситуация когда результат по размеру превысит 16 или 32 бита, тогда старшая часть результата умножения заноситься в dx или edx соответственно.
imulмножитель_1 - операция умножения двух целочисленных двоичных значений со знаком
divделитель - выполнение операции деления двух двоичных беззнаковых значений
Алгоритм работы:
Для команды необходимо задание двух операндов — делимого и делителя. Делимое задается неявно, и размер его зависит от размера делителя, который указывается в команде. Расположение результата зависит от размера делителя.
divdl ;ah:al=ax/dl, ax –делимое, dl- делитель , ah-частное, al -остаток
divx1 ;ax:dx=dx:ax/0ad91h, dx:ax –делимое, x1 word- делитель ,
;ax-частное, dx -остаток
divecx ;eax:edx=edx:eax/ecx, edx:eax –делимое, ecx- делитель ,
;eax-частное, edx -остаток
idivделитель - операция деления двух двоичных значений со знаком
Пример 7. Умножение двух однобайтных чисел.
model small.stack 100h.datax1 db 78 ;первыймножительyldb ? ;первый байт результатаyhdb ? ;второй байт результата.codestart:movax,@datamovds,axxorax, ax ;очищаем регистр axmoval, 25 ;помещаем в al второй сомножительmulx1jncm1 ;если нет переполнения, переходим на метку m1movyh,ah ;иначе старший байт результата помещаем в yhm1:movyl, al ;результат помещаем на местоmov ax,4c00hint 21hend start
Пример 8. Деление двух однобайтных чисел.
model small.stack 100h.datax1 db 6 ;делительyldb ? ;остатокyhdb ? ;частное.codestart:movax,@datamovds,axxorax, ax ;очищаем регистр axmovax, 25 ;помещаем в al делимоеdivx1movyh,ah ;помещаем частное на местоmovyl, al ;помещаем остаток на местоmov ax,4c00hint 21hend start
ASCII коды и их интепритация
Ввод информации с клавиатуры и вывод ее на экран осуществляется в символьном виде, т.е. любой символ предоставляется в ASCII кодах. Причем на один символ идет один ASCII код. На два символа – два ASCII кода, и т.д. Любое число, вводимое с клавиатуры и выводимое на экран, представляется последовательностью ASCII кодов.
Табл.1. ASCII коды цифр
Символ шестнадцатеричной цифры | Двоичная тетрада | ASCII код (двоичное представление) | Разница |
0 | 0000 | 30h (0011 0000) | 30h |
1 | 0001 | 31h (0011 0001) | 30h |
2 | 0010 | 32h (0011 0010) | 30h |
3 | 0011 | 33h (0011 0011) | 30h |
4 | 0100 | 34h (0011 0100) | 30h |
5 | 0101 | 35h (0011 0101) | 30h |
6 | 0110 | 36h (0011 0110) | 30h |
7 | 0111 | 37h (0011 0111) | 30h |
8 | 1000 | 38h (0011 1000) | 30h |
9 | 1001 | 39h (0011 1001) | 30h |
A a | 1010 | 41h (0100 0001) 61h (0110 0001) | 37h 57h |
B b | 1011 | 42h (0100 0010) 62h (0110 0010) | 37h 57h |
C c | 1100 | 43h (0100 0011) 63h (0110 0011) | 37h 57h |
D d | 1101 | 44h (0100 0100) 64h (0110 0100) | 37h 57h |
E e | 1110 | 45h (0100 0101) 65h (0110 0101) | 37h 57h |
F f | 1111 | 46h (0100 0110) 66h (0110 0110) | 37h57h |
Рассмотрим последовательность действий для преобразования чисел в их ASCII код и наоборот.