gpt4 book ai didi

gcc - 有没有办法在 gnu 汇编常量中使用数学表达式?

转载 作者:行者123 更新时间:2023-12-03 21:27:46 28 4
gpt4 key购买 nike

执行以下操作的正确 gnu 程序集语法是什么:

.section .data2
.asciz "******* Output Data ********"
total_sectors_written: .word 0x0
max_buffer_sectors: .word ((0x9fc00 - $data_buffer) / 512) # <=== need help here
.align 512
data_buffer: .asciz "<The actual data will overwrite this>"

具体来说,我正在编写一个玩具操作系统。上面的代码是在 16 位实模式下。我正在设置一个将转储回启动盘的数据缓冲区。我想计算 data_buffer 之间的扇区数被放置在内存中,以及该数据缓冲区的上限。 (地址 0x9fc00 是缓冲区将运行到为其他目的保留的 RAM 的地方。)

我知道我可以编写汇编代码来计算这个;但是,由于它是构建时已知的常数,我很好奇是否可以让汇编程序为我计算它。

我遇到了三个具体问题:

(1) 如果我使用 $data_buffer我收到此错误:
os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: can't resolve `L0' {*ABS* section} - `$data_buffer' {*UND* section}

我觉得很困惑,因为我应该使用 $当我想要标签的内存地址时,对吗?

(2) 如果我使用 data_buffer而不是 $data_buffer ,我收到此错误:
os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: value of 653855 too large for field of 2 bytes at 31
make: *** [obj/boot/dd_test.o] Error 1

这似乎表明汇编程序提示中间值的大小(不需要适合 16 位字)。

(3) 当然,缺少的 ')' 是怎么回事?

最佳答案

当您在 GNU 汇编器中使用表达式时,它们必须解析为绝对值。 GNU 汇编器不知道代码的原点实际上是什么。这就是链接器的用途。因此data_buffer绝对地址在链接完成之前是未知的,因此它被认为是可重定位的。如果你取一个绝对值,比如 0x9fc00 并从中减去一个可重定位的值,你就会得到一个可重定位的值。不能在常量(绝对)表达式中使用可重定位的值。

一切都没有丢失。一旦链接器在内存中安排了所有内容,它就会知道绝对地址。您似乎建议您已经使用了链接描述文件,这意味着您要做的工作很少。您可以使用链接器来计算 max_buffer_sectors 的值.

你的链接脚本会有一个 SECTIONS指令如:

SECTIONS
{
[your section contents here]
}

您可以创建链接器符号 max_buffer_sectors像这样:
SECTIONS
{
max_buffer_sectors = (0x9fc00 - (data_buffer)) / 512;
[your section contents here]
}

这将允许链接器计算大小,因为它知道 data_buffer内存中的绝对地址。

您的 GNU 汇编文件需要进行一些调整:
.globl data_buffer

.section .data2
.asciz "******* Output Data ********"
total_sectors_written: .word 0x0
.align 512
data_buffer: .asciz "<The actual data will overwrite this>"

你会注意到我使用了 .globl data_buffer .这会导出符号并使其成为全局的,以便链接器可以使用它。

然后您可以使用符号 max_buffer_sectors在代码中,如:
mov $max_buffer_sectors, %ax

关于gcc - 有没有办法在 gnu 汇编常量中使用数学表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43766489/

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