Материал: 1117

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

msg_w1 db "w1=",0dh,0ah,"$" msg_d1 db "d1=","$"
msg_e db "Для выхода нажмите любую клавишу!", 0dh,0ah,"$" msg_err1 db "Ошибка#1: ошибка ввода!", 0dh,0ah,"$"
==================================================================
Пример 1.4

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

Источник: https://studfile.net/preview/16407174/