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