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

Posted

技术标签:

【中文标题】如何将此代码从 Intel(nasm) 转换为 AT&T(gas) 语法?【英文标题】:How to translate this code from Intel(nasm) to AT&T(gas) syntax? 【发布时间】:2021-01-28 13:41:13 【问题描述】:
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)

【问题讨论】:

不是组装专家,但它不会只是一个设置了相应位的数字吗? 你试过.quad (1&lt;&lt;53) | (1&lt;&lt;47) | (1&lt;&lt;46) | (1&lt;&lt;45) | (1&lt;&lt;44) | (1&lt;&lt;43)吗? 是的,我认为这是一个设置了相应位的数字。 【参考方案1】:

首先,NASM 中的 dq 组装一个 8 字节的四字,而 x86 GAS 中的 .long 是一个 4 字节的双字,所以这不是你想要的。正确的等价物是.quad

您的(1&lt;&lt;53) | ... 只是一个使用类C 移位和位运算符的算术表达式,dq (1 &lt;&lt; 53) | ... 组装了一个四字,其值为该表达式的结果。 GAS 也接受这种语法,所以你可以简单地写

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

【讨论】:

以上是关于如何将此代码从 Intel(nasm) 转换为 AT&T(gas) 语法?的主要内容,如果未能解决你的问题,请参考以下文章

NASM 程序集将输入转换为整数?

如何将此代码从 oracle 转换为 redshift?

如何使用 gcc 生成可以用 nasm 编译的汇编代码 [重复]

如何将此代码转换为 PyQt5?

汇编器的NASM

Vue-Select:如何将此 fetch() 代码转换为使用 axios?