Ассемблер DOS. Не могу разобраться - Assembler

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

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

Всем доброго времени, заранее извините за глупый вопрос. Вопрос в следующем, не могу понять почему не перемещается "курсор", а точнее почему следующий вывод строки не происходит от позиции курсора. Вот такой простенький код:
org 100h            
xor dx,dx           ;сброс регистров (хз зачем, на всякий случай)
xor cx,cx
lea bx, msg         ;адрес текста
mov ax,3            ;(videomode 80*25)
int 10h
 
go:
mov ah,02           ;Двигаем курсор первый раз в 0000, затем см.ниже
int 10h   
 
inc dh              ;Для изменения позиции курсора на следующем этапе цикла
add dl,03
push dx            ;Перед выводом на экран значение dx убираем в стек
                       ;т.к. dx будет нужен для int 021h ah=09 
 
mov ah,09           ;Выводим строку
mov dx,bx
int 021h
 
pop dx              ;Возвращаем dx (для счетчика цикла и для последующего изменения)
           
cmp dh,0Ah          ;Сравниваем строку
jne go               ;уходим в начало цикла пока не удовлетворит нашим требованиям
 
xor ah,ah           ;ah в 00h для int 16h
int 16h
 
int 020h             ;в DOS

ret
msg db 'Kogda zhe ty zarabotaesh?$'
В комментариях расписал свой ход мыслей подробно. По задумке строка с текстом должна выводиться (0A-1) раз, но каждый раз ее начало должно сдвигаться на 3 столбца вправо и на 1 строку вниз, т.е. какбы выводиться по диагонали. В итоге же текст идет друг за другом впритык. А, например, в EMU8086 если идти по выполнению программы пошагово, то накладывается друг на друга, т.е. каждый вывод от начала страницы. Помогите разобраться что я упустил.

Решение задачи: «Ассемблер DOS. Не могу разобраться»

textual
Листинг программы
go:
    push    bx
    xor bx,bx
    mov ah,02           ;Двигаем курсор первый раз в 0000, затем см.ниже
    int 10h   
    pop bx

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

  1. go - команда перехода, выполняет переходы по программе
  2. push bx - отправляет в стек значение регистра bx
  3. xor bx,bx - инициализирует регистр bx нулевым значением
  4. mov ah,02 - устанавливает значение регистра ah равным 02 (код функции вывода символа)
  5. int 10h - вызывает интерференцию с функцией 10h, которая выводит символ на экран
  6. pop bx - извлекает из стека значение, которое было отправлено туда командой push bx Код выполняет вывод символа на экран с помощью функции 10h, используя регистр bx для передачи адреса символа. В данном случае символ не указывается явно, поэтому скорее всего это некоторый системный символ или символ, определенный в другой части программы.

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


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

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

15   голосов , оценка 3.933 из 5