我使用nasm一次打印一个字符串但是它一次打印两个字符串,我在末尾添加了空字符,我正在比较空字符以检查字符串的结尾但是两个字符串即使我只要求其中一个,也要打印出来。
[org 0x7c00]
mov bx, HELLO_MSG
call print_string
mov bx, GOODBYE_MSG
jmp $
%include "print_string.asm"
;Data
HELLO_MSG:
db 'Hello, World!',0
GOODBYE_MSG:
db 'GOODBYE!',0
times 510-($- $$) db 0
dw 0xaa55
另一个文件print_string.asm
print_string:
pusha
cld
mov ah,0x0e
config: mov al,[bx]
;Comparing the strings
mov cx,[bx]
cmp cx,0x00 ;Comparing for null
jne print
je end
print: int 0x10
add bx,1
jmp config
end: popa
ret
答案 0 :(得分:2)
; ds:si = asciiz string pointer
print_string:
pushf ; store everything to be modified
push ax
push bx
push si
cld
mov ah,0x0e
xor bx,bx ; bh (page) = 0, bl (color in gfx modes only)
print_string_loop:
lodsb
; check for null-terminator of string
test al,al
jz print_string_end
int 0x10
jmp print_string_loop
print_string_end:
pop si ; restore everything
pop bx
pop ax
popf
ret
; other code must be adjusted to put pointer into SI, not BX!
这显示common x86 asm idiom来测试零值。
我将字符串指针从si
移到bx
,因为我可以使用lodsb
加载al
(包括si
增量),并避免bx
,因为bh
和bl
是int 10h,ah=0Eh
的输入参数。因此,如果你的字符串地址加载bh
并且有一些不可见的有效页码(默认情况下第0页在文本模式下可见),那么你的旧代码会显示任何意外,你不会看到你的字母在屏幕上。
另外,你肯定不是那么着急,你不能保持你的标签有意义,并坚持一些缩进的风格(我试着猜测我的答案是什么,不知道我是否钉了它)。我知道当你进行实验时保持整洁是很困难的,但是在发布SO问题之前,退一步并尽可能地清理以获得Minimal, Complete, and Verifiable example可能是好的,使阅读尽可能容易地吸引最多的人来尝试检查你的问题。从长远来看,代码工作后的清理工作将有助于节省您的时间。