如何将此代码从Intel(nasm)转换为AT&T(gas)语法?


gdt64:
dq 0 ; zero entry
.code: equ $ - gdt64
; 0x08 kernel CS 0x8
; bits set: descriptor type, present, executable, 64bit
dq (1<<53) | (1<<47) |                     (1<<44) | (1<<43) ; kernel
; 0x10 user CS
; works when its set to kernel mode, but when in user mode, it doesnt, duh
;dq (1<<53) | (1<<47) |                     (1<<44) | (1<<43) ; kernel
dq (1<<53) | (1<<47) | (1<<46) | (1<<45) | (1<<44) | (1<<43)

我知道dq是。long。我可以翻译第一部分:

gdt64:
.long 0 // zero entry
.code = . - gdt64

但是如何翻译这样的行:

dq (1<<53) | (1<<47) | (1<<46) | (1<<45) | (1<<44) | (1<<43)

首先,NASM中的dq汇编了一个8字节的四字,而x86 GAS中的.long是一个4字节的双字,所以这不是您想要的。正确的等效值为.quad

您的(1<<53) | ...只是一个算术表达式,使用类似c的移位和位操作符,dq (1 << 53) | ...组装一个四字,其值为该表达式的结果。GAS也接受这种语法,因此您可以简单地写入

.quad (1<<53) | (1<<47) | (1<<46) | (1<<45) | (1<<44) | (1<<43)

最新更新