我正在将32位和64位汇编语言文件从gas转换为MASM格式,并在我的代码中运行了一条似乎完全有问题的指令。我的意思是,我认为汇编程序无法知道操作数的大小,指令是否从内存中取出8,16,32或64位来执行比较。这是指令:
如果指令是以下之一,汇编器可能已根据寄存器计算出内存操作数的大小以进行读取和比较:
我原本以为指令需要是cmpb,cmpw,cmpl,cmpq ...但不,我的程序只用cmp指令就可以很好地组装。不幸的是,我不记得这段代码在做什么,而且非常不明显......所以解决这个问题的更简单方法就是知道指令在做什么。
有人知道吗?任何人都明白为什么这个语法(操作数大小/类型未指定)甚至允许使用立即操作数?
答案 0 :(得分:1)
必须有某种默认值。我在我的机器上试过,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)
^