Вычитание 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы