Вычитание 20-значных чисел - Assembler
Формулировка задачи:
Помогите,пожалуйста.
Задача: ввести два 20-значных числа,вычесть,используя AAA,DAS,AAS или DAA,и вывести на экран. (в программе использовать процедуру).
Буду ооочень благодарна.
Решение задачи: «Вычитание 20-значных чисел»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- MaxLen equ 20
- First db MaxLen dup(0)
- Second db MaxLen dup(0)
- Third db MaxLen dup(0)
- Asciiz1 db '9876543210', 0
- Asciiz2 db '1234567890', 0
- .code
- ;переводит ASCIIZ строку в длинное число формата BCD
- ;вход
- ; ds:si - ASCIIZ строка
- ;выход
- ; ds:di - длинное число формата BCD little-endian
- AsciizToBcd proc
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- mov cx, 0
- @@ScanEndOfStr:
- mov al, [si]
- test al, al
- jz @@Break
- inc si
- inc cx
- jmp @@ScanEndOfStr
- @@Break:
- jcxz @@Zero
- dec si
- @@Convert:
- mov al, [si]
- sub al, '0'
- mov [di], al
- inc di
- dec si
- loop @@Convert
- @@Zero:
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- AsciizToBcd endp
- ;Показать длинное BCD на экран
- ;вход
- ; ds:si - начало числа
- ShowBcd proc
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- mov cx, MaxLen
- add si, cx
- dec si
- @@SkipLeadingZero:
- mov al, [si]
- test al, al
- jnz @@Write
- dec si
- loop @@SkipLeadingZero
- @@Write:
- mov al, [si]
- add al, '0'
- int 29h
- dec si
- loop @@Write
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- ShowBcd endp
- ;Вычитанеи длинных BCD
- ;вход
- ; si - уменьшаемое
- ; di - вычитаемое
- ;выход
- ; bx - разность
- SubBcd proc
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- mov cx, MaxLen
- mov ah, [si]
- @@SubLoop:
- mov al, ah
- mov ah, [si+1]
- sub al, [di]
- aas
- mov [bx], al
- inc si
- inc di
- inc bx
- loop @@SubLoop
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- SubBcd endp
- main proc
- mov ax, @data
- mov ds, ax
- lea si, Asciiz1
- lea di, First
- call AsciizToBcd
- lea si, First
- call ShowBcd
- mov al, 13
- int 29h
- mov al, 10
- int 29h
- lea si, Asciiz2
- lea di, Second
- call AsciizToBcd
- lea si, Second
- call ShowBcd
- mov al, 13
- int 29h
- mov al, 10
- int 29h
- lea si, First
- lea di, Second
- lea bx, Third
- call SubBcd
- lea si, Third
- call ShowBcd
- mov ax, 4C00h
- int 21h
- main endp
- end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д