如何将下面的NASM代码转换成AT&T语法来修复"cannot handle non-absolute segment in jmp"错误
How to convert the following NASM code into AT&T syntax so as to fix the "cannot handle non-absolute segment in jmp" error
我是 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
是一个外部符号(将由链接器重新定位)而不是常量。因此,它会抱怨非绝对引用。
您还通过在 gdtcode:
和 gdtdata
之后放置 .word .- gdt
不正确地定义了 GDT。这些行将向 GDT 发出一个 16 位字,而您不需要它们。
我相信您可能一直在尝试以下内容。 GDT 定义在 before the 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
我是 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
是一个外部符号(将由链接器重新定位)而不是常量。因此,它会抱怨非绝对引用。
您还通过在 gdtcode:
和 gdtdata
之后放置 .word .- gdt
不正确地定义了 GDT。这些行将向 GDT 发出一个 16 位字,而您不需要它们。
我相信您可能一直在尝试以下内容。 GDT 定义在 before the 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