在使用microcorruption进行逆向工程的过程中,我遇到了诸如mov.b
cmp.b
之类的指令。我在网上查询了一下,发现它们被称为“字节操作”。关于mov
和mov.b
之间的区别,有a question堆栈溢出,但是不幸的是,我无法真正理解答案。
因此,我的问题是“字节操作和字操作之间的主要区别是什么?”,尤其是mov.b
和mov
或cmp
和{{1之间的区别是什么? }}。非常感谢。
答案 0 :(得分:1)
字节操作对单个字节进行操作,字操作对数据字进行操作。典型的字长是2、4或8个字节,即16位,32位或64位。
例如,假设一个字长为16位,如果您将字节0x23
写入存储器位置0x1000
,则地址0x1000
处的存储器值将更改为{ {1}}。如果您将单词0x23
写入地址0x2342
,则效果取决于计算机的 endianess。在 little endian 机器上,其最低有效位首先存储字节,地址0x1000
的存储器接收值0x1000
,地址0x42
的存储器接收值0x1001
。在 big endian 机器上,情况恰恰相反。
所有其他说明也是如此。
许多现代处理器仅对字大小的数据使用算术指令,而只有字节大小的指令是特殊的加载和存储指令。在这样的体系结构中,将单个字节中的数据加载到寄存器时会零扩展或符号扩展为一个完整的字,因此您可以像对一个完整的字一样对其进行操作。例如,0x23
在零扩展时变成0x80
,而在符号扩展时变成0x0080
。
答案 1 :(得分:1)
mov
和cmp
中的后缀表示将在操作中修改的大小。示例:mov $ 2, (% ebx)
。是将数字2移至ebx的1个字节,还是将数字2移至ebx的4个字节?大小前缀b
,w
和l
用于此目的,分别指示1、2和4个字节的大小。有关更多信息:http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html