为什么中断int 21h在程序执行过程中写入一个填充的字符串后会忽略所有字符串?

why does the interruption int 21h ignore all strings after writing a string filled durring the execution of the program?

我正在尝试打印两个 16 位值的总和,所以我计算总和然后构造包含它的字符串但问题是在我打印所述字符串之后任何写入中断 mov ah,09 int 21h 都被完全忽略了,我我正在使用 emu8086,这是代码

org 100h

    mov ax,2000
    mov bx,3200
    add ax,bx
    mov si,offset result+5
    mov [si],'$'
    mov bx,10

    Fill:

        dec si
        mov dx,0
        div bx
        add dl,48
        mov [si],dl
        test ax,ax

    jnz Fill

    mov dx,offset result
    mov ah,09h
    int 21h

    mov ah,09h
    mov dx,offset msg
    int 21h

ret

result db 5 dup (?)
msg db " is the sum$"
\n db 0ah,0dh, '$'

它只打印 result 并忽略 msg

您还可以通过这样做来优化程序并消除不必要终止“$”的复杂性。

    org 0x100

    mov ax,2000
    mov bx,3200
    add ax,bx
    mov si,offset result+4
    mov bx,10

Fill:
    mov dx,0
    div bx
    add dl,48
    mov [si],dl
    dec si
    test ax,ax
    jnz Fill

    mov dx,offset result
    mov ah,09h
    int 21h
    ret

result   db   '      is the sum', 10, 13, '$'
result db 5 dup (?)
msg    db " is the sum$"

有了这些数据定义,内存设置如下:

result 0    <- offset result+0
       0    <- offset result+1
       0    <- offset result+2
       0    <- offset result+3
       0    <- offset result+4
msg         <- offset result+5   <- offset msg+0
       i                         <- offset msg+1
       s                         <- offset msg+2
                                 <- offset msg+3
       t                         <- offset msg+4
       h                         <- offset msg+5
       e                         <- offset msg+6
                                 <- offset msg+7
       s                         <- offset msg+8
       u                         <- offset msg+9
       m                         <- offset msg+10
       $                         <- offset msg+11

当您在 offset result+5 处为 结果 写终止 $ 时,您 覆盖 space 字符msg 文本由此开始。这反过来意味着当您要求 DOS 显示 msg 文本时,DOS 会立即偶然发现字符串终止符,因此不会显示任何内容。

解决方案是不要在 offset result+4

处写入 $ 字符

相反,您需要为结果扩大缓冲区,以便它可以容纳 6 个字节。
您转换的 AX 寄存器中的值可能需要 5 位数字。因此,您需要一个 5+1 字节的缓冲区。

result db 6 dup (?)

作为避免必须通过代码编写 $ 字符的快捷方式有:

result db 5 dup (?), '$'

mov dx,offset result
mov ah,09h
int 21h

使用 结果的偏移量 可能会在屏幕上产生垃圾!
这里好的解决方案是在转换结束时使用 SI 寄存器中的值。它已经指向数字的第一位。多方便啊!

    org  100h

    mov  ax, 2000
    mov  bx, 3200
    add  ax, bx
    mov  si, offset result+5
    mov  [si], '$'
    mov  bx, 10

Fill:

    dec  si
    xor  dx, dx
    div  bx
    add  dl, '0'
    mov  [si], dl
    test ax, ax
    jnz  Fill

    mov  dx, si            <- This is offset of first digit.
    mov  ah, 09h
    int  21h

    mov  ah, 09h
    mov  dx, offset msg
    int  21h
    ret

result   db 6 dup (?)
msg      db " is the sum$"