输出中的汇编语言错误

时间:2014-12-24 01:35:58

标签: assembly x86

我正在学习汇编,我编写了一个简单的程序来将字符串写入屏幕:

[org 0x7c00]

mov bp, 0x8000
mov sp, bp

mov bx, HELLO_MSG
call print_string

mov bx, GOODBYE_MSG
call print_string

jmp $

print_string:
    pusha

    mov ah, 0x0e

    for_block:
        mov al, [bx]
        int 0x10
        add bx, 0x1

    cmp bl, 0
    jne for_block

    popa
    ret

HELLO_MSG:
    db "Hello, World", 0

GOODBYE_MSG:
    db "Goodbye", 0

times 510-($-$$) db 0
dw 0xaa55

但输出是" Hello World Goodbye"然后是一堆空间,然后是另一个"再见",更多的空间,它终止于下面的某些线条的中间。

我在Bochs中效仿。

2 个答案:

答案 0 :(得分:0)

这里的问题是cmp bx,0。因为我们正在使用cmp移动字符串cmp应该在它上面获得停止点。

答案 1 :(得分:0)

加载后将每个字母与零比较: 此外,使用SI作为指针而不是BX,因为BX是您使用的BIOS功能的输入。

[org 0x7c00]

mov bp, 0x8000
mov sp, bp

mov si, HELLO_MSG
push cs
pop ds

call print_string

mov si, GOODBYE_MSG
push cs
pop ds
call print_string

jmp $

print_string:
    pusha

    mov ah, 0x0e

    for_block:
        lodsb ;loading the byte on the offset specified in SI. SI is automatically incremented here.
    cmp al, 0
    je exit
        int 0x10
        add bx, 0x1
    jmp for_block

exit:
    popa
    ret

HELLO_MSG:
    db "Hello, World", 0

GOODBYE_MSG:
    db "Goodbye", 0

times 510-($-$$) db 0
dw 0xaa55