Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСПЕКТ ЛЕКЦИЙ ПО АССЕМБЛЕРУ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
471.55 Кб
Скачать

Процедура ввода числа форматом слово

Вычисления в процедуре реализованы по схеме Горнера. Например, число 4851 формируется следующим образом.

АХ:=0. Это начальное значение сумматора.

(((АХ*10+4)*10+8)*10+5)*10+1 =4851. перевод выполняется со старших разрядов числа.

Процедура read входных параметров не имеет. Результат возвращается в регистре AХ.

;Процедура ввода числа формата intger

;Для перевода используется схема Горнера

stak segment STACK 'STACK'

db 64 dup(?)

stak ends

data segment

Bl_Param label byte

len db 7

act db ?

num db 7 dup(?)

c10 dw 10

Msg db 'Ошибка, повторите ввод',13,10,'$'

Ent db 13,10,'$'При выводе курсор переходит в начало след.строки

Sign db ?

data ends

code SEGMENT

assume ss:stak,ds:data,cs:code

start proc far

;--------------Возврат в dos

push ds

sub ax,ax

push ax

;--Занесение в регистр ds адреса сегмента данных

mov ax,data

mov ds,ax

;--------------Начало программы

call read

mov ax,ax ;а

st_ret: ret

start endp

read proc near

push bx cx dx si

M_Beg:

;Ввод числовой строки

mov ah,0ah

lea dx,Bl_param

int 21h

mov ah,09h

lea dx,Ent

int 21h

mov Sign,-1;Знак числа не определен

mov si,0

;Цикл прохода по числовой строке до первой цифры числа

;Определяется знак числа

c1:

cmp act,0

je M_Err

cmp Sign,-1

jne M_c2

cmp num[si],' '

je M1_c1

cmp num[si],'-'

jne M2_c1

mov Sign,1; Знак отрицательный

jmp M1_c1

M2_c1:

mov Sign,0; Знак положительный

cmp num[si],'+'

je M1_c1

jmp c1

M1_c1:

inc si

dec act

jmp c1

;Сообщение об ошибке и переход в начало для повторного ввода

M_Err:

mov ah,09h

lea dx,Msg

int 21h

jmp M_Beg

; Теперь num[si] указывает на первую цифру числа. Выполним перевод числа

; в машинное представление, используя схему Горнера.

M_c2:

mov ax,0

mov cx,0

mov cl,act;В СХ количество цифр числа

C2:

imul c10

jo M_Err

cmp num[si],'0'

jb M_Err

cmp num[si],'9'

ja M_Err

mov bl,num[si];Код символа в BL преобразуем

and bx,000Fh; в число

add ax,bx

jo M_Err

inc si

loop c2

cmp Sign,1;Если число отрицательное

jne M_exit; меняем знак

neg ax ; на противоположный.

M_exit:

pop si dx cx bx

ret

read endp

code ends

end start