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