如何将NASM“推送字节”翻译成GAS语法?

时间:2009-04-05 00:19:50

标签: assembly stack nasm gas

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

push byte 0
push byte 37

GAS不允许“推送字节”或“推送”。

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

由于

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

在NASM 2.11中,

1) push byte 64位编译为与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会根据操作数大小自动决定使用哪种表单:

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

objdump的:

   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

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

3) GAS中存在 的修饰符为w,如下所示:

pushw $0

编译为:

0:   66 6a 00                pushw  $0x0

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

NASM的等同物是:

push word 0

4)mov的区别在于我们无法控制任意推送大小:它们都是固定数量的堆栈。

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

其余部分由段描述符确定。请参阅Intel 64 and IA-32 Architectures Software Developer’s Manual - Volume 2 Instruction Set Reference - 325383-056US September 2015