4

我正在将 32 位和 64 位汇编语言文件从 gas 格式转换为 MASM 格式,并且在我的代码中遇到了一条似乎完全有问题的指令。我的意思是,我认为汇编器无法知道操作数的大小,指令是否从内存中获取 8、16、32 或 64 位来执行比较。这是说明:

  • cmp $0, 8(%rsp)

如果指令是以下指令之一,汇编器可能已经根据寄存器计算出要获取和比较的内存操作数的大小:

  • cmp %rax, 8(%rsp)
  • cmp %eax, 8(%rsp)
  • cmp %ax, 8(%rsp)

我原以为指令需要是 cmpb、cmpw、cmpl、cmpq ......但不,我的程序只用 cmp 指令就可以很好地组装它。不幸的是,我不记得这段代码在做什么,而且非常不明显......所以解决这个问题的更简单方法是知道指令在做什么。

有人知道吗?任何人都明白为什么这种语法(未指定操作数大小/类型)甚至允许使用直接操作数?

4

1 回答 1

3

它必须有某种默认值。我在我的机器上试过,上面写着as

Apple Inc version cctools-836, GNU assembler version 1.38

我得到了这些结果:

$ cat example.s 
    cmp $0, 8(%rsp)
$ make example.o
as   -o example.o example.s
$ otool -tV example.o
example.o:
(__TEXT,__text) section
0000000000000000    cmpl    $0x00,0x08(%rsp)

所以在我的机器上,它选择了cmpl. usinggcc而不是as给了我相同的结果,但是 usingclang产生了您期望的错误:

$ clang -c example.s 
example.s:1:2: error: ambiguous instructions require an explicit suffix (could be 'cmpb', 'cmpw', 'cmpl', or 'cmpq')
 cmp $0, 8(%rsp)
 ^
于 2013-01-14T23:51:24.587 回答