当我%包含我的打印功能时,引导扇区打印错误的东西

时间:2017-11-06 16:29:48

标签: string assembly x86 include nasm

我遇到了一些汇编代码的问题。我试图使用不同的程序集文件中的函数打印出一个字符串。但它不输出字符串而是输出“S”。我该如何解决? 我想补充说我使用的是NASM汇编程序。 码: string.asm

print_string:
pusha
mov ah, 0x0e
loop:
        mov al, [bx]
        cmp al, 0
        je return
        int 0x10
        inc bx
        jmp loop

return:
    popa
    ret

boot_sector.asm -

[org 0x7c00]

%include "string.asm"

mov bx, [my_string]
call print_string

my_string:
db 'hello world', 0

times 510 - ($ - $$) db 0

dw 0xaa55

1 个答案:

答案 0 :(得分:2)

引导扇区的执行从第一个字节开始。 在这种情况下,第一条指令是函数的顶部,因为你把它放在第一位。

代码组装完全相同,就像你在组装之前手动包含它一样。所以你的引导部门真的是:

[org 0x7c00]

print_string:
    pusha
    ...
    ret

    mov bx, [my_string]       ; BX = load first 2 bytes of my_string.
    ; should have been
    ; mov bx, my_string       ; BX = address of my_string.       mov bx, imm16
    call print_string

为什么它不起作用应该是非常明显的,如果您使用内置于BOCHS的调试器(或任何其他调试引导扇区的方式)单步执行代码,您会注意到这一点。即使只是看反汇编,也可能让你了解。

解决方案:%include放在其他代码之后,并避免执行落入其中。例如把这个放在电话之后:

   cli       ; disable interrupts
   hlt       ; halt until the next interrupt.  (except for NMI)

(如果可以使用NMI,您可以将hlt置于jmp的无限循环中。)

这不是你唯一的错误。正如@MichaelPetch指出的那样,你从字符串加载2个字节而不是将其地址放入BX。