Ввод символов и отображение в различных системах счисления - Assembler
Формулировка задачи:
Здравствуйте!
Есть проблема, прошу подсказки. Нужно создать прогу на ассемблере, которая при введении с клавы двух байт (*1234 естественно в 16-ричной) пересчитывала бы их в другие, например в двоичную, десятичную, шестнадцатеричную и т.д. Сама логика перевода понятна, сравнение, добавление 30h или 37h (для hex) или деление на 10 (для 10-ричной). Мне непонятно, как сохранить введенные с клавы байты например в BX, чтобы потом из них доставать, преобразовывать и выводить на экран по своему желанию. Ниже приведу свои потуги, которые моментально выдадут во мне чайника. Наведите на путь истинный.
Для справки, получаю второе высшее, учусь на заочном, по требованию ВУЗа компилировал через NASM, использую для проверки простой debug и командную строку. Пока что-то более совершенное и понятное мне недоступно в силу отсутствия понимания. Но за совет буду крайне признателен.
[org 100h] Start: H1: db 82h, 82h, 85h, 84h, 88h, 92h, 85h, 20h, db 24h;Текст ;-------------------------------------------------- mov dl,[H1] call Write_str ; вывод на экран текста call Write_digit_hex; вызов процедуры ввода с клавиатуры 1 байта mov cl,4; смешение цифры из младшего полубайта в старший shl dl,cl; call Write_digit_hex int 20h ;------------------------------------------------------ Write_str: push ax mov ah,9 int 21h pop ax ret ;------------------------------------------------------ Write_digit_hex: push ax push dx mov ah,1 int 21h mov dl,al cmp dl,39h jbe L1 sub dl,37h L1: sub dl,30h int 21h pop dx pop ax ret ;------------------------------------------------------ Write_str: push ax mov ah,9 int 21h pop ax
Решение задачи: «Ввод символов и отображение в различных системах счисления»
textual
Листинг программы
model tiny .code org 100h start: lea dx,dbSiN mov si,10 call inpNum jc start mov dwSin,di @@00: lea dx,dbInp mov si,dwSin call inpNum jc @@00 mov dwNum,di @@01: lea dx,dbSon mov si,10 call inpNum jc @@01 mov ah,9 lea dx,dbRes int 21h @@02: mov ax,di mov si,10 call outNum mov al,'=' int 29h mov ax,dwnum mov si,di call outNum mov al,10 int 29h mov al,13 int 29h dec di cmp di,1 jnz @@02 ret inpNum proc mov ah,9 int 21h xor di,di mov bx,si in01: xor ax,ax int 16h mov ah,al cmp al,13 jz in04 cmp ah,'a' jb in02 sub ah,'a'-'A' sub al,'a'-'A' in02: cmp ah,'A' jb in03 sub ah,7 in03: sub ah,'0' js in01 cmp ah,bl jae in01 push ax int 29h pop ax mov al,ah xor ah,ah xchg ax,di xor dx,dx mul si add di,ax or dx,dx jz in01 mov ah,9 lea dx,dbErr int 21h stc in04: ret inpNum endp outNum proc xor cx,cx on1: xor dx,dx div si push dx inc cx or ax,ax jnz on1 mov ax,' '-'0'-7 on2: push ax inc cx cmp cx,17 jnz on2 on3: pop ax cmp al,9 jbe on4 add al,7 on4: add al,'0' int 29h loop on3 ret outNum endp dbInp db 10,13,'Enter number:$' dbSon db 10,13,'system output:$' dbSin db 10,13,'system input:$' dbErr db 10,13,'Error overflow$' dbRes db 10,13,'Result in any system:',10,13,'$' dwnum dw ? dwSin dw ? end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д