Написать программу сложения двух 32-разрядных двоичных чисел - Assembler

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

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

День добрый, подскажите почему не могу посмотреть конечный результат(окно закрывается) и почему в конце работы программы выдает "terminated exit code 0". Используется tasm 1.4 for win 7. Все ли правильно и можно ли как-то оптимизировать код?
.MODEL  SMALL           ;модель оперативной пам¤ти
.STACK  100h            ;адрес стека
.DATA               ;сегмент данных программы
msg1    db 0dh,0ah, 'Enter A: $'
msg2    db 0dh,0ah, 'Enter B: $'
msg4    db 0dh,0ah, 'Result: $'
 
ten dd 02h
 
_a  dd ?
_b  dd ?
suma    dd ?
 
    .CODE               ;начало сегмента кода
    .386
 
start:
    mov ax,@data
    mov ds,ax           ; загрузка сегментного регистра DS
    mov ah,09h
    mov DX,offset msg1      ;ј адрес выводимого сообщения должен быть в DX
    int 21h         ; вывод сообщения
    mov cx,32           ;разрядность
    call    cgetbin
    mov [_a], eax
    mov ah,09h
    mov DX,offset msg2      ;ј адрес выводимого сообщения должен быть в DX
    int 21h         ; вывод сообщения
    call    cgetbin
;   mov [_b], eax
    add eax, [_a]
    mov [suma], eax
    push    eax
    mov ah,09h
    mov DX,offset msg4      ;ј адрес выводимого сообщения должен быть в DX
    int 21h         ; вывод сообщения
    pop eax
    call    _cputbin
;   pop [suma]
    mov ax,4c00h        ;пересылка 4c00h в регистр ax
    int 21h         ;вызов прерывания с номером 21
    ret
; двоичный вывод EAX на консоль
_cputbin:
;   push    eax
    mov ebx, eax
    mov cx,32
@B: xor al, al
    rcl ebx,1
    adc al, '0'
    int 29h
    loop    @B
    mov al, 'B'
    int 29h
    ret
; ввод с консоли двоичного числа с отработкой удаления символа
; на входе: CX - кол-во цифр
; на выходе: EAX - введенное число или -1, если нажат <ESC>, а также CY=1
cgetbin: pushad
    xor edx, edx
    mov ebp, edx
    mov ebx, ecx
@l:
    call    getch
    or  al,al
    jz  @l
    cmp al, 1Bh         ; <ESC>?
    jz  cancel
    cmp al, 0Dh         ; <Enter>?
    jz  done
    cmp al, 08h         ; <BkSp>?
    jnz @4
    call    rubout
    jmp @l
@4:     cmp al, 30h
    jb  @l
    cmp al, 31h
    ja  @l
    movzx   eax,al          ; убираем из eax лишнее
    shl edx, 1
    bt  ax,0
    adc edx,0
    int 29h
    loop    @l
; выход
done:       mov eax, edx        ;
    or  ebp, ebp
    jz  @5
    neg eax
@5:     clc
    jmp ex
; отмена, взводим Carry(CY), EAX = -1
cancel:;     xor eax, eax
;   dec eax         ; EAX = -1
    stc
ex:     mov ss:[esp+1Ch], eax
    popad
    ret             ;
; ввод символа
getch:      xor     ax, ax
    int 16h
    ret
; нова¤ строка
crlf:       push    ax
    mov ax, 0A0Dh
    int 29h
    xchg    al,ah
    int 29h
    pop ax
    ret
; отработка <BkSp>
rubout:     cmp ebx, ecx    ; первый символ?
    ja  @r          ; нет
    test    ebp,ebp         ; минус вводили?
    jz  @e          ; нет
    dec ebp         ; убираем флаг
    jmp @bs         ; стираем "-" с экрана
@r:     mov eax, edx
    xor edx, edx
    idiv    dword ptr ten       ; делим наше вводимое число на 10.
    mov edx,eax
    inc ecx
@bs:        call    bksp
@e:     ret
; курсор назад на 1 позицию
bksp:       mov ax, 2008h
    int 29h
    xchg    ah,al
    int 29h
    xchg    ah,al
    int 29h
    ret
 
    end start

Решение задачи: «Написать программу сложения двух 32-разрядных двоичных чисел»

textual
Листинг программы
mov ah,1
int 21h

Объяснение кода листинга программы

  1. ah - это регистр сегмента данных (DS), который содержит адрес начала стека
  2. int 21h - это команда для вызова BIOS, в данном случае, для выполнения операции сложения двух 32-разрядных чисел

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


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

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

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