Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

epd627

.pdf
Скачиваний:
22
Добавлен:
02.05.2015
Размер:
816.97 Кб
Скачать

Продолжение прил. 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]