为什么在 cx 中从 4 更改为 8 会多打印一个字?组装中

Why changing from 4 to 8 in cx prints one more word? In Assembly

忽略葡萄牙语的注释和变量名称。

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

此代码产生以下输出:

我想知道为什么我改变了

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

mov cx, 4 到 mov cx, 8 该程序打印了一层额外的 UBI,而不是 5 层,它在“---”之后打印了 6 次 UBI

您更改的代码

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

打印 msg0 的 4 个字节及其后的 4 个字节。让我们回顾一下定义:

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

msg0后面的4个字节正好是msg。因此,您得到的不是 ---\n,而是 ---\nUBI\n。然后你继续打印 5 行 UBI.

所以你会得到一个额外的 UBI 其他 UBI 之前,而不是之后,你可能已经怀疑了。您可以通过在每次输出之前更改 msg 来检查这一事实——例如通过在 msg 打印循环中的 int 21h 之前插入 inc [msg] 并注意到第一行在有问题的情况下没有改变。