汇编有效地打印字符串

时间:2018-11-21 00:24:57

标签: assembly x86 kernel bios

因此,我目前正在处理一个简单的程序集,希望将其转变为一个高效的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

1 个答案:

答案 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,在每个版本中,我都特别关注优化,因为它适用于空间,因为只有一个扇区可以容纳这么多空间。

  

可能会有一些变体,但是重要的是控制流遵循可预测的路径。