Простой вывод двоичных символов - Assembler

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

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

Здравствуйте! Тему вывод чисел в разных системах я читал, вывод вобщем то и не требуется... Вопрос в следующем - вот простой код вывода какой-либо переменной или числа :
    mov bl, 2h ; число\переменная в bl
    mov cx, 16; кол-во чисел для вывода
    M6:
    xor dx, dx
    sal bx, 1 ;арифм сдвиг (в данном случае получается 4),мне не понятен этот ход
    adc dl, 30h ; сложение с переносом, опятже зачем в dl 30?
    mov ah, 2h ;вывод
    int 21h
    loop M6
Так вот, код работает,очень хорошо. Но мне кардинально непонятны строки с 5 по 8 Если кто то будет так добр объяснить то буду благодарен!

Решение задачи: «Простой вывод двоичных символов»

textual
Листинг программы
mov bх, Х ; здесь может быть любое число от 0 до 65535
    mov cx, 16; кол-во чисел для вывода
M6: mov dl,30h; место под результат, 
;при выводе на экран здесь будет или ноль с ASCII-кодом 30h или единица с ASCII-кодом 31h
    shl bx, 1 ;сдвигаем число Х на один разряд влево пока единицы, 
;которые там находятся не попадут во флаг переноса (Carry Flag или CF)
    adc dl,0 ; сложение нуля с переносом, если CF=1 значит был единичный разряд и DL=31h 
;если CF=0 значит в очередном разряде был ноль и DL=30h
    mov ah, 2; при выводе 2-ой функцией 21h прерывания на экране появится 
;содержимое регистра DL, то есть "0" или "1"
    int 21h
    loop M6; так вывыдутся все 16 разрядов числа которое мы поместили в регистр ВХ

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

В данном коде выполняется последовательный вывод 16-ти разрядов числа, находящегося в регистре bx. Для этого используется цикл loop, который выполняет повторение блока инструкций, представленного командой M6, 16 раз. Внутри цикла:

  1. mov dl,30h; В этой команде в регистр dl записывается значение 30h, которое будет использоваться при выводе на экран как символ 0.
  2. shl bx, 1 ; Это команда сдвига числа в регистре bx на один разряд влево. При этом единицы числа, которые находятся в старшем разряде, сдвигаются в флаг переноса (Carry Flag или CF).
  3. adc dl,0 ; Это команда сложения с переносом. Если CF=1, то в регистр dl записывается 31h, так как при сложении с нулём с переносом единицы числа в старшем разряде переносятся в младший разряд. Если CF=0, то в регистр dl записывается 30h.
  4. mov ah, 2; В этой команде в регистр ah записывается значение 2. Этот регистр используется функцией 21h прерывания для вывода на экран символа.
  5. int 21h; Выполняется прерывание 21h, в результате чего на экране появляется символ, соответствующий содержимому регистра dl.
  6. loop M6; Цикл повторяется 16 раз.
  7. Завершающая часть кода: В завершающей части кода, после окончания цикла, в регистре bx может остаться значение, которое не было выведено на экран. Это значение можно использовать в следующих циклах для вывода следующих 16-ти разрядов числа. Если это значение больше или равно 16, то это значит, что число закончилось, и его можно выводить целиком, начиная с младших разрядов.

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


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

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

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