Ввод символов и отображение в различных системах счисления - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д