问题描述
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)