我正在将32位和64位汇编语言文件从gas转换为MASM格式,并在我的代码中遇到一条似乎完全有问题的指令。我的意思是,我看不到汇编器无法知道操作数的大小,无论指令是从内存中提取8位,16位,32位还是64位来执行比较。这是说明:
如果该指令是以下指令之一,则汇编器可能已经确定了要根据寄存器进行提取和比较的内存操作数的大小:
我以为该指令需要是cmpb,cmpw,cmpl,cmpq ...,但是不,我的程序只用cmp指令就可以很好地进行汇编。不幸的是,我不记得这段代码在做什么,并且它不是很明显。因此解决此问题的更简单方法是知道指令在做什么。
有人知道吗?谁能理解为什么立即操作数甚至允许使用此语法(未指定操作数大小/类型)?
它必须具有某种默认值。我在机器上尝试过,说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
。使用gcc
而不是as
可以得到相同的结果,但是使用clang
会产生您期望的错误:
$ 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)
^