Простой вывод двоичных символов - Assembler
Формулировка задачи:
Здравствуйте! Тему вывод чисел в разных системах я читал, вывод вобщем то и не требуется...
Вопрос в следующем - вот простой код вывода какой-либо переменной или числа :
Так вот, код работает,очень хорошо. Но мне кардинально непонятны строки с 5 по 8 Если кто то будет так добр объяснить то буду благодарен!
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
Решение задачи: «Простой вывод двоичных символов»
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 раз. Внутри цикла:
- mov dl,30h;
В этой команде в регистр dl записывается значение 30h, которое будет использоваться при выводе на экран как символ
0
. - shl bx, 1 ; Это команда сдвига числа в регистре bx на один разряд влево. При этом единицы числа, которые находятся в старшем разряде, сдвигаются в флаг переноса (Carry Flag или CF).
- adc dl,0 ; Это команда сложения с переносом. Если CF=1, то в регистр dl записывается 31h, так как при сложении с нулём с переносом единицы числа в старшем разряде переносятся в младший разряд. Если CF=0, то в регистр dl записывается 30h.
- mov ah, 2; В этой команде в регистр ah записывается значение 2. Этот регистр используется функцией 21h прерывания для вывода на экран символа.
- int 21h; Выполняется прерывание 21h, в результате чего на экране появляется символ, соответствующий содержимому регистра dl.
- loop M6; Цикл повторяется 16 раз.
- Завершающая часть кода: В завершающей части кода, после окончания цикла, в регистре bx может остаться значение, которое не было выведено на экран. Это значение можно использовать в следующих циклах для вывода следующих 16-ти разрядов числа. Если это значение больше или равно 16, то это значит, что число закончилось, и его можно выводить целиком, начиная с младших разрядов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д