gpt4 book ai didi

顶部带有 %include 的程序集 - 打印输出意外结果 : just an "S"

转载 作者:行者123 更新时间:2023-12-02 16:43:28 24 4
gpt4 key购买 nike

我对汇编编程还比较陌生,想知道为什么我的代码没有打印出预期的字符串。这个项目在完成后应该是一个引导加载程序。我正在使用命令 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

打印.asm

print:
mov ah, 0x0E

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

.print_done:
cli
ret

文本.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.1加载操作系统

实际输出:

S

另外,我想知道如何在汇编中实现换行符,这样我就可以在字符串中使用 '\n'。

最佳答案

您在引导加载程序的顶部包含了一些东西,它将首先执行。相反,包括不在主要执行路径中且只能通过 call 访问的额外函数。


这应该可行,将 %include 指令放在可以安全放置额外函数或数据的地方,就像将它们全部写入一个文件一样。

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

文本.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

关于顶部带有 %include 的程序集 - 打印输出意外结果 : just an "S",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61072003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com