【发布时间】:2012-12-29 00:41:10
【问题描述】:
我正在将 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 指令就可以很好地组装它。不幸的是,我不记得这段代码在做什么,而且非常不明显......所以解决这个问题的更简单方法是知道指令在做什么。
有人知道吗?任何人都明白为什么这种语法(未指定操作数大小/类型)甚至允许使用直接操作数?
【问题讨论】:
-
组装的时候选哪个?
-
这是我的问题。我不知道!
-
最简单的判断方法是先用gas组装,再用objdump拆。 (操作数大小在几年前默认为 32 位,并且有一个警告。我不确定它现在是什么,在 64 位代码中)
-
但是在查看反汇编后,它似乎正在获取一个 32 位操作数。但是为什么,特别是因为这是一个 64 位模式程序和 64 位汇编语言,并且指令中指定的唯一寄存器是 %rsp,它是一个 64 位寄存器。
-
看起来那样。只要我能确定,我就没事。但这不是一个非常危险的情况吗?我的意思是,gas 语法在使类型清晰方面非常过分。
标签: assembly x86-64 gnu-assembler att cmp