Ввод 32-разрядного двоичного числа с клавиатуры - Assembler

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

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

Нужно написать программу, которая считает сумму двух двоичных 32-разрядных чисел, введенных с клавиатуры. Я смог написать программу для подсчета суммы и вывода ее на экран, но никак не понимаю, как сделать ввод 32-разрядного двоичного числа с клавиатуры. Помогите пожалуйста) P.S. облазил уже все источники, которые мог найти, но это несильно помогло

Решение задачи: «Ввод 32-разрядного двоичного числа с клавиатуры»

textual
Листинг программы
.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

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

  1. Переменные: _a dd ? _b dd ? suma dd ?
  2. Код:
    • Начинается с сегмента данных, поэтому указываем сегмент данных (ds) и начальный адрес стека (sp).
    • Затем идет вывод сообщений с помощью функции int 21h.
    • Далее идет ввод двух двоичных чисел с помощью функции cgetbin.
    • После ввода двух чисел происходит сложение и результат сохраняется в переменной suma.
    • Затем происходит вывод результата с помощью функции _cputbin.
    • В конце программы идет возврат в DOS с помощью функции ret.
  3. Вывод сообщений:
    • Для вывода сообщений используется функция int 21h.
    • Адрес выводимого сообщения хранится в регистре dx.
    • Каждое сообщение начинается с 0Dh (перевод строки) и 0Ah (возврат каретки).
  4. Ввод двоичного числа:
    • Функция cgetbin используется для ввода двоичного числа.
    • На входе функции указывается количество цифр (ecx).
    • Если нажата клавиша , то число считается отмененным и возвращается -1.
    • Если нажата клавиша , то число считается введенным и возвращается.
    • Если введено некорректное число, то происходит удаление последнего символа и повторный запрос ввода.
  5. Отработка :
    • Функция rubout используется для отработки удаления символа.
    • Если введен символ, то происходит деление введенного числа на 10.
    • Если введен знак минус, то происходит удаление этого знака.
    • Если введен символ , то происходит удаление последнего символа.
  6. Вывод двоичного числа:
    • Функция _cputbin используется для вывода двоичного числа.
    • Для вывода числа используется функция int 29h.
    • Число выводится в обратном порядке, начиная с последнего разряда.
    • Для вывода каждого разряда используется функция int 29h.
  7. Ввод символа:
    • Функция getch используется для ввода символа.
    • Функция int 16h используется для ввода символа.
    • Введенный символ сохраняется в регистре ax.
  8. Новая строка:
    • Функция crlf используется для вывода новой строки.
    • Сначала на экран выводится символ 0A0Dh (перевод строки).
    • Затем происходит обмен регистрами ax и ah.
    • Затем на экран выводится символ 0A0Dh (возврат каретки).
  9. Курсор назад на 1 позицию:
    • Функция bksp используется для отработки нажатия клавиши .
    • Функция int 29h используется для вывода символа.
    • Сначала на экран выводится символ 2008h (курсор назад на 1 позицию).
    • Затем происходит обмен регистрами ax и ah.
    • Затем на экран выводится символ 2008h (курсор назад на 1 позицию).
    • Затем происходит обмен регистрами ax и ah.
    • Затем на экран выводится символ 2008h (курсор назад на 1 позицию).
    • Затем происходит обмен регистрами ax и ah.
    • Затем на экран выводится символ 2008h (курсор назад на 1 позицию).
  10. Конец программы:
    • В конце программы происходит возврат в DOS с помощью функции ret.

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


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

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

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