Печать сборки выводит неожиданный результат - PullRequest
0 голосов
/ 07 апреля 2020

Я относительно новичок в программировании на ассемблере, и мне было интересно, почему мой код не печатает ожидаемые строки. Этот проект должен быть загрузчиком по окончании. Я компилирую с помощью команды nasm -f bin boot.asm -o boot.bin. Во время компиляции ошибок нет.

boot.asm

bits 16
org 0x7C00

%include "print.asm"
%include "text.asm"

boot:
        mov si, boot_string_00
        call print
        mov si, boot_string_01
        call print

times 510 - ($-$$) db 0
dw 0xAA55

print.asm

print:
        mov ah, 0x0E

.print_loop:
        lodsb
        or al, al
        je .print_done
        int 0x10
        jmp .print_loop

.print_done:
        cli
        ret

text.asm

boot_string_00: db "Placeholder OS Title v0.0.1", 0
boot_string_01: db "Loading Operating system", 0

Ожидаемый результат:

PlaceHolder OS Title v0.0.1Loading Operating System

Фактический результат:

S

Кроме того, мне было интересно, как я могу реализовать перевод строки в ассемблере, чтобы я мог просто использовать '\ n' в своих строках.

Заранее спасибо за любые ответы!

1 Ответ

2 голосов
/ 07 апреля 2020

Вы включили материал в верхней части вашего загрузчика, где он будет выполняться первым. Вместо этого включите дополнительные функции, если они не находятся в основном пути выполнения и доступны только по вызову.


Пожалуйста, попробуйте. Согласно комментариям я отредактировал код

boot.asm:

[bits 16]
[org 0x7c00]

boot:
  xor ax, ax
  mov ds, ax        ; set up DS to make sure it matches our ORG

  mov si, boot_string_00
  call println

  mov si, boot_string_01
  call println

finish:       ; fall into a hlt loop to save power when we're done
  hlt
  jmp finish


%include "printf.asm"      ; not reachable except by call to labels in this file
%include "text.S"


times 510-($-$$) db 0
dw 0xaa55

printf.asm:

print:
        mov ah, 0x0E      ; call number for int 0x10 screen output

print_loop:
        lodsb
        test al, al
        je print_done
        int 0x10
        jmp print_loop

print_done:
        ret

println:
  call print
  mov si, line_end
  call print
  ret

text.S:

boot_string_00: db "Placeholder OS Title v0.0.1", 0
boot_string_01: db "Loading Operating system", 0
line_end:       db 0xD, 0xA, 0

(Примечание редактора: сам исправил этот код, вместо того, чтобы пытаться описать изменение в комментариях)

...