【发布时间】:2019-05-24 20:49:55
【问题描述】:
我是 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
【问题讨论】:
-
.word .- gdt实际上将一个单词发送到内存中。.equ是 NASMequ的 GAS 等价物。参见手册:sourceware.org/binutils/docs/as/Equ.html#Equ -
感谢彼得,但我提到的错误仍然存在! :(
-
你用什么命令来组装这个?
-
gcc -Wl,--oformat=binary -Wl,-Ttext=0x7c00 -Wl,--build-id=none -nostartfiles -nostdlib -m32 -o test test.s
-
天哪,非常感谢@MichaelPetch ...
标签: assembly x86 nasm bootloader att