Почему изменение от 4 до 8 в cx печатает еще одно слово? В сборе - PullRequest
0 голосов
/ 24 марта 2020

Игнорировать комментарии и имена переменных на португальском языке.

org 100h

escrita equ 40h
ecran equ 1

;executa o ciclo 3 vezes
mov [cont], 3
ciclo1:
mov ah, escrita
mov bx, ecran
mov cx, 4
mov dx, msg
int 21h
dec [cont]
jnz ciclo1

;escreve ‘---‘
mov ah, escrita
mov bx, ecran
mov cx, 4
mov dx, msg0
int 21h

;executa o ciclo 5 vezes
mov [cont], 5
ciclo2:
mov ah, escrita
mov bx, ecran
mov cx, 4
mov dx, msg
int 21h
dec [cont]
jnz ciclo2

;aguarda que se carregue numa tecla
mov ah, 07h
int 21h

;retorna ao sistema operativo
mov ah, 4ch 
int 21h

msg0 db '---',10
msg db "UBI", 10
cont rb 1

Этот код производит следующий вывод:

enter image description here

Я хочу знать, почему, когда я изменяю

    mov ah, escrita
    mov bx, ecran
    mov cx, 4
    mov dx, msg0
    int 21h

mov cx, 4 to mov cx, 8 Программа печатает дополнительный слой UBI, вместо 5 она печатает 6 раз UBI после "---"

enter image description here

1 Ответ

2 голосов
/ 24 марта 2020

Ваш измененный код

    mov ah, escrita
    mov bx, ecran
    mov cx, 8
    mov dx, msg0
    int 21h

печатает 4 байта msg0 и 4 байта после него. Давайте вспомним определение:

msg0 db '---',10
msg db "UBI", 10

4 байта, следующие за msg0, равны msg. Итак, вместо ---\n вы получите ---\nUBI\n. Затем вы приступаете к печати 5 строк UBI.

Таким образом, вы получаете дополнительные UBI строки до других UBI с, а не после, о которых вы могли подозревать. Вы можете проверить этот факт, изменив msg перед каждым выводом - например, вставив inc [msg] перед int 21h в msg, печатая l oop и заметив, что первая строка не изменяется в проблемных c кейс.

...