Ввод символов и отображение в различных системах счисления - Assembler

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

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

Здравствуйте! Есть проблема, прошу подсказки. Нужно создать прогу на ассемблере, которая при введении с клавы двух байт (*1234 естественно в 16-ричной) пересчитывала бы их в другие, например в двоичную, десятичную, шестнадцатеричную и т.д. Сама логика перевода понятна, сравнение, добавление 30h или 37h (для hex) или деление на 10 (для 10-ричной). Мне непонятно, как сохранить введенные с клавы байты например в BX, чтобы потом из них доставать, преобразовывать и выводить на экран по своему желанию. Ниже приведу свои потуги, которые моментально выдадут во мне чайника. Наведите на путь истинный.
[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
Для справки, получаю второе высшее, учусь на заочном, по требованию ВУЗа компилировал через NASM, использую для проверки простой debug и командную строку. Пока что-то более совершенное и понятное мне недоступно в силу отсутствия понимания. Но за совет буду крайне признателен.

Решение задачи: «Ввод символов и отображение в различных системах счисления»

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

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

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