epd627
.pdfПродолжение прил. 1.2 ;перевод введенных данных из ASCII-кодов в двоичный код (вызвать процедуру
ASCII_binb)
;результат преобразования (двоичный код) процедура помещает в регистр al ;занесение двоичного значения из регистра al в ячейку памяти с символьным именем b1
;***************************************************************************
;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b2
;***************************************************************************
;вывод на экран сообщения: 'b2= '
;ввод с клавиатуры (функция 0ah) значения переменной b2 в field_b списка параметров vvod_b
;перевод введенных данных из ASCII-кодов в двоичный код (вызвать процедуру
ASCII_binb)
;результат преобразования (двоичный код) процедура помещает в регистр al ;занесение двоичного значения в ячейку памяти с символьным именем b2
;***************************************************************************
;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа w1
;***************************************************************************
;вывод на экран сообщения: 'w1= '
;ввод с клавиатуры (функция 0ah) значения переменной w1 в field_w списка параметров vvod_w
;перевод введенных данных из ASCII-кодов в двоичный код (вызвать процедуру
ASCII_binw)
;результат преобразования (двоичный код) процедура помещает в регистр ax ;занесение двоичного значения из ax в ячейку памяти с символьным именем w1
;***************************************************************************
;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа w2
;***************************************************************************
;вывод на экран сообщения: 'w2= '
;ввод с клавиатуры (функция 0ah) значения переменной w2 в field_w списка параметров vvod_w
;перевод введенных данных из ASCII кодов в двоичный код (вызвать процедуру
ASCII_binw)
;занесение двоичного значения в ячейку памяти с символьным именем w2
;***************************************************************************
;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа d1
;***************************************************************************
;вывод на экран сообщения: 'd1= '
;ввод с клавиатуры значения (функция 0ah) переменной d1 в ячейку в field_d списка параметров vvod_d
;перевод введенных данных из ASCII-кодов в двоичный код (вызвать процедуру
ASCII_bind)
;результат преобразования (двоичный код) процедура помещает в регистры (dx:ax)
;занесение переведённого значения (двойное слово) из регистров (dx:ax) в d1
;***************************************************************************
; вычисление по формуле |
<формула>, например, d1-(b1+ w1/b2)*w2 |
; вычисление w1/b2 |
|
|
121 |
Окончание прил. 1.2
;вычисление b1+ w1/b2
;вычисление (b1+ w1/b2)*w2
;вычисление d1-(b1+ w1/b2)*w2
;Вывод результата на экран
; Результат из двоичного кода перевести в код ASCII (вызвать процедуру bin_ascii )
;Вывод на экран сообщения «Результат равен = »
;Вывод на экран полученного в результате вычисления значения (в коде ascii)
; выход из главной процедуры (возврат в DOS, команда ret)
;Конец главной процедуры (директива endp)
;Процедуры, вызываемые из главной процедуры
;=================================================================== ;ASCII_binb ;процедура перевода из ASCII в bin для байта
;Вход: список параметров vvod_b должен быть заполнен
;Выход:al = двоичное число
;Начало процедуры (директива proc)
;Тело процедуры
;Конец процедуры (директива endp) ;=================================================================== ;ASCII_binw ;процедура перевода из ASCII в bin для слова
;Вход: список параметров vvod_w должен быть заполнен
;Выход:ax = двоичное число
;Начало процедуры (директива proc)
;Тело процедуры
;Конец процедуры (директива endp) ;=================================================================== ;ASCII_bind ;процедура перевода из ASCII в bin для двойного слова
;Вход: список параметров vvod_d должен быть заполнен
;Выход:dx:ax = двоичное число
;Начало процедуры (директива proc)
;Тело процедуры
;Конец процедуры (директива endp) ;===================================================================
;bin_ascii ;процедура перевода из bin в ASCII
;Вход: rezult = двоичное число
;Выход:ascval = число в кодах ascii
;Начало процедуры (директива proc)
;Тело процедуры
;Конец процедуры (директива endp)
;Конец сегмента кода (директива ends)
;Конец программы (директива end)
122
Приложение 1.3
Пример лабораторной работы №1
;Лабораторная работа №1
;ВЫПОЛНЕНА СТУДЕНТОМ ГРУППЫ ЗИ-103 СЫРВАЧЕВЫМ АЛЕКСЕЕМ
;тема: «Определение данных. Операции двоичной арифметики. Экранные операции»
;вычисление по формуле w1*w2-w3/b1+d1+b2
;г. Омск, СибАДИ, Сургутский филиал, октябрь 2003 г.
;Ограничения: не вводить отрицательных чисел;
;не получать отрицательный результат.
;Сегмент стека
;Начало сегмента стека (директива segment)
stacksg segment para stack 'Stack' ; резервирование 1024 ячеек памяти под стек db 1024 dup (?)
;Конец сегмента стека (директива ends) stacksg ends
; Сегмент данных
;Начало сегмента данных (директива segment) datasg segment para 'Data'
;ячейки памяти b1, b2,…,bm, определенные директивой db; b1 db 0
b2 db 0
;ячейки памяти w1, w2,…,wn, определенные директивой dw;
w1 dw 0
w2 dw 0
w3 dw 0
;ячейки памяти d1, d2,…,dk, определенные директивой dd; d1 dd 0
;списки параметров для ввода с клавиатуры значений, занимающих
;один байт, т.е. значений b1, b2,
;список параметров vvod_b (поле для символов - field_b); vvod_b label byte
max_b db 4 fact_b db 0 field_b db '0000','$'
;одно слово (w1, w2)
;список параметров vvod_w (поле для символов - field_w); vvod_w label byte
max_w db 7 fact_w db 0
field_w db '0000000','$'
двойное слово (d1)
;список параметров vvod_d (поле для символов - field_d); vvod_d label byte
max_d db 9 fact_d db 0
field_d db '000000000','$'
;ячейки памяти, используемые процедурами ascii_binb, ascii_binw, ascii_bind и bin_ascii.
123
ascval db "00000000000000000000","$" binval db 0
asclen db 20 mult10 db 1 binval_w dw 0
; поле переведённых данных ;результат преобразования ;длина введенного символьного числа ;фактор умножения
;символьные константы (тексты сообщений, выдаваемых на экран) soob_p db 'Здравствуйте, уважаемый пользователь',0dh,0ah,'$'
soob_f db 'Программа вычисляет по формуле w1*w2-w3/b1+d1+b2',0ah,0dh,'$' s_b1 db 'Введите b1',0ah,0dh,'$'
s_b2 db 'Введите b2',0ah,0dh,'$' s_w1 db 'Введите w1',0ah,0dh,'$' s_w2 db 'Введите w2',0ah,0dh,'$' s_w3 db 'Введите w3',0ah,0dh,'$' s_d1 db 'Введите d1',0ah,0dh,'$'
soob_o db 'Ответ будет равен:',0ah,0dh,'$'
soob_vixod db "Для выхода нажмите любую клавишу","$" soob db 'До свидания',0ah,0dh,'$'
perevod_cursora db 0dh,0ah,"$"
oshibka_v db "Ошибка ввода!(введите другое число)","$"
;ячейки промежуточных результатов
rez1 dd 0 rez2 dd 0 rez3 dd 0 rez4 dd 0 rezult dq 0 kol dq 0 osh_v db 0 prom dw 0 promd dd 0 fml dd 0 stroka db 2
;Конец сегмента данных (директива ends) datasg ends
;Сегмент кода
;Начало сегмента кода (директива segment) codesg segment para 'Code'
;Начало главной процедуры (директива proc)
begin proc far
; Директива, устанавливающая соответствие сегментных регистров сегментам
; (директива assume)
assume cs:codesg,ds:datasg,ss:stacksg
; Команды, которые должны быть в любой EXE-программе push ds
xor ax,ax push ax
mov ax,datasg mov ds,ax
;очистка экрана
124
mov ax,0600h |
;\ |
| ah=06(прокрутка), al=00(весь экран) |
mov bh,02 |
; \ |
| нормальный атрибут (черно-белый) |
mov cx,0000 ; очистка экрана | верхняя левая позиция |
||
mov dx,314fh |
; / |
| нижняя правая позиция |
int 10h |
;/ |
| передача управления в BIOS |
mov ah,02 |
;\ |
| установка курсора |
mov bh,00 |
; \ |
| экран 0 |
mov dh,01 ; |
управление курсором | строка 01 |
|
mov dl,00 |
; / |
| столбец 00 |
int 10h |
;/ |
| передача упр. в BIOS |
;Вывод на экран сообщения 'Привет, пользователь!' |
||
mov ah,09 |
|
;Вывод приветствия |
lea dx,soob_p |
|
|
int 21h |
|
|
formula1:
;Вывод на экран сообщения 'Эта программа производит вычисления по формуле
; |
d1 - (b1+ w1/b2)*w2’ |
mov ah,09 |
;Вывод формулы d1 - (b1+ w1/b2)*w2’ |
lea dx,soob_f |
|
int 21h |
|
;Ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b1
;вывод на экран сообщения: 'b1= '
povtor_b1:
mov ah,09 ;вывод сообщения 'b1= ' mov osh_v,0
lea dx,s_b1 int 21h
; Ввод с клавиатуры (функция 0ah) значения b1 в field_b списка параметров vvod_b mov ah,0ah
lea dx,vvod_b int 21h
;Перевод введенных данных из ASCII-кодов в двоичный код call ASCII_bin_b
;Результат преобразования (двоичный код) процедура помещает в регистр al ;Занесение двоичного значения из al в ячейку памяти с символьным именем b1
mov b1,al mov prom,0 call cursor cmp osh_v,0 je ii2
jmp povtor_b1
;Ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b2 ii2:
povtor_b2:
; Вывод на экран сообщения: 'b2= ' mov ah,09
mov osh_v,0 lea dx,s_b2
125
int 21h
; Ввод с клавиатуры (функция 0ah) значения b2 в field_b списка параметров vvod_b mov ah,0ah
lea dx,vvod_b int 21h
;Перевод введенных данных из ASCII-кодов в двоичный код call ASCII_bin_b
;Результат преобразования (двоичный код) процедура помещает в регистр al ;Занесение двоичного значения в ячейку памяти с символьным именем b2
mov b2,al mov prom,0 call cursor cmp osh_v,0 jz ii3
jmp povtor_b2
;Ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа w1 ii3:
povtor_w1:
;Вывод на экран сообщения: 'w1= ' mov ah,09
mov osh_v,0 lea dx,s_w1 int 21h
;Ввод с клавиатуры (функция 0ah) значения переменной w1 в field_w списка vvod_w mov ah,0ah
lea dx,vvod_w int 21h
;Перевод введенных данных из ASCII-кодов в двоичный код
call ASCII_bin_w
;Результат преобразования (двоичный код) процедура помещает в регистр ax
; Занесение двоичного значения из ax в ячейку памяти с символьным именем w1 mov word ptr w1,ax
mov prom,0 call cursor cmp osh_v,0 jz ii4
jmp povtor_w1
;Ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа w2 ii4:
povtor_w2:
;Вывод на экран сообщения: 'w2= ' mov ah,09
mov osh_v,0 lea dx,s_w2 int 21h
;Ввод с клавиатуры (функция 0ah) значения w2 в field_w списка параметров vvod_w mov ah,0ah
lea dx,vvod_w
126
int 21h
;Перевод введенных данных из ASCII в двоичный код (процедура ASCII_binw) call ASCII_bin_w
;Занесение двоичного значения из ax в ячейку памяти с символьным именем w2 mov w2,ax
mov prom,0 call cursor cmp osh_v,0 jz ii6
jmp povtor_w2
;Ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа d1 ii6:
povtor_d1:
;Вывод на экран сообщения: 'd1= ' mov ah,09
mov osh_v,0 lea dx,s_d1 int 21h
;Ввод с клавиатуры значения d1 в ячейку в field_d списка параметров vvod_d mov ah,0ah
lea dx,vvod_w int 21h
;Перевод введенных данных из ASCII-кодов в двоичный код
call ASCII_bin_w
;Результат преобразования (двоичный код) процедура помещает в регистры (dx:ax)
;Занесение переведённого значения (двойное слово) из регистров (dx:ax) в d1 mov word ptr d1,ax
mov word ptr d1+2,dx mov prom,0
call cursor cmp osh_v,0 jz ii7
jmp povtor_d1 |
|
|
ii7: |
d1-(b1+ w1/b2)*w2’ |
|
; Вычисление по формуле |
||
;1. Деление w1/b2 |
|
|
xor dx,dx |
; dx := 0 |
|
xor bx,bx |
; bx := 0 |
|
mov ax,w1 |
; ax :=w1 |
|
mov bl,b2 |
; bx := b2 |
|
div bx |
; ax :=w1/b2 |
dx:= остаток от деления |
mov word ptr rez2,ax |
; rez2 :=w1/b2 |
(слово) |
;2. Сложение b1+ w1/b2 |
|
|
mov al,b1 |
; al := b1 |
|
cbw |
; ax := b1 |
|
xor dx,dx |
; dx := 0 |
|
add ax, rez2 |
|
|
|
|
127 |
adc dx,0 |
;учесть перенос, после этого (dx:ax) := b1+ w1/b2 |
mov word ptr rez3,ax |
|
mov word ptr rez3+2,dx |
; rez3:= b1+ w1/b2 (двойное слово) |
3. Умножение rez3*w2 [3, с. 311-312] |
|
mov ax,word ptr res3 |
; ax:=мл.слово res3 |
mul w2 |
; (dx:ax) := мл.слово res3*w2 |
mov word ptr rezult,ax |
|
mov word ptr rezult+2,dx |
|
mov word ptr result+4,0 |
|
mov word ptr rezult+6,0 |
; rezult := мл.слово res3*w2 |
mov ax,word ptr res3+2 |
; ax:=ст.слово res3 |
mul w2 |
; (dx:ax) := ст.слово res3*w2 |
add word ptr result+2,ax adc word ptr rezult+4,dx adc word ptr result+6,0
mov word ptr rezult+6,0 ; rezult := res3*w2 = (b1+ w1/b2)*w2 (учетверен. слово) ;4 .Вычитание d1 - rezult
mov ax,word ptr d1 mov dx,word ptr d1+2 xor cx,cx
xor bx,bx
sub ax,result sbb dx,result+2 sbb cx,result+4
; учесть заем из старших разрядов: sbb bx,result+6
mov word ptr rezult,ax mov word ptr result+2,dx mov word ptr result+4,cx
mov word ptr result+6,bx ; rezult := = d1 - (b1+ w1/b2)*w2 (учетверенное слово
;Вывод результата на экран
;Результат из двоичного кода перевести в код ASCII (вызвать процедуру bin_ascii ) call bin_ASCII ;вызов процедуры перевода из bin в ASCII
;Вывод на экран сообщения «Результат равен = »
mov ah,09h ; lea dx,soob_o ; int 21h ;
; Вывод на экран полученного в результате вычисления значения (в коде ascii)
mov ah,09h |
|
lea dx,ascval |
|
int 21h |
|
call cursor |
|
mov ah,0 |
;-ожидание нажатия клавиши |
int 16h |
|
|
128 |
;Выход из главной процедуры (возврат в DOS, команда ret) ret
;Конец главной процедуры (директива endp)
begin endp
;
;Процедуры, вызываемые из главной процедуры
;=================================================================== ;ASCII_binb ;процедура перевода из ASCII в bin для байта
;Начало процедуры (директива proc)
ASCII_bin_b proc ;процедура перевода из ASCII в bin для байта
;Вход: список параметров vvod_b должен быть заполнен;
;Выход: al=число в bin
;
; Тело процедуры xor ax,ax xor cx,cx mov prom,ax mov osh_v,al mov al,fact_b mov cl,al dec al
mov si,ax mov bx,1
met1_b:
mov al,field_b[si] cbw
cmp ax,30h jb error_b cmp ax,39h ja error_b and al,0fh 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
error_b:
call cursor mov ah,09h
lea dx,oshibka_v int 21h
mov osh_v,1
129
end_error_b: ret
ASCII_bin_b endp ; конец процедуры (директива endp) ;=================================================================== ;ASCII_binw ;процедура перевода из ASCII в bin для слова
;Вход: список параметров vvod_w должен быть заполнен
;Выход:ax = число в bin
ASCII_bin_w proc
; Тело процедуры xor ax,ax xor cx,cx mov prom,ax mov osh_v,al mov al,fact_w mov cl,al dec al
mov si,ax mov bx,1
met1_w:
mov al,field_w[si] cbw
cmp ax,30h jb error_w cmp ax,39h ja error_w and al,0fh 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
error_w:
call cursor mov ah,09h
lea dx,oshibka_v int 21h
mov osh_v,1 end_error_w:
ret
ASCII_bin_w endp ; конец процедуры (директива endp) ;=================================================================== ;ascii_bind ;процедура перевода из ASCII в bin для двойного слова
; Вход: список параметров vvod_d должен быть заполнен
130