在引导扇区中使用 INT 0x10 打印字符串

vak*_*kus 5 x86 assembly fasm

我想创建printl允许我在寄存器中打印字符串的函数ax。我处于 16 位实模式,找不到任何打印消息的方法。我用来int 0x10打印一封信。

我尝试在寄存器中传递参数(要打印的字符串)bx,然后在循环中逐个字母地打印,然后使用popaand返回ret。我的代码并没有真正起作用——要么它创建了一个无限循环,要么打印了一个奇怪的符号。

如果您知道更有效的方法,那么这不是问题。如果您提供任何评论,我还想询问您的代码

这是我的代码

启动.asm:

start:
    mov bx, welcome    ;put argument to bx
    call printl        ;call printl function in sysf.asm
    hlt                ;halt cpu

welcome db 'Hello', 0

include 'sysf.asm'
times 510 - ($-$$) db 0

db 0x55
db 0xAA
Run Code Online (Sandbox Code Playgroud)

sysf.asm:

;print function
; al is one letter argument (type Java:char)
;
print:
        pusha
        mov ah, 0x0e
        int 0x10
        popa
        ret              ; go back

;printl function
; bx is argument of type Java:String
;
printl:
        pusha
        jmp printl001
printl001:
        lodsb             ; I was working with si register but i would like to use bx register
        or al,al
        jz printl002
        mov ah, 0x0e
        int 0x10
        jmp printl001 
printl002:
        popa
        ret
Run Code Online (Sandbox Code Playgroud)

Ros*_*dge 4

lodsb指令加载 DS 和 SI 寄存器指向的字节,但尚未加载有效值。由于这是一个引导加载程序,您还需要使用 ORG 指令,否则汇编器将不知道您的代码以及消息welcome加载到内存中的位置。尝试将程序的开头更改为:

ORG 0x7c00

start:
    push cs
    pop ds
    mov si, welcome
Run Code Online (Sandbox Code Playgroud)