在使用microcorruption进行逆向工程的过程中,我遇到了像mov.b
cmp.b
这样的指令。我在网上查了一下,发现它们被称为“字节操作”。关于mov
和mov.b
之间的差异,堆栈溢出上有a question,但不幸的是,我不能真正理解答案。
所以,我的问题是“字节操作和字操作之间的主要区别是什么?”,特别是mov.b
和mov
,或者cmp
和cmp.b
之间的区别。非常感谢。
发布于 2018-09-17 15:48:42
字节操作在单个字节上操作,字操作在数据字上操作。典型的字长为2、4或8字节,即16位、32位或64位。
假设字长为16位,例如,如果您将字节0x23
写入内存位置0x1000
,则地址0x1000
处的内存的值将更改为0x23
。如果您编写单词0x2342
来寻址0x1000
,那么效果取决于您的机器的字节顺序。在最先存储最低有效字节的小端机器上,地址为0x1000
的内存接收值0x42
,地址为0x1001
的内存接收值0x23
。在大端机器上,情况正好相反。
这同样适用于所有其他指令。
许多现代处理器只有字大小的数据的算术指令,而只有字节大小的指令是特殊的加载和存储指令。在这种架构中,单字节中的数据在加载到寄存器中时被零扩展或符号扩展为全字,因此您可以像对全字进行操作一样对其进行操作。例如,0x80
在零扩展时变为0x0080
,在符号扩展时变为0xff80
。
发布于 2018-09-17 15:59:55
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
https://stackoverflow.com/questions/52371360
复制相似问题