NASM一次打印两个字符串,而我一次只想要一个



我使用nasm一次打印一个字符串,但它一次打印两个字符串,我在末尾添加了null字符,我正在比较null字符以检查字符串的末尾,但即使我只要求其中一个,两个字符串最终都会打印出来。

[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
; 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!

这显示了用于测试零值的常见x86 asm习惯用法。

我将字符串指针从bx移到了si中,因为这样我就可以使用lodsb加载al(包括si的增量),并避免bx,因为bhblint 10h,ah=0Eh的输入参数。因此,您的旧代码会意外地显示任何内容,如果您的字符串地址加载了bh,其中包含一些不可见的有效页码(默认情况下,第0页在文本模式下可见),您将不会在屏幕上看到您的字母。

此外,你肯定不会这么着急,因为你无法保持标签的意义,也无法坚持一些缩进风格(我试着猜测答案中的内容,不确定我是否做到了)。我知道当你只是在试验时,保持整洁有点困难,但在发布SO问题之前,最好退后一步,尽可能多地清理,以获得最小、完整和可验证的结果。例如,尽可能容易地阅读源代码,以吸引最多的人来检查你的问题。从长远来看,在代码工作后进行清理将有助于节省时间。

相关内容

最新更新