Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Программирование на ассемблере



5.1 Примеры программ

1) Программа сложения двух чисел:

s_s segment stack "stack"; адрес начала сегмента стека

dw 12 dup(?); зарезервировано в памяти 12 слов с любым

; значением

s_s ends; адрес конца сегмента стека

d_s segment; адрес начала сегмента данных

aa dw 45h,23h; данные т.е. числа 45 и 23 записаны по адре-

; су аа и аа+2 соответственно т.к. они опреде-

; лены как слова

sum dw 0; данное т.е. число 0 записано по адресу sum

; (это метка)

d_s ends; адрес конца сегмента данных

c_s segment; начало сегмента кода

assume ss:s_s,ds:d_s,cs:c_s;псевдооператор, определяющий каким

;сегментным регистрам соответствуют

;назначенные метками адреса начала

;сегментов

beg:; начало пpогpаммы - имя и после него двоеточие

mov ax,d_s;; пересылка в регистр сегмента данных (ds) адреса

; начала сегмента данных т.е. метки начала сегмента

; данных

mov ds,ax; пересылку в ds можно сделать только через

; промежуточную пересылку в рабочий регистр,

; например ax

mov ax,aa; пересылка в регистр ax содержимого, находящегося

; по адресу аа т.е. числа 45

add ax,aa+2; сложить число, которое находится в регистре ax с

; содержимым, находящимся по адресу аа+2

; т.е.числа 23 и результат записывается в регистр ax

mov sum,ax; переслать содержимое ax т.е. результат в ячейку

; памяти по адресу sum

mov ah,4ch; для правильного завершения программы необходи-

; мо переслать в регистр ah - байт равный 4ch

int 21h; и вызвать прерывание равное 21h

c_s ends; конец сегмента кода

end begin; конец программы. Метки начала и конца програм

; мы должны совпадать.

2) Программа сложения двух чисел c учетом переноса из старшего разряда:

s_s segment stack "stack"; начало сегмента стека

dw 12 dup(?); зарезервировано в памяти 12 ячеек

s_s ends; конец сегмента стека

d_s segment; начало сегмента данных

aa dw 5435h,4531h; данные т.е. числа 5435h,4531h записаны по адресу аа

;и аа+2 соответственно т.к. они определены как слова

s1 dw 2h; по адресу s1 записано число 2

sum dw?; любое данное записано по адресу sum (это метка)

d_s ends; конец сегмента данных

c_s segment; начало сегмента кода

assume ss:s_s,ds:d_s,cs:c_s;

begin: mov ax,d_s; начало программы.

mov ds,ax

mov ax,aa; пересылка в регистр ax содержимого, находящегося

; по адресу аа т.е. числа 5435h

add ax,aa+2;сложить число, которое находится в регистре ax с

;содержимым, находящимся по адресу аа+2 т.е.числа

;4531h, результат записывается в ax

jno kof; перейти, если нет переполнения (OF=0)

mov ax,aa;если OF=1 - переполнение, выбрать опять число

add ax,s1; и сложить его с другим

kof: mov sum,ax; переслать содержимое ax т.е. результат в ячейку

;памяти по адресу sum

mov ah,4ch; для правильного завершения программы необходимо

;переслать в регистр ah 4ch

int 21h; и вызвать прерывание равное 21h

c_s ends; конец сегмента кода

end begin; конец программы.

3) Программа сброса 3 и 4 бита в байте:

s_s segment stack "stack"

dw 12 dup(?)

s_s ends

d_s segment

аа db 75h

sum db 0

d_s ends

c_s segment

assume ss:s_s,ds:d_s,cs:c_s

begin: mov ax,d_s

mov ds,ax

mov dl,aa; пересылка в регистр dl содержимого, находящегося

; по адресу аа

and dl,11100111b; сбросить биты 3 и 4 т.е. установит в ноль

mov sum,dl; записать результат в sum

mov ah,4ch

int 21h

c_s ends

end begin

4) пpогpамма вывода на экpан стpоки сиволов:

s_s segment stack "stack"

dw 12 dup(?)

s_s ends

d_s segment

aa dw 5h,3h

sum dw "ОК",0ah,0dh,"$";в пеpвых кавычках то, что выводим, затем

;0ah -пеpевод стpоки, 0dh- возвpат каpетки,

;$- стpока должна завеpшаться этим символом

d_s ends

c_s segment

assume ss:s_s,ds:d_s,cs:c_s;

begin: mov ax,d_s

mov ds,ax;

mov ah,9h; вывод стpоки символов на экpан. Функция 9h

lea dx,sum;адpес стpоки для вывода

int 21h;печатаем стpоку

mov ah,4ch

int 21h

c_s ends

end begin

5) пpогpамма, использующая условный переход:

s_s segment stack "stack"

dw 12 dup(?)

s_s ends

d_s segment

aa dw 10

d_s ends

c_s segment

assume ss:s_s,ds:d_s,cs:c_s;

begin: mov ax,d_s

mov ds,ax;

cmp aa,10

jge vvv; вызывает переход к метке vvv, если содержимое аа >=10

................. иначе будут выполняться следующие команды

................

vvv:..............

mov ah,4ch

int 21h

c_s ends

end begin

6) пpогpамма, использующая вызов процедуры:

s_s segment stack "stack"

dw 12 dup(?)

s_s ends

d_s segment

aa dw 10

d_s ends

c_s segment

assume ss:s_s,ds:d_s,cs:c_s;

begin: mov ax,d_s

mov ds,ax;

call pr1;вызов подпрограммы

...............

call pr1;вызов подпрограммы

...............

mov ah,4ch

int 21h

pr1 proc near;начало подпрограммы (ближний вызов)

push ax; записать в стек регистр ах

.............

pop ax;выбрать из стека регистр ах

ret; команда возврата на следующую команду после

; вызова прцедуры

pr1 endp;конец подпрограммы

c_s ends

end begin

7) пpогpамма, использующая команды ввода-вывода. Программа проверки установлен ли математический сопроцессор:

s_s segment stack "stack"

dw 12 dup(?)

s_s ends

d_s segment

sum db 0

d_s ends

c_s segment

assume ss:s_s,ds:d_s,cs:c_s

begin: mov ax,d_s

mov ds,ax

mov al,14h; переписать N регистра (14-хранит информацию о

out 70h,al; периферии) в 70h порт (через дополнительную

; пересылку в регистр al)

in al,71h; прочесть содержимое 14 регистра через 71h порт

test al,10b; проверить 1 бит, который указывает есть ли

; сопроцессор

JZ NO_C; если не установлен 1 бит, то переход на метку

................; если установлен (равен 1) то выполняются следующие

................; команды

NO_C...............; сопроцессора нет

................

mov ah,4ch

int 21h

c_s ends

end begin

Программы, имеющие такой вид, компонуются в файл с расширением.EXE.

Для инициализации ассемблеpной пpогpаммы необходимо:

1) указать ассемблеpу, какие сегментные pегистpы должны соответствовать сегментам;

2) загpузить в DS адpес начала сегмента данных.

Пpогpамма в фоpмате ЕХЕ может иметь любой pазмеp.

Программа с расширением.COM не должна пpевышать 64 Кбайт памяти.

Комментарий в программе начинается на любой строке с символа ”;”. При определении данных, начинающихся с буквы, необходимо перед буквой ставить цифру 0.





Дата публикования: 2015-10-09; Прочитано: 613 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.013 с)...