epd627
.pdfПРИМЕРЫ (ТЕКСТЫ) ПРОГРАММ
Пример 1.1
;lab1pr1.asm ред. 03_11_05
;РАЗРАБОТАЛ МИШУРИН А.О., СТУДЕНТ ГРУППЫ 11БИ, ИЮЛЬ 2003 ГОДА. ;Программа (работает с МП 8086) выводит на экран сообщение "Привет, уважаемый
;пользователь!" + ожидает нажатия клавиши пользователем
;Компиляция: tasm.exe lab1pr1.asm
;tlink.exe lab1pr1.obj
;-сегмент стека---------------------------------
stacksg segment para stack 'Stack' ; segment – директива, показывающая начало
|
db 32 dup(?) |
|
; |
сегмента с именем stacksg |
|
stacksg ends |
|
|
; ends – директива, показывающая конец этого сегмента |
||
;-сегмент данных---------------------------------- |
|
|
|
||
datasg segment para 'Data' |
; segment – директива, показывающая начало |
||||
; |
|
|
|
|
сегмента с именем datasg |
msg |
db "Привет, уважаемый пользователь!","$" |
||||
msg_e db "Для выхода нажмите любую клавишу!","$" |
|||||
datasg ends |
|
|
; ends – директива, показывающая конец этого сегмента |
||
;- сегмент кода---------------------------------- |
|
|
|
|
|
codesg segment para 'Code' ; директива, показывающая начало сегмента codesg |
|||||
main proc far |
|
; proc– директива, показывающая начало процедуры с именем main |
|||
|
assume cs:codesg,ds:datasg,ss:stacksg |
; директива, устанавливающая |
|||
; |
|
|
|
соответствие сегментных регистров (cs, ds, ss) сегментам |
|
; следующие пять строк должны быть в любой EXE-программе |
|||||
|
push ds |
|
; сохранение содержимого регистра ds в стеке (для возврата в DOS) |
||
|
xor ax,ax |
|
|
|
|
|
push ax |
|
|
|
|
|
mov ax,datasg |
; инициализация регистра ds (заносится адрес |
|||
|
mov ds,ax |
; начала сегмента данных) |
|||
;--------- |
вывод на экран сообщения |
|
|||
mov ah,09h |
|
; функция вывода на экран (регистр ah:=09h) |
|||
lea dx,msg |
|
; загрузить в регистр dx адрес начала строки |
|||
; |
|
|
|
«Привет, уважаемый пользователь» |
|
int 21h |
|
; передача управления DOS |
|||
;--------- |
вывод на экран сообщения |
|
|||
mov ah,09h |
|
; функция вывода на экран (регистр ah:=09h) |
|||
lea dx,msg_e |
|
; загрузить в регистр dx адрес начала строки |
|||
int 21h |
|
; "Для выхода нажмите любую клавишу!" |
|||
mov ah,0 |
|
; ожидание нажатия клавиши |
|||
int 16h |
|
|
|
|
|
ret |
|
|
; возврат в DOS |
|
|
main endp |
|
; ends – директива, показывающая конец процедуры main |
|||
codesg ends |
|
; ends – директива, показывающая конец сегмента codesg |
|||
end main |
; end – директива, показывающая конец программы и определяющая |
; входную точку программы, с которой начинается выполнение программы, т.е. main
– первая цифра в номере примера (до точки) обозначает номер части учебного пособия «Языки программирования»
91
Пример 1.2
;lab1pr2.asm ред. 02_06_05
;РАЗРАБОТАЛ МИШУРИН А.О., СТУДЕНТ ГРУППЫ 11БИ, ИЮЛЬ 2003 ГОДА. ;Программа (работает с МП 8086) обеспечивает ввод с клавиатуры байта + ;перевод из кодов ASCII (символы) в bin (двоичное число).
;Компиляция: tasm.exe lab1pr2.asm
;tlink.exe lab1pr2.obj
;-сегмент стека---------------------------------
stacksg segment para stack 'Stack' ; para – параграф (сегмент должен начинаться с
; |
адреса, кратного шестнадцати, т.е. на границе параграфа) |
db 32 dup(?) |
;стек состоит из 32 байтов |
stacksg ends |
; конец сегмента |
;-сегмент данных---------------------------------- |
|
datasg segment para 'Data' ;сегмент данных тоже должен начинаться на границе
; |
параграфа |
msg_b1 db "b1=",0dh,0ah, "$" |
|
msg_e db "Для выхода нажмите любую клавишу!",0dh,0ah,"$" msg_err1 db "Ошибка#1: ошибка ввода!",0dh,0ah,"$"
; Список параметров для ввода переменной, значение которой вмещается в один байт vvod_b label byte
maxlen_b db 4 ;максимальное кол-во символов, вводимых с клавиатуры, вкл. ENTER fact_b db 0 ;фактическое кол-во символов, вводимых с клавиатуры, вкл. код ENTER simv_b db "0000" ;сюда вводятся символы в ASCII-(1 как 31h, 2 как 32h и т.д.)
b1 db 0 |
; двоичное значение переменной b1 (сюда оно заносится после |
|
; преобразования процедурой ASCII_bin-b) |
prom dw 0 |
; рабочие ячейки процедуры ASCII_bin_b |
osh_v db 0 |
|
datasg ends |
; конец сегмента данных |
;- сегмент кода---------------------------------- |
|
codesg segment para 'Code' |
|
main proc far |
; начало процедуры |
assume cs:codesg,ds:datasg,ss:stacksg ; директива, устанавливающая соответствие
;сегментных регистров (cs, ds, ss) сегментам (ее обычный вид для EXE-программы)
;следующие строки должны быть в любой EXE-программе:
push ds |
; сохранение содержимого регистра ds в стеке (для возврата в DOS) |
xor ax,ax |
; ax:=0 |
push ax |
; ячейка в стеке для MS-DOS (требование – д.б. равна нулю) |
mov ax,datasg |
; инициализация регистра ds (заносится адрес |
mov ds,ax |
; начала сегмента данных) |
snova: |
|
mov ah,09h |
; функция вывода на экран сообщения (регистр ah=09) |
lea dx,msg_b1 |
; загрузить в dx адрес начала строки «b1= » |
int 21h |
; передача управления DOS |
mov ah,0ah |
; функция ввода с клавиатуры (ah=0ah) |
lea dx,vvod_b |
; загрузить адреса списка параметров |
int 21h |
; передача управления в DOS |
call ASCII_bin_b ; вызов процедуры преобразования из кодов ASCII в двоичный |
|
; |
(bin) для переменной, помещающейся в байт |
|
92 |
mov b1,al ;занесение полученного значения из al в ячейку памяти b1 ; проверка признака ошибки (osh_v=0 – во введенных данных нет ошибки; ; osh_v не равна (<>) нулю, означает ошибку).
cmp osh_v, 0 ; сравнение и присвоение zf:=1, если операнды равны, т.е. osh_v =0
;или zf:=0, если операнды не равны, т.е. osh_v <> 0(есть ошибка)
jz s1 |
; переход на метку s1, если флаг нуля (zf) =1 |
; |
иначе переход к следующей команде (jmp snova) |
jmp snova |
;безусловный переход на метку snova |
s1:
mov ah,09h
lea dx,msg_e ; вывод на экран сообщения “Для выхода нажмите любую клавишу!"
int 21h |
|
mov ah,0 |
; ожидание нажатия клавиши |
int 16h |
|
ret |
;возврат в DOS |
main endp |
|
;-процедуры |
----------------------------- |
ASCII_bin_b proc ;процедура перевода из ASCII в bin для байта
;(Вход: в ячейке simv_b списка параметров введенные символы (цифры!) вASCII-кодах;
;в ячейке fact_b – количество введенных символов, включая код клавиши ENTER
;выход: al= двоичное число; при вводе не цифры - osh_v :=1) xor ax,ax
xor cx,cx
mov prom,0 |
|
mov osh_v,0 |
|
mov al,fact_b |
|
mov cl,al |
|
dec al |
|
mov si,ax |
|
mov bx,1 |
|
met1_b: |
|
mov al,simv_b[si] |
|
cbw |
; преобразование байта в слово (ax:=al). Способ – распространение |
;знака (в регистре al) на старший байт слова (в регистре ax)
cmp ax,30h |
; сравнение и zf:=1, если операнды равны, т.е. ax=30h (т.е. 0011 |
0000), |
|
;и sf:=1, если ax<30h
jb error_b |
; переход на error_b, если sf=1, т.е. если ax <30h |
cmp ax,39h |
; сравнение и zf:=0, если операнды не равны (ax<>39h, т.е. 0011 1001), |
;и sf:=0, если ax>39h
ja error_b ; переход на error_b, если sf=0 и zf=0, т.е. если ax >39h
and al,0fh ; зануление четырех старших битов в байте (т.е. в регистре al) mul bx
add prom,ax mov ax,bx mov bx,10 mul bx mov bx,ax
93
dec si |
|
loop met1_b |
|
mov ax,prom |
|
jmp end_error_b |
;безусловный переход на метку end_error_b |
error_b: |
|
mov ah,09h |
; вывод на экран сообщения |
lea dx,msg_err1 |
; "Ошибка#1: ошибка ввода |
int 21h |
|
mov osh_v,1 |
; osh_v := 1 |
end_error_b: |
|
ret |
; возврат в DOS |
ASCII_bin_b endp ; endp – директива, показывающая конец процедуры ASCII_bin_b
codesg ends |
; ends – директива, показывающая конец сегмента codesg |
end main |
; end – директива, показывающая конец программы и определяющая |
; входную точку программы (точку, с которой начинается выполнение программы)
==================================================================
Пример 1.3
;lab1pr3.asm ред. 17_12_05
;РАЗРАБОТАЛ МИШУРИН А.О., СТУДЕНТ ГРУППЫ 11БИ, ИЮЛЬ 2003 ГОДА. ;Программа (работает с МП 8086) обеспечивает ввод с клавиатуры слова
;+ перевод из кодов ASCII (символы) в bin (двоичное число). ;Компиляция: tasm.exe lab1pr3.asm
;tlink.exe lab1pr3.obj
;-сегмент стека---------------------------------
stacksg segment para stack 'Stack' ; segment – директива, показывающая начало
db 128 dup(?) |
; |
сегмента с именем stacksg |
stacksg ends |
; ends – директива, показывающая конец этого сегмента |
|
;-сегмент данных---------------------------------- |
|
|
datasg segment para 'Data' |
; segment – директива, показывающая начало |
|
; |
|
сегмента с именем datasg |
msg_b1 db "b1=",0dh,0ah,"$" |
|
|
msg_w1 db "w1=",0dh,0ah,"$"
msg_e db "Для выхода нажмите любую клавишу!", 0dh,0ah,"$" msg_err1 db "Ошибка#1: ошибка ввода!", 0dh,0ah,"$"
ascval db "00000000000000000000",0dh,0ah,"$" perevod_cursora db 0dh,0ah,"$"
;строки от директивы COMMENT @ до символа @ не используются (закомментированы)
COMMENT @ vvod_b label byte maxlen_b db 4 fact_b db 0 simv_b db "0000"
@
;Список параметров для ввода переменной, значение которой вмещается в одно слово vvod_w label byte
maxlen_w db 6;максимальное кол-во символов, вводимых с клавиатуры, вкл. ENTER fact_w db 0 ;фактическое кол-во символов, вводимых с клавиатуры, вкл. код ENTER
94
simv_w db "000000" |
;сюда вводятся символы в ASCII-(‘1’ как 31h, ‘2’ как 32h и т.д.) |
b1 db 0 |
; в данном примере не используется |
w1 dw 0 |
; двоичное значение переменной w1 (сюда оно заносится после |
|
; преобразования процедурой ASCII_bin_w) |
prom dw 0 |
; рабочие ячейки процедуры ASCII_bin_w |
osh_v db 0 |
|
datasg ends |
; конец сегмента данных |
;- сегмент кода----------------------------------
codesg segment para 'Code' ; para – параграф (сегмент должен начинаться с дреса,
; |
кратного шестнадцати, т.е. на границе параграфа) |
main proc far |
; начало процедуры (main–имя процедуры; far– дальняя) |
assume cs:codesg,ds:datasg,ss:stacksg ; директива, устанавливающая соответствие
;сегментных регистров (cs, ds, ss) сегментам (ее обычный вид для EXE-программы)
;следующие строки должны быть в любой EXE-программе:
push ds |
; сохранение содержимого регистра ds в стеке (для возврата в DOS) |
|
xor ax,ax |
; ax:=0 |
|
push ax |
; ячейка в стеке для MS-DOS (требование – д.б. равна нулю) |
|
mov ax,datasg |
; инициализация регистра ds |
|
mov ds,ax |
; (заносится адрес начала сегмента данных) |
|
mov ax,0600h |
; ah=06(прокрутка), al=00(весь экран) |
|
mov bh,07 |
; нормальный атрибут (черно-белый) |
|
mov cx,0000 |
; очистка экрана верхняя левая позиция |
|
mov dx,314fh |
; |
нижняя правая позиция |
int 10h |
; передача управления в BIOS |
|
mov ah,02 |
; установка курсора |
|
mov bh,00 |
; экран 0 |
|
mov dh,00 |
; управление курсором | строка 00 |
|
mov dl,00 |
; |
столбец 00 |
int 10h |
; передача упр. в BIOS |
|
snova: |
|
|
mov ah,09h |
; функция вывода на экран сообщения (ah=09) |
|
lea dx,msg_w1 |
; загрузить адрес начала строковой переменной в dx |
|
int 21h |
; передача управления DOS |
|
mov ah,0ah |
; функция ввода с клавиатуры (ah=0ah) |
|
lea dx,vvod_w |
; загрузить адреса списка параметров |
|
int 21h |
; передача управления в DOS |
|
call ASCII_bin_w ;вызов процедуры перевода из ASCII в двоичный |
||
; |
(bin) для переменной, помещающейся в слово |
|
mov w1,ax |
;занесение полученного значения из ax в ячейку памяти w1 |
|
; проверка признака ошибки (osh_v=0 – во введенных данных нет ошибки; |
||
; |
|
osh_v не равна (<>)нулю, означает ошибку). |
cmp osh_v,0 ;сравнение и присвоение zf:=1, если операнды равны, т.е. если osh_v =0,
;если же операнды не равны, т.е. если osh_v <> 0(есть ошибка), то zf:=0
jz s1 |
; переход на метку s1, если установлен флаг нуля (zf) =1 |
; |
иначе переход к следующей команде (jmp snova) |
jmp snova |
;безусловный переход на метку snova |
s1: |
|
mov ah,02 |
; установка курсора |
|
95 |
mov bh,00 |
; экран 0 |
|
mov dh,24 |
; управление курсором | строка 24 |
|
mov dl,00 |
; |
столбец 00 |
int 10h |
; передача упр. в BIOS |
|
mov ah,09h
lea dx,msg_e ; вывод на экран сообщения
int 21h |
; "Для выхода нажмите любую клавишу!" |
mov ah,0 |
; ожидание нажатия клавиши |
int 16h |
|
ret |
; возврат в DOS |
main endp |
|
;-процедуры |
----------------------------- |
;Процедура в данном примере не используется
COMMENT @
ASCII_bin_b proc ;процедура перевода из ASCII в bin для байта
;(Вход: в ячейке simv_b списка параметров введенные символы (цифры!) вASCII-кодах;
;в ячейке fact_b – количество введенных символов, включая код клавиши ENTER
;выход: al= двоичное число; при вводе не цифры - osh_v :=1) xor ax,ax
xor cx,cx mov prom,0 mov osh_v,0
mov al,fact_b ; количество введенных символов, включая код клавиши ENTER
mov cl,al |
|
dec al |
; количество введенных символов, без кода клавиши ENTER |
mov si,ax |
|
mov bx,1 |
|
met1_b: |
|
mov al,simv_b[si]
cbw ; преобразование байта в слово (ax:=al). Способ – распространение
;знака (в регистре al) на старший байт слова (в регистре ax)
cmp ax,30h |
; сравнение и zf:=1, если операнды равны, т.е. ax=30h (т.е. 0011 0000), |
;и sf:=1, если ax<30h
jb error_b |
; переход на error_b, если sf=1, т.е. если ax <30h |
cmp ax,39h |
; сравнение и zf:=0, если операнды не равны (ax<>39h, т.е. 0011 1001), |
;и sf:=0, если ax>39h
ja error_b ; переход на error_b, если sf=0 и zf=0, т.е. если ax >39h
and al,0fh ; зануление четырех старших битов в байте (т.е. в регистре al) mul bx
add prom,ax mov ax,bx mov bx,10 mul bx mov bx,ax dec si
loop met1_b mov ax,prom jmp end_error_b
96
error_b: |
|
mov ah,09h |
; вывод на экран сообщения |
lea dx,msg_err1 |
; "Ошибка#1: ошибка ввода |
int 21h |
|
mov osh_v,1 |
; osh_v := 1 |
end_error_b: |
|
ret |
; возврат в DOS |
ASCII_bin_b endp |
; конец процедуры |
@ |
|
ASCII_bin_w proc |
;процедура перевода из ASCII в bin для слова |
;(Вход: в ячейке simv_w списка параметров введенные символы (цифры) вASCII-кодах;
;в ячейке fact_w – количество введенных символов, включая код клавиши ENTER
;выход: ax= двоичное число; при вводе не цифры – osh_v :=1) xor ax,ax
xor cx,cx mov prom,0
mov osh_v,al mov al,fact_w mov cl,al dec al
mov si,ax mov bx,1
met1_w:
mov al,simv_w[si]
cbw ; преобразование байта в слово (ax:=al). Способ – распространение
;знака (в регистре al) на старший байт слова (в регистре ax)
cmp ax,30h |
; сравнение и zf:=1, если операнды равны, т.е. ax=30h (т.е. 0011 0000), |
;и sf:=1, если ax<30h
jb error_w |
; переход на error_b, если sf=1, т.е. если ax <30h |
cmp ax,39h |
; сравнение и zf:=0, если операнды не равны (ax<>39h, т.е. 0011 1001), |
;и sf:=0, если ax>39h
ja error_w |
; переход на error_b, если sf=0 и zf=0, т.е. если ax >39h |
and al,0fh |
; зануление четырех старших битов в байте (т.е. в регистре al) |
mul bx add prom,ax mov ax,bx mov bx,10 mul bx mov bx,ax dec si
loop met1_w mov ax,prom
jmp end_error_w ; безусловный переход на метку end_error_b
error_w: |
|
mov ah,09h |
; вывод на экран сообщения |
lea dx,msg_err1 |
; "Ошибка#1: ошибка ввода |
int 21h |
|
mov osh_v,1 |
; osh_v := 1 |
|
97 |
end_error_w: |
|
ret |
; возврат в DOS |
ASCII_bin_w endp |
; конец процедуры |
; Процедура в данном примере не используется
COMMENT @
cursor proc ;процедура перевода курсора на след. строку mov ah,09
lea dx,perevod_cursora int 21h
ret cursor endp
@
codesg ends ; ends – директива, показывающая конец сегмента
end main ; end – директива, показывающая конец программы и определяющая ; входную точку программы (точку, с которой начинается выполнение программы)
;lab1pr4.asm ред. 17_12_05
;РАЗРАБОТАЛ МИШУРИН А.О., СТУДЕНТ ГРУППЫ 11БИ, ИЮЛЬ 2003 ГОДА. ;Программа (работает с МП 8086) обеспечивает ввод с клавиатуры дв. слова
; + перевод из кодов ASCII (символы) в bin (двоичное число).
;Компиляция: tasm.exe lab1pr4.asm |
|
|
; |
tlink.exe lab1pr4.obj |
|
;-сегмент стека--------------------------------- |
|
|
stacksg segment para stack 'Stack' |
; para – параграф (сегмент должен начинаться с |
|
; |
адреса, кратного шестнадцати, т.е. на границе параграфа) |
|
|
db 128 dup(?) |
;стек состоит из 128 байтов |
stacksg ends |
; конец сегмента |
|
;-сегмент данных---------------------------------- |
|
|
datasg segment para 'Data' |
;сегмент данных тоже должен начинаться на |
|
; |
|
границе параграфа |
msg_b1 db "b1=",0dh,0ah,"$" |
|
;ascval db "00000000000000000000",0dh,0ah,"$"
;perevod_cursora db 0dh,0ah,"$"
;строки от директивы COMMENT @ до символа @ не используются
COMMENT @ |
; (закомментированы) |
vvod_b label byte |
|
maxlen_b db 4 |
|
fact_b db 0 |
|
simv_b db "0000" |
|
vvod_w label byte |
|
maxlen_w db 6 |
|
fact_w db 0 |
|
simv_w db "000000" |
|
|
98 |
@
; Список параметров для ввода переменной, значение которой вмещается в дв. слово vvod_d label byte
maxlen_d db 11 ;максимальное кол-во символов, вводимых с клавиатуры, вкл. ENTER fact_d db 0 ;факт. кол-во сим-лов, вв. с клавиатуры, вкл. ENTER (заполняет MS-DOS)
simv_d db "00000000000" |
|
|
|
|
b1 db 0 |
; в данном примере не используется |
|||
w1 dw 0 |
; в данном примере не используется |
|||
prom dw 0 |
; в данном примере не используется |
|||
d1 dd 0 |
|
|
|
|
; двоичное значение переменной d1 (сюда оно заносится |
||||
; |
после преобразования процедурой ASCII_bin_d) |
|||
promd dd 0 |
; рабочие ячейки процедуры ASCII_bin_d |
|||
fml dd 0 |
|
|
|
|
osh_v db 0 |
|
|
|
|
datasg ends |
; конец сегмента данных |
;- сегмент кода----------------------------------
codesg segment para 'Code' ; para – параграф (сегмент должен начинаться с
;адреса, кратного шестнадцати, т.е. на границе параграфа)
main proc far ; начало процедуры (main – имя процедуры; far – дальняя) assume cs:codesg,ds:datasg,ss:stacksg ; директива, устанавливающая соответствие
;сегментных регистров (cs, ds, ss) сегментам (ее обычный вид для EXE-программы)
;следующие строки должны быть в любой EXE-программе:
push ds |
|
; сохранение содержимого регистра ds в стеке (для возврата в DOS) |
|||||||
xor ax,ax |
|
; ax:=0 |
|
|
|
|
|
|
|
push ax |
|
; ячейка в стеке для MS-DOS (требование – д.б. равна нулю) |
|||||||
mov ax,datasg ; инициализация регистра ds (заносится адрес |
|||||||||
mov ds,ax |
|
; начала сегмента данных) |
|||||||
;--------- |
|
|
|
|
|
|
|
|
|
mov ax,0600h |
|
;ah=06(прокрутка), al=00(весь экран) |
|||||||
mov bh,07 |
|
|
; нормальный атрибут (черно-белый) |
||||||
mov cx,0000 |
|
; очистка экрана | верхняя левая позиция |
|||||||
mov dx,314fh |
|
; |
|
нижняя правая позиция |
|||||
int 10h |
|
|
; передача управления в BIOS |
||||||
mov ah,02 ;\ |
|
|
| установка курсора |
||||||
mov bh,00 ; \ |
|
|
| экран 0 |
||||||
mov dh,00 ; управление курсором | строка 00 |
|||||||||
mov dl,00 |
; / |
|
|
| столбец 00 |
|||||
int 10h |
;/ |
|
|
| передача упр. в BIOS |
|||||
snova: |
|
|
|
|
|
|
|
|
|
mov ah,09h |
|
; функция вывода на экран сообщения (ah=09) |
|||||||
lea dx,msg_d1 |
|
; загрузить в dx адрес начала строки «d1= » |
|||||||
int 21h |
|
|
; передача управления в DOS |
|
|
||||
mov ah,0ah |
|
; функция ввода с клавиатуры (ah=0ah) |
|||||||
lea dx,vvod_d |
|
; загрузить адреса списка параметров |
|||||||
int 21h |
|
|
; передача управления в DOS |
|
|
||||
call ASCII_bin_d |
;вызов процедуры перевода из ASCII в двоичный |
||||||||
; |
|
|
(bin) для переменной, помещающейся в двойное слово |
||||||
|
|
|
|
99 |
|
|
|
|
mov word ptr d1,ax ;занесение полученного значения из ax в d1 и d1+1
mov word ptr d1+2,dx |
; и из dx в d1+2 и d1+3 |
;проверка признака ошибки (osh_v=0 – во введенных данных нет ошибки;
; |
osh_v не равна (<>)нулю, означает ошибку). |
cmp osh_v,0 ; сравнение и присвоение zf:=1, если операнды равны, т.е. osh_v =0,
;если же операнды не равны, т.е. osh_v <> 0(есть ошибка), то zf:=0 jz s1 ; переход на метку s1, если флаг нуля (zf) =1,
;иначе переход к следующей команде (jmp snova)
jmp snova ;безусловный переход на метку snova
s1: |
|
|
|
|
|
|
|
;------- |
|
|
|
|
|
|
|
mov ah,02 ;\ |
|
| установка курсора |
|||||
mov bh,00 ; \ |
| экран 0 |
||||||
mov dh,24 ; |
управление курсором | строка 24 |
||||||
mov dl,00 ; / |
| столбец 00 |
||||||
int 10h |
;/ |
|
| передача упр. в BIOS |
||||
mov ah,09h |
|
|
|
|
|
|
|
lea dx,msg_e |
|
; вывод на экран сообщения |
|||||
int 21h |
|
; "Для выхода нажмите любую клавишу!" |
|||||
mov ah,0 |
|
;ожидание нажатия клавиши |
|
||||
int 16h |
|
; |
|
|
|
|
|
ret |
|
; возврат в DOS |
main endp
;-процедуры-----------------------------
; Процедуры, которые в данном примере не используются
COMMENT @ |
|
ASCII_bin_b proc |
;процедура перевода из ASCII в bin для байта |
ASCII_bin_w proc |
;процедура перевода из ASCII в bin для слова |
@ |
|
ASCII_bin_d proc ;процедура перевода из ASCII в bin для дв. слова для МП 8086 ; выход: =число в bin)
;(Вход: в ячейке simv_d списка пар-ров введенные символы (цифры!) в ASCII-кодах;
;в ячейке fact_d – количество введенных символов, включая код клавиши ENTER
;выход: dx:ax = двоичное число; при вводе не цифры – osh_v :=1) xor ax,ax
xor bx,bx xor cx,cx
mov word ptr promd,0 mov word ptr promd+2,0 mov word ptr fml+2,0 mov word ptr fml,1 mov osh_v,0
mov al,fact_d
mov cl,al dec al mov si,ax
met1_d:
mov bl,simv_d[si]
100