Перевод из десятичной в шестнадцатеричную - Assembler

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

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

Хотел бы добавить в профильную тему, однако она закрыта, может кому понадобится, код полностью рабочий (проверял в EMU8086). От себя бы что еще хотелось, так это проверить, насколько он компактный и кому не сложно реализовать перевод еще в двоичную так как и сделана мною перевод шестнадцатеричную.
.Model tiny 
.Code 
org 100h 
start: 
mov dx, offset messagel 
mov ah, 9 
int 21h 
mov dx, offset buffer 
mov ah, 0Ah 
int 21h 
mov dx, offset crlf 
mov ah, 9 
int 21h 
xor di, di 
xor ax, ax 
mov cl, blength 
xor ch, ch 
xor bx, bx 
mov si, cx 
mov cl, 10 
asc2hex: 
mov bl, byte ptr bcontents [di] 
sub bl, '0' 
jb asc_error 
cmp bl, 9 
ja asc_error 
mul cx 
add ax, bx 
inc di 
cmp di, si 
jb asc2hex 
push ax 
mov ah, 9 
mov dx, offset message2 
int 21h 
pop ax 
push ax 
xchg ah, al 
call print_al 
pop ax 
call print_al 
Ret 
asc_error: 
mov dx, offset err_msg 
mov ah, 9 
int 21h 
Ret 
print_al: 
mov dh, al 
and dh, 0Fh 
shr al, 4 
call print_nibble 
mov al, dh 
print_nibble: 
cmp al, 10 
sbb al, 69h 
Das 
mov dl, al 
mov ah, 2 
int 21h 
Ret 
messagel db "Desatkove chislo: $" 
message2 db "Shistnkadcatkove chislo: $" 
err_msg db "Pomulka!" 
crlf db 0Dh, 0Ah, '$' 
Buffer db 6 
blength db ? 
bcontents: 
end start

Решение задачи: «Перевод из десятичной в шестнадцатеричную»

textual
Листинг программы
. Model tiny    ; модель памяти, в которой сегменты кода, данных и стека объединены.
. Code  ; сегмент кода, который содержит данные.
org 100h    ; начало СОМ-файла
Begin:  ; метка начала кода программы
call Wait_key   ; вызываем подпрограмму
cmp al, 27  ; сравниваем значение в al с кодом 27 (ESC)
; если да - то на метку Quit_prog
je Quit_prog    
cmp al, 0   ; код клавиши расширенный? (F1-F12 и т.п.)
je Begin    ; Если «да» - повторяем запрос
call Out_char   ; вызываем процедуру вывода нажатой клавиши на экран
jmp Begin   ; ждем дальше ...
Quit_prog:  ; метка, на которую придет программа в случае нажатия ESC
mov al, 32  ; помещаем в AL <пробел>
call Out_char   ; вызываем процедуру вывода символа в AL
int 20h ; выход
Wait_key proc   ; процедура ожидания клавиши от пользователя
mov ah, 10h ; окончания подпрограммы
int 16h ; прерывания DOS
Ret ; функция DOS "завершить работу процедуры"
Wait_key endp   ; окончания процедуры Wait_key
Out_char proc   ; начало процедуры out_char
push cx ; сохраним все регистры, которые будут изменены подпрограммой
push ax ; Делаем это для того, чтобы в дальнейшем не было путаницы
push es ; Сохраняем сегментный регистр
push ax ; сохраняем AX, т.к в нем код нажатой клавиши ...
mov ax, 0B800h  ; установливать ES на сегмент видеобуфера
mov es, ax  
mov di, 0   ; DI - первый символ первой строки
mov cx, 2000    ; выводим 2000 символов (80 символов в строке 25 строк)
pop ax  ; восстановим код клавиши
mov ah, 31  ; цвет символа
Next_sym:   ; метка для цикла
mov es: [di], ax    ; заносим код клавиши и ее цвет (цвет всегда 31)
inc di  ; увеличиваем указатель на 2 (первый байт - символ второй байт - цвет)
inc di  
loop Next_sym   ; обработка следующего символа
pop es  ; восстановим сохраненые регистры и выровненный стек
pop ax  ; восстановим сохраненые регистры и выровненный стек
pop cx  ; восстановим сохраненые регистры и выровненный стек
Ret ; вернемся из процедуры
Out_char endp   ; окончания процедуры Out_char
end Begin   ; метка окончания кода программы

Объяснение кода листинга программы

  1. Объявлены сегменты кода, данных и стека, а также модель памяти, в которой они объединены.
  2. Начало СОМ-файла отмечено орг-кодом.
  3. Начало кода программы помечено меткой Begin.
  4. Вызывается подпрограмма Wait_key для ожидания нажатия клавиши.
  5. Проверяется, была ли нажата клавиша ESC (27). Если да, то программа переходит на метку Quit_prog.
  6. Проверяется, была ли нажата клавиша с кодом 0 (расширенный код клавиши). Если да, то программа возвращается к началу запроса (Begin).
  7. Вызывается подпрограмма Out_char для вывода нажатой клавиши на экран.
  8. Программа переходит к метке Begin для ожидания дальнейшего ввода.
  9. Если клавиша была ESC, то в регистре AL помещается код клавиши 32 (пробел).
  10. Вызывается подпрограмма Out_char для вывода символа в AL на экран.
  11. Программа выходит из системы с помощью прерывания DOS 20h.
  12. Начало процедуры ожидания клавиши от пользователя (Wait_key).
  13. Устанавливается сегментный регистр ES на сегмент видеобуфера (0B800h).
  14. Сохраняются регистры AX, CX, ES и DI.
  15. Задается начальный адрес первой строки для вывода (DI = 0).
  16. Задается количество символов для вывода (CX = 2000).
  17. Восстанавливаются сохраненные регистры AX, CX, ES и DI.
  18. Выполняется цикл для вывода каждого символа (Next_sym).
  19. Код клавиши и ее цвет записываются в видеобуфер (mov es:[di], ax).
  20. Увеличивается указатель DI на 2 байта (первый байт - символ, второй байт - цвет).
  21. Цикл продолжается до тех пор, пока не будут обработаны все символы.
  22. Восстанавливаются сохраненные регистры и выравнивается стек.
  23. Программа возвращается из процедуры Out_char.
  24. Конец кода программы помечен меткой end Begin.

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

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