gpt4 book ai didi

assembly - 如何将以下NASM代码转换成AT&T语法来修复 "cannot handle non-absolute segment in jmp"错误

转载 作者:行者123 更新时间:2023-12-04 01:49:27 24 4
gpt4 key购买 nike

我是 AT&T 语法的新手。为了便于理解,我想将以下 NASM 语法代码转换为 AT&T 语法。

我尝试将其转换为 AT&T 语法:

lgdt (gdtpointer)

jmp $gdtcode, $_start

gdt:
.quad 0x0000000000000000

gdtcode:
.word .- gdt
.quad 0x0020980000000000

gdtdata:
.word .- gdt
.quad 0x0000900000000000

gdtpointer:
.word .-gdt-1
.quad gdt

Error: can't handle non absolute segment in `jmp'

NASM 代码:

lgdt [gdt.pointer]          

jmp gdt.code:startLongMode

;Global Descriptor Table
gdt:
dq 0x0000000000000000

.code equ $ - gdt
dq 0x0020980000000000

.data equ $ - gdt
dq 0x0000930000000000

.pointer:
dw $-gdt-1
dq gdt

;Ref: Intel System Programming Manual V1 - 2.1.1.1

最佳答案

在 GAS 中,由于 GDT 的定义出现在 jmp $gdtcode, $_start 之后,汇编程序将看到 JMP 并相信符号 gdtcode 是一个外部符号(将由链接器重新定位)而不是常量。因此,它会提示非绝对引用。

您还通过将 .word .- gdt 放在 gdtcode:gdtdata 之后不正确地定义了 GDT。这些行会在您不需要的地方向 GDT 发送一个 16 位字。

我相信您可能一直在尝试以下内容。 GDT 是在JMP的某个时间点定义的:

gdt:
.quad 0x0000000000000000

gdtcode:
.quad 0x0020980000000000

gdtdata:
.quad 0x0000900000000000

gdtpointer:
.word .-gdt-1
.quad gdt

CODE64_SEL = gdtcode-gdt
DATA64_SEL = gdtdata-gdt

然后在稍后的文件中您可以像这样使用 FAR JMP:

jmp $CODE64_SEL, $_start

关于assembly - 如何将以下NASM代码转换成AT&T语法来修复 "cannot handle non-absolute segment in jmp"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53934625/

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