Сборка Печать строки эффективно - PullRequest
0 голосов
/ 21 ноября 2018

Так что в настоящее время я работаю над простым фрагментом сборки, который я надеюсь превратить в эффективный загрузчик для загрузки 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 голосов
/ 21 ноября 2018

Ваш код должен выглядеть примерно так.

    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.

У меня есть несколько версий загрузчика, и в каждой из них я уделил особое внимание оптимизации, особенно в том, что касается пространства, поскольку в одном секторе может поместиться только столько.

Тамможет быть несколько вариантов этого, но важно, чтобы поток управления шел по предсказуемому пути.

...