
Добавил:
student_tipo
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:лабораторная работа / лабораторные работы по ASSAMBLER / uslovnye_i_bezuslovnye_perehody
.txt ; Сегмент стека
Sseg SEGMENT STACK 'stack'
DB 256 DUP (?)
Sseg ENDS
; Сегмент данных
Dseg SEGMENT 'data'
v dw ?
p db ?
mess db "Enter the number in b. s.",0Dh, 0Ah,'$'
mes2 db "Result: ",0Dh, 0Ah,'$'
er_m db "Incorrect data"
crlf db 0Dh,0Ah,'$'
bln dw ?
buff db 16
Dseg ENDS
; Сегмент кода
Cseg SEGMENT 'code'
ASSUME CS:Cseg, DS:Dseg, SS:Sseg
; Головная подпрограмма
Main PROC FAR
; Подготовимся к возврату в операционную систему
PUSH DS
MOV AX, 0
PUSH AX
; Настроим DS на наш сегмент данных
MOV AX, Dseg
MOV DS, AX
; Делаем вычисления
mov ax,0003h
int 10h
mov dx,offset mess
mov ah,9
int 21h
mov dx,offset buff
mov ah,0Ah
int 21h ; считать строку символов в буфер
mov dx,offset crlf
mov ah,9
int 21h ; перевод строки
; перевод числа в ASCII-формате из буфера в бинарное число в АХ
mov ax,0000
mov di,0
mov cl,buff+1
xor ch,ch
xor bx,bx
mov si,cx; SI - длина буфера
shx:
xor ax,ax
mov al,buff+2+di
sub al,'0' ; цифра = код цифры - код символа "0",
jb a_er ; если код символа был меньше, чем код "0",
cmp al,1 ; или больше, чем "1",
ja a_er ; выйти из программы с сообщением об ошибке,
dec cx
shl ax,cl
add bx,ax
inc di ; увеличить счетчик
cmp di,si ; если счетчик+1 меньше числа символов -
jb shx ; продолжить (счетчик считается от 0)
mov v,bx
mov ax,0
mov cx,10h
Cycle: test bx,1
jz ef
inc ax
ef: sar bx,1
jz ec
loop Cycle
ec: mov p,al
xor ax,ax
xor bx,bx
mov ah,9
mov dx,offset mes2
int 21h
mov bl,48
mov al,57
add bl,p
cmp al,bl
jnc hex
add p,55
mov al,p
int 29h
jmp finish
hex: add p,48
mov al,p
int 29h
; Передача управления первому оператору в PSP
finish: RET
a_er: mov dx,offset er_m
mov ah,9
int 21h
RET
Main ENDP
Cseg ENDS
END Main
Sseg SEGMENT STACK 'stack'
DB 256 DUP (?)
Sseg ENDS
; Сегмент данных
Dseg SEGMENT 'data'
v dw ?
p db ?
mess db "Enter the number in b. s.",0Dh, 0Ah,'$'
mes2 db "Result: ",0Dh, 0Ah,'$'
er_m db "Incorrect data"
crlf db 0Dh,0Ah,'$'
bln dw ?
buff db 16
Dseg ENDS
; Сегмент кода
Cseg SEGMENT 'code'
ASSUME CS:Cseg, DS:Dseg, SS:Sseg
; Головная подпрограмма
Main PROC FAR
; Подготовимся к возврату в операционную систему
PUSH DS
MOV AX, 0
PUSH AX
; Настроим DS на наш сегмент данных
MOV AX, Dseg
MOV DS, AX
; Делаем вычисления
mov ax,0003h
int 10h
mov dx,offset mess
mov ah,9
int 21h
mov dx,offset buff
mov ah,0Ah
int 21h ; считать строку символов в буфер
mov dx,offset crlf
mov ah,9
int 21h ; перевод строки
; перевод числа в ASCII-формате из буфера в бинарное число в АХ
mov ax,0000
mov di,0
mov cl,buff+1
xor ch,ch
xor bx,bx
mov si,cx; SI - длина буфера
shx:
xor ax,ax
mov al,buff+2+di
sub al,'0' ; цифра = код цифры - код символа "0",
jb a_er ; если код символа был меньше, чем код "0",
cmp al,1 ; или больше, чем "1",
ja a_er ; выйти из программы с сообщением об ошибке,
dec cx
shl ax,cl
add bx,ax
inc di ; увеличить счетчик
cmp di,si ; если счетчик+1 меньше числа символов -
jb shx ; продолжить (счетчик считается от 0)
mov v,bx
mov ax,0
mov cx,10h
Cycle: test bx,1
jz ef
inc ax
ef: sar bx,1
jz ec
loop Cycle
ec: mov p,al
xor ax,ax
xor bx,bx
mov ah,9
mov dx,offset mes2
int 21h
mov bl,48
mov al,57
add bl,p
cmp al,bl
jnc hex
add p,55
mov al,p
int 29h
jmp finish
hex: add p,48
mov al,p
int 29h
; Передача управления первому оператору в PSP
finish: RET
a_er: mov dx,offset er_m
mov ah,9
int 21h
RET
Main ENDP
Cseg ENDS
END Main
Соседние файлы в папке лабораторные работы по ASSAMBLER