gpt4 book ai didi

assembly - 如何在 AT&T 程序集中正确定位变量?

转载 作者:行者123 更新时间:2023-12-04 21:47:10 24 4
gpt4 key购买 nike

我正在练习使用汇编(使用 AT&T 语法和 gnu/gas)编写 bootstrap 。小程序被组装和链接,然后复制到虚拟磁盘的第一个扇区。 BIOS 会将其加载到 0000:7c00 ,问题来了。 call hello翻译自 call 0010call 7c10在运行过程中。但是movw $message, %as不会搬迁。 ax还在0026 ,不是 7c26 .结果是我做不到Hello World屏幕上。相反,一些随机数据位于 0000:0026将显示在屏幕上。

如何在启动过程中使其正确?我应该使用一些指令更改 asm 源代码吗?或者我应该更改我的链接脚本?

谢谢!

.text
.global _start
.code16

_start:
movw %cs, %ax
movw %ax, %ds
movw %ax, %es
call hello
jmp .

.org 0x10

hello:
movw $message, %ax
movw %ax, %bp
movw $13, %cx
movw $0x1301, %ax
movw $0x000c, %bx
movb $0, %dl
int $0x10
ret

message:
.ascii "Hello, World!"

.org 0x01fe
.byte 0x55
.byte 0xaa

我使用以下汇编和链接脚本
as -o boot.o boot.s  
//generate object code

ld -Ttext 0x0 -e _start -s -o boot.out boot.o
//relocate .text to 0x0
//entry is _start

objcopy -O binary -j .text boot.out boot
//copy .text section to boot

vboxmanage convertfromraw boot boot.vdi --format VDI
//create vdi for virtual box

最佳答案

我发现主要问题在于您编译代码的方式。

使您的代码正常工作的正确步骤应该是:

as boot.s -c -o boot.o
ld --oformat binary --Ttext 0x7C00 -o boot.bin boot.o

请注意,正如其他人所说,我正在通过 --Ttext 0x7C00 ld 的参数, 强制它在该地址重新定位您的代码。

作为额外的建议,请尝试像这样构建您的代码:
.text
.global _start
.code16

_start:
jmp stage1_start

...

stage1_start:

<your bootloader here>

请注意,这与 BIOS 代码查看硬盘驱动器的方式一致,因为在 2 个字节(第一条跳转指令的长度)之后,您应该放置磁盘描述表。

此外,您可以在更多 as 中重构您的最后一条指令。 -像这样的语法:
. = _start + 0x0200 - 2
.short 0x0AA55

.变量是位置计数器。看 this page有关此计数器如何工作的更多信息(在 ld 的上下文中,而不是 as )。

希望这可以帮助!

关于assembly - 如何在 AT&T 程序集中正确定位变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12650291/

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