5

我正在将 NASM 源“移植”到 GAS,我发现了以下代码行:

push byte 0
push byte 37

GAS 不允许“push byte”或“pushb”。

我应该如何将上面的代码翻译成 GAS 语法?

谢谢

4

2 回答 2

4

pushb已从 GAS 中删除。您应该能够使用该push命令来获得相同的效果。更多信息在这里

于 2009-04-05T01:20:48.710 回答
3

1) push byte在 NASM 2.11 64 位编译为与 just 相同push,除了如果推送的内容大于一个字节,它会拒绝编译:

push 0x0000
push 0x01
push 0x0001
push 0x10

是相同的:

push byte 0x0000
push byte 0x01
push byte 0x0001
push byte 0x10

但以下失败:

push byte 0x0100
push byte 0x1000
push byte 0x01000000
push byte 0x10000000

所有这些都编译成6a XX指令的形式。

2) NASM和GAS根据操作数大小自动决定使用什么形式:

气体 2.25:

push $0x0000
push $0x01
push $0x0001
push $0x10
push $0x0100
push $0x1000
push $0x01000000
push $0x10000000

编译为与 NASM 相同:

push 0x0000
push 0x01
push 0x0001
push 0x10
push 0x0100
push 0x1000
push 0x01000000
push 0x10000000

转储:

   0:   6a 00                   pushq  $0x0
   2:   6a 01                   pushq  $0x1
   4:   6a 01                   pushq  $0x1
   6:   6a 10                   pushq  $0x10
   8:   68 00 01 00 00          pushq  $0x100
   d:   68 00 10 00 00          pushq  $0x1000
  12:   68 00 00 00 01          pushq  $0x1000000
  17:   68 00 00 00 10          pushq  $0x10000000

因此,push在 GAS 中与push byte在 NASM 中相同,但没有错误检查。

3) GAS中确实存在的修饰符w如下:

pushw $0

编译为:

0:   66 6a 00                pushw  $0x0

即,添加0x66前缀以切换 16 位操作。

NASM 的等价物是:

push word 0

4)不同之处mov在于我们无法控制任意推送大小:它们都是将固定数量推送到堆栈。

我们可以控制指令编码的唯一参数是是否包含0x66前缀。

其余的由段描述符确定。请参阅Intel 64 和 IA-32 架构软件开发人员手册 - 第 2 卷指令集参考 - 325383-056US 2015 年 9 月

于 2015-11-09T16:59:26.973 回答