Преобразовать в BCD-формат(уп.) и сложить - Assembler

Узнай цену своей работы

Формулировка задачи:

Я написал программу по примерам, но это, как я понял, ещё не упак. числа. Я начал углублённо изучать ассемблер, но у нас через каждые 2 недели лабы, и я тупо не успеваю читать и писать одновременно(ассемблер пока ещё худо даётся) (учусь по-вашему электронному учебнику кстати, спасибо большое). В общем нужно сложить 2 10-ти разрядных числа упакованных в BCD и вывести рез. на экран. Проблема в том, что осталось их упаковать. Или сложение там тоже как-то поменяется?
;.386
.model SMALL
 
stack 100h
 
    DATASEG
 
NEGA  dB 0  
SEN_1 dB 0Ah,0Dh,'First num:$'      ;Вывод предложения ввода первого числа
BUF_1 dB 11                         ;Буфер первого числа
LEN_1 dB ?                          ;Само число
Opnd1 dB 12 dup( ? )
 
SEN_2 dB 0Ah,0Dh,'Second num:$'     ;Вывод предложения ввода второго числа
BUF_2 dB 11                         ;Буфер второго числа
LEN_2 dB ?                          ;Само число
Opnd2 dB 12 dup( ? )
 
ANSWER dB 0Ah, 0Dh, 'Sum '
 
Res dB 12 dup(' '),'$'
 
SEN_SUM dB 0Ah,0Dh
 
dB 'Complete work - Esc, continue - another key'
 
dB '$'
 
CODESEG
 
STARTUPCODE
 
PUSH DS
 
POP ES ; ES <- DS
 
    BEGIN:
 
;Ввод первого слагаемого
 
        B1: 
            LEA DX, SEN_1
            MOV AH, 09h
            INT 21h
            
            LEA DX, BUF_1
            MOV AH, 0Ah
            INT 21h
 
            CMP LEN_1, 0
            JE  B1
 
;проверка 0-9 и очистка старш.тетрады
 
        LEA BX, Opnd1
        XOR CX, CX
        MOV CL, LEN_1
        XOR SI, SI
 
        T1: 
            MOV AL, [BX][SI]
            ;CMP AL, '-'
            ;JE     H
            ;JNZ S
            ;H:
            ;   ADD NEGA, 1
            ;S:
                CMP AL, '0'
                JB  B1          ; ошибка
                CMP AL, '9'
                JA  B1          ; ошибка
                AND AL, 0Fh
                MOV [BX][SI], AL
                INC SI
        LOOP T1
 
;прижать к правому краю
 
        MOV CL, LEN_1
        CMP CL, 10
        JE  E1
        MOV DI, 9
        MOV SI, CX
        DEC SI
 
        P1: 
            MOV AL, [BX][SI]            
            MOV [BX][DI], AL
            DEC DI
            DEC SI
        LOOP P1
 
;обнулить лишнее
 
        XOR DI, DI
        MOV CL, 10
        SUB CL, LEN_1
 
        N1: 
        MOV byte ptr [BX][DI], 0
        INC DI
        LOOP N1
 
        E1:
 
;Ввод второго слагаемого
 
            B2: 
                LEA DX, SEN_2
                MOV AH, 09h
                INT 21h
 
                LEA DX, BUF_2
                MOV AH, 0Ah
                INT 21h
 
                CMP LEN_2, 0
                JE  B2
 
;проверка 0-9 и очистка старш.тетрады
 
            LEA BX, Opnd2
            XOR CX, CX
            MOV CL, LEN_2
            XOR SI, SI
 
            T2: 
                MOV AL, [BX][SI]
                CMP AL, '0'
                JB  B2          ; ошибка
 
                CMP AL, '9'
                JA  B2          ; ошибка
 
                AND AL, 0Fh
                MOV [BX][SI], AL
                INC SI
            LOOP T2
 
;прижать к правому краю
 
            MOV CL, LEN_2
            CMP CL, 10
            JE  E2
            MOV DI, 9
            MOV SI, CX
            DEC SI
 
            P2: 
                MOV AL, [BX][SI]
                MOV [BX][DI], AL
                DEC DI
                DEC SI
            LOOP P2
 
;обнулить лишнее
 
            XOR DI, DI
            MOV CL, 10
            SUB CL, LEN_2
 
            N2: 
                MOV byte ptr [BX][DI], 0
                INC DI
            LOOP N2
 
    E2:
 
;Сложение
 
        MOV CX, 10
 
        CLC
        LEA SI, Opnd1+9
        LEA DI, Opnd2+9
        LEA BX, Res+10
 
        A1: 
            MOV AL, [SI]
            ADC AL, [DI]
 
        AAA
        MOV [BX], AL
        DEC SI
        DEC DI
        DEC BX
    LOOP A1
 
    MOV AL, 0
    ADC AL, 0
    MOV [BX], AL
 
;Преобразование результата в ASCII
 
    MOV CX, 11
 
    A2: 
        OR BYTE PTR [BX], 30h ;Интерпритировать данный операнд в байт
        INC BX
    LOOP A2
 
;Вывод результата
 
    LEA DX, ANSWER
    MOV AH, 09h
    INT 21h
 
;Запрос на продолжение работы
 
    LEA DX, SEN_SUM
    MOV AH, 09h
    INT 21h
 
    MOV AH, 08h
    INT 21h
 
    CMP AL, 27 ;ESC
    JE  QUIT
 
    JMP BEGIN
 
;Конец работы
 
QUIT: EXITCODE 0
 
END

Решение задачи: «Преобразовать в BCD-формат(уп.) и сложить»

textual
Листинг программы
1
2
3
4
5
6
7
8
9
10

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


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

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

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