我正在将 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 指令就可以很好地组装它。不幸的是,我不记得这段代码在做什么,而且非常不明显......所以解决这个问题的更简单方法是知道指令在做什么。
有人知道吗?任何人都明白为什么这种语法(未指定操作数大小/类型)甚至允许使用直接操作数?