当我一次只想要一个字符串时,NASM一次打印两个字符串?

时间:2017-10-22 06:20:19

标签: assembly nasm

我使用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

1 个答案:

答案 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 ,因为bhblint 10h,ah=0Eh的输入参数。因此,如果你的字符串地址加载bh并且有一些不可见的有效页码(默认情况下第0页在文本模式下可见),那么你的旧代码会显示任何意外,你不会看到你的字母在屏幕上。

另外,你肯定不是那么着急,你不能保持你的标签有意义,并坚持一些缩进的风格(我试着猜测我的答案是什么,不知道我是否钉了它)。我知道当你进行实验时保持整洁是很困难的,但是在发布SO问题之前,退一步并尽可能地清理以获得Minimal, Complete, and Verifiable example可能是好的,使阅读尽可能容易地吸引最多的人来尝试检查你的问题。从长远来看,代码工作后的清理工作将有助于节省您的时间。