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

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

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

Хотел бы добавить в профильную тему, однако она закрыта, может кому понадобится, код полностью рабочий (проверял в EMU8086). От себя бы что еще хотелось, так это проверить, насколько он компактный и кому не сложно реализовать перевод еще в двоичную так как и сделана мною перевод шестнадцатеричную.
Листинг программы
  1. .Model tiny
  2. .Code
  3. org 100h
  4. start:
  5. mov dx, offset messagel
  6. mov ah, 9
  7. int 21h
  8. mov dx, offset buffer
  9. mov ah, 0Ah
  10. int 21h
  11. mov dx, offset crlf
  12. mov ah, 9
  13. int 21h
  14. xor di, di
  15. xor ax, ax
  16. mov cl, blength
  17. xor ch, ch
  18. xor bx, bx
  19. mov si, cx
  20. mov cl, 10
  21. asc2hex:
  22. mov bl, byte ptr bcontents [di]
  23. sub bl, '0'
  24. jb asc_error
  25. cmp bl, 9
  26. ja asc_error
  27. mul cx
  28. add ax, bx
  29. inc di
  30. cmp di, si
  31. jb asc2hex
  32. push ax
  33. mov ah, 9
  34. mov dx, offset message2
  35. int 21h
  36. pop ax
  37. push ax
  38. xchg ah, al
  39. call print_al
  40. pop ax
  41. call print_al
  42. Ret
  43. asc_error:
  44. mov dx, offset err_msg
  45. mov ah, 9
  46. int 21h
  47. Ret
  48. print_al:
  49. mov dh, al
  50. and dh, 0Fh
  51. shr al, 4
  52. call print_nibble
  53. mov al, dh
  54. print_nibble:
  55. cmp al, 10
  56. sbb al, 69h
  57. Das
  58. mov dl, al
  59. mov ah, 2
  60. int 21h
  61. Ret
  62. messagel db "Desatkove chislo: $"
  63. message2 db "Shistnkadcatkove chislo: $"
  64. err_msg db "Pomulka!"
  65. crlf db 0Dh, 0Ah, '$'
  66. Buffer db 6
  67. blength db ?
  68. bcontents:
  69. end start

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

textual
Листинг программы
  1. . Model tiny    ; модель памяти, в которой сегменты кода, данных и стека объединены.
  2. . Code  ; сегмент кода, который содержит данные.
  3. org 100h    ; начало СОМ-файла
  4. Begin:  ; метка начала кода программы
  5. call Wait_key   ; вызываем подпрограмму
  6. cmp al, 27  ; сравниваем значение в al с кодом 27 (ESC)
  7. ; если да - то на метку Quit_prog
  8. je Quit_prog   
  9. cmp al, 0   ; код клавиши расширенный? (F1-F12 и т.п.)
  10. je Begin    ; Если «да» - повторяем запрос
  11. call Out_char   ; вызываем процедуру вывода нажатой клавиши на экран
  12. jmp Begin   ; ждем дальше ...
  13. Quit_prog:  ; метка, на которую придет программа в случае нажатия ESC
  14. mov al, 32  ; помещаем в AL <пробел>
  15. call Out_char   ; вызываем процедуру вывода символа в AL
  16. int 20h ; выход
  17. Wait_key proc   ; процедура ожидания клавиши от пользователя
  18. mov ah, 10h ; окончания подпрограммы
  19. int 16h ; прерывания DOS
  20. Ret ; функция DOS "завершить работу процедуры"
  21. Wait_key endp   ; окончания процедуры Wait_key
  22. Out_char proc   ; начало процедуры out_char
  23. push cx ; сохраним все регистры, которые будут изменены подпрограммой
  24. push ax ; Делаем это для того, чтобы в дальнейшем не было путаницы
  25. push es ; Сохраняем сегментный регистр
  26. push ax ; сохраняем AX, т.к в нем код нажатой клавиши ...
  27. mov ax, 0B800h  ; установливать ES на сегмент видеобуфера
  28. mov es, ax 
  29. mov di, 0   ; DI - первый символ первой строки
  30. mov cx, 2000    ; выводим 2000 символов (80 символов в строке 25 строк)
  31. pop ax  ; восстановим код клавиши
  32. mov ah, 31  ; цвет символа
  33. Next_sym:   ; метка для цикла
  34. mov es: [di], ax    ; заносим код клавиши и ее цвет (цвет всегда 31)
  35. inc di  ; увеличиваем указатель на 2 (первый байт - символ второй байт - цвет)
  36. inc di 
  37. loop Next_sym   ; обработка следующего символа
  38. pop es  ; восстановим сохраненые регистры и выровненный стек
  39. pop ax  ; восстановим сохраненые регистры и выровненный стек
  40. pop cx  ; восстановим сохраненые регистры и выровненный стек
  41. Ret ; вернемся из процедуры
  42. Out_char endp   ; окончания процедуры Out_char
  43. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы