cod segment
assume cs:cod,ds:cod
org 100h
begin:
mov dx,offset Start
call Message
;Чтение из командной строки
mov bx,80h
; получение длины
xor cx,cx
mov cl,[bx]
jcxz ErrorNoCmd ;проверим на ноль - ничего не задано
; вставлем число в регистр dx
dec cx
cmp cx,2 ;ждем 1 или 2 hex цифры!
ja ErrorBigCmd ;если больше, то ошибка
lea si,[bx+2]
xor dx,dx
PutNumbToDX:
; вставляем число в регистр dx
shl dx,4
lodsb
or al,20h ;чтобы буковки 'a' и 'A' стали одинаковыми - 'a'
;на цифры не влияет!
sub al,'0'
jc ErrorNum ;<'0' - ошибка
cmp al,9
jbe TransDone ;'0'-'9' - ok
sub al,('a'-'0')-10
jc ErrorNum ;'9'-'a' - ошибка
cmp al,0fh
ja ErrorNum ;>'f' - ошибка
TransDone:
or dl,al
loop PutNumbToDX
;Конвертируем в десятичную и выводим на экран
push dx
mov dx,offset ResPrompt
call Message
pop ax ;в ax число
mov bx,10 ;будем делить на 10
mov di,offset Symbols ;буфер для числовой строки
xor cx,cx ;будем считать
push ax ;сохраним для дальнейшего преобразования в двоичный код
GetDigit: ;процедура перевода в десятичную СС
xor dx,dx
div bx ;остаток - очередная младшая цифра
push dx ;сохраним в стеке
inc cx ;считаем
test ax,ax ;пока что-то есть
jnz GetDigit
PutDigit: ;выводим в обратном порядке
pop ax
add al,'0'
stosb
loop PutDigit ;по всем цифрам
call PrintNum ;дооформим строку и выведем
; Конвертируем в двоичную и выводим на экран
mov dx,offset ResPromptBin
call Message
pop dx ;наше число
mov cx,8 ;8 бит
mov di,offset Symbols ;в том же буфере
GetBin: ; процедура перевода в двоичную СС
xor ax,ax
shl dl,1 ;у нас байт, с ним и работаем
adc al,'0'
stosb
loop GetBin
mov al,'b' ;добавим в конце 'b'
stosb
call PrintNum ;дооформим строку и выведем
Exit: ; Выход
mov dx,offset Finish
jmp Message
;ошибки
ErrorNoCmd: ;без параметра
mov dx,offset NoCmd
jmp Message
ErrorNum:
mov dx,offset ErrNum;не hex-число
jmp Message
ErrorBigCmd:
mov dx,offset BigCmd;больше 2-х цифр
jmp Message
PrintNum: ;вывод числовой строки
mov ax,0d0ah ;добавим перевод строки
stosw
mov al,'$' ;добавим '$' для функции 9
stosb
mov dx,offset Symbols
Message: ;процедура вывода на экран
mov ah,09h
int 21h
retn
Start db 'Start !',0ah,0dh,'$'
NoCmd db 'No specified symbols in CMD !',0ah,0dh,'$'
BigCmd db 'Many symbols in CMD! Must be two symbols',0ah,0dh,'$'
ErrNum db 'Not hex number!',0ah,0dh,'$'
ResPrompt db 'Result in digit: ','$'
ResPromptBin db 'Result in bin: ','$'
Symbols db 16 dup (?)
Finish db 'Finish!',0ah,0dh,'$'
cod ends
end begin
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.