因此,我目前正在处理一个简单的程序集,希望将其转变为一个高效的Bootloader来加载C内核。
我现在的主要问题是。是否有关于我当前如何从SI寄存器中存储和打印字符串的指针?
它完美地呈现了字符串。我只想确保自己正在养成良好的习惯。
这是我的代码。
ORG 0x7c00
msg db 'Hello World!', 0
start:
mov ax, 0x00
mov ds, ax
mov ah, 0x0e ;prepare AH register to be written to.
mov si, msg ;move string into SI register and prepare for read/write
call print
print:
lodsb ;load byte string pointed to in SI and DS register
or al, al ;check if al equals 0
jz end ; if zero, end execution
int 0x10 ;print string
jmp print ;^ above line and this only execute if AL > 0.
end:
hlt
jmp end
times 510-($-$$) db 0
dw 0xaa55
答案 0 :(得分:0)
您的代码应如下所示。
org 0x7c00
xor ax, ax
mov ds, ax
jmp Begin
print:
mov ah, 0x0e ; BIOS TTY function
.L0:
lodsb
or al, al
jnz .J0
ret
.J0:
int 0x10
jmp .L0
Prompt:
db 'Hello World', 0
Begin:
mov si, Prompt
call print
.spin:
hlt
jmp .spin
times 510 - $+$$ db 0
dw 0xAA55
因为您没有跳过提示文本,所以这是计算机认为将BIOS作为控制权传递给引导扇区之后计算机立即需要执行的操作。
00 48 dec ax
01 656C gs insb
03 6C insb
04 6F outsw
05 20576F and [bx+0x6f],dl
08 726C jc 0x76
0A 6490 fs nop
除此之外,我所做的唯一更改是在循环中初始化AH,否则,每次调用该函数时,您都必须重复设置AH。
我有多个版本的bootloader,在每个版本中,我都特别关注优化,因为它适用于空间,因为只有一个扇区可以容纳这么多空间。
可能会有一些变体,但是重要的是控制流遵循可预测的路径。