Смекни!
smekni.com

Программирование контроллера приоритетных прерываний (стр. 2 из 8)

model small.stack 100h.data.codestart: ;занесение в сегментный регистр адреса сегмента данныхmov ax, @datamov ds, ax ;помещаем в регистр ah номер функции, которая вводит символ movah, 01hint 21h ;вводим символ с клавиатуры;символ введенный с клавиатуры находится в регистре almovax,4c00hint 21h;выход из программы

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 21h

end 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 21h

end 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 21h

end 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 21h

end 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 код и наоборот.