Вывод на экран содержимого регистра bx в 16-ричном виде - Assembler

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

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

Добрый вечер всем. Имеется код подсчета двоичных нулей в переменной размером двойное слово. Не могу вывести на экран количество нулей, хранящихся в регистре bx. Вывести нужно в 16-тиричном виде. Пробовала статейку (Ввод и вывод чисел в различных системах счисления) - результата нет. Заранее спасибо за помощь и пояснения.
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. mes1 DB 'Zadannoe 4islo:', 13, 10, '$'
  5. mes2 DB '', 13, 10, '$'
  6. mes3 DB 'Kolichestvo nylei:', 13, 10, '$'
  7. PER dd 1110101000100010b
  8. KOL equ 1
  9. .code
  10. Start:
  11. MOV AX, @DATA
  12. MOV DS, AX
  13. xor AX, AX
  14. xor BX, BX
  15. mov AH, 09h ; выводить
  16. mov DX, OFFSET mes1 ; сообщение
  17. int 21h ; на экран
  18.  
  19. lea si,PER ; загружаем в si адрес нашего двоичного числа
  20. mov cx, KOL ; пересылаем в регистр cx количество элементов
  21. call ShowArray ; вызов процедуры вывода на экран
  22. mov dx,[si] ; пересылаем в dx значение элемента
  23. mov cx,16 ; пересылаем в cx количество битов в элементах
  24. met: rcl dx,1
  25. JNC met_1
  26. met_2: loop met
  27. mov AH, 09h ; выводить
  28. mov DX, OFFSET mes2 ; сообщение
  29. int 21h ; на экран
  30. mov DX, OFFSET mes2
  31. int 21h
  32. mov DX, OFFSET mes3
  33. int 21h
  34. JMP met_3
  35. met_1: inc bl
  36. JMP met_2
  37. met_3:
  38. mov AX, 4C00h
  39. int 21h
  40. ShowArray proc
  41. @@for:
  42. mov ax, [si] ; пересылаем в регистр ax, значение массива
  43. call ShowWord ; вызов процедуры
  44. mov al, ' ' ; пробел между элементами
  45. int 29h ;
  46. add si, 2 ; +
  47. loop @@for ; вычитает единицу из CX, если больше нуля то
  48. ; переход на указанную метку
  49. ret ; вернуться из подпрограммы
  50. ShowArray endp
  51. ;--------------------
  52. ShowWord proc
  53. push ax ; загружаем ax в стек (значение в ячейку памяти)
  54. push dx ; загружаем dx в стек
  55. push cx ; загружаем cx в стек
  56. mov cx,16 ; пересылаем в cx, количество битов
  57. mov dx, ax ; пересылаем в регистр dx
  58. @@ForEachBit:
  59. mov al, '0' ; пересылка в al, символьную строку
  60. shl dx, 1 ; сдвиг dx влево, кол-во сдвигов
  61. adc al, 0 ; сложение двух операндов, прибавляя к ним значение cx
  62. int 29h
  63. loop @@ForEachBit ; переход к метке, если больше 0
  64. pop cx ; выгружаем cx из стека
  65. pop dx ; выгружаем dx из стека
  66. pop ax ; выгружаем ax из стека
  67. ret ; вернуться из подпрограммы
  68. ShowWord endp
  69. END Start

Решение задачи: «Вывод на экран содержимого регистра bx в 16-ричном виде»

textual
Листинг программы
  1. .model small
  2. .386
  3.  
  4. .data
  5. mes1 db 'zadannoe 4islo: $'
  6. mes2 db 13,10,'$'
  7. mes3 db 'kolichestvo nylei: $'
  8.  
  9. per dw 1001010000010100b
  10.  
  11. .stack
  12. db 255 dup(?)
  13.  
  14. .code
  15. start:
  16. mov ax,@data
  17. mov ds,ax
  18.  
  19. mov ah,09h
  20. lea dx,mes1
  21. int 21h
  22.  
  23. mov dx,per
  24.  
  25. call showword
  26.  
  27. xor ax,ax
  28. mov cx,16
  29. met:
  30. shl dx,1
  31. jc met1
  32.  
  33. inc al
  34.  
  35. met1:
  36. loop met
  37.  
  38. push ax
  39.  
  40. mov ah,09h
  41. lea dx,mes2
  42. int 21h
  43.  
  44. mov ah,09h
  45. lea dx,mes3
  46. int 21h
  47.  
  48. pop ax
  49.  
  50. mov bx,16
  51. xor cx,cx
  52. get:
  53. xor dx,dx
  54. div bx
  55. push dx
  56. inc cx
  57.  
  58. or ax,ax
  59. jnz get
  60.  
  61. cmp cx,1
  62. jne big
  63.  
  64. mov ah,02h
  65. mov dl,'0'
  66. int 21h
  67.  
  68. big:
  69. mov ah,02h
  70. print:
  71. pop dx
  72.  
  73. cmp dl,09h
  74. jbe skip
  75.  
  76. add dl,7
  77.  
  78. skip:
  79. add dl,30h
  80.  
  81. int 21h
  82. loop print
  83.  
  84. mov ah,02h
  85. mov dl,'h'
  86. int 21h
  87.  
  88. mov ah,4Ch
  89. mov al,00h
  90. int 21h
  91.  
  92. showword proc
  93. push ax
  94. push dx
  95. push cx
  96.  
  97. mov cx,16
  98. foreachbit:
  99. mov al,'0'
  100. shl dx,1
  101. adc al,0
  102. int 29h
  103. loop foreachbit
  104.  
  105. pop cx
  106. pop dx
  107. pop ax
  108.  
  109. ret
  110. showword endp
  111.  
  112. end start

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

Список действий в коде:

  1. Устанавливаем сегменты данных и кода в регистры ds и cs соответственно.
  2. Выводим на экран сообщение с содержимым регистра per в 16-ричном виде.
  3. Очищаем стек.
  4. Переходим к циклу, который выводит на экран каждый бит регистра per в шестнадцатеричном виде.
  5. Возвращаемся из процедуры showword.
  6. Завершаем работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

13   голосов , оценка 4.077 из 5

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

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

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