为什么中断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$"
我正在尝试打印两个 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$"