【问题标题】:Assembly language: What are the main differences between byte operations and word operations?汇编语言:字节操作和字操作的主要区别是什么?
【发布时间】:2018-09-17 15:38:40
【问题描述】:

在和microcorruption进行逆向工程的过程中,遇到了mov.bcmp.b这样的指令。我在网上查了一下,发现它们被称为“字节操作”。关于movmov.b 之间的差异,堆栈溢出时有a question,但不幸的是,我无法真正理解答案。

所以,我的问题是“字节操作和字操作之间的主要区别是什么?”,特别是mov.bmov,或cmpcmp.b 之间有什么区别。非常感谢。

【问题讨论】:

  • “文字操作”对你没有帮助。英特尔处理器具有不同的 MOV 和 CMP 指令,它们采用 1 字节、2 字节、4 字节或 8 字节操作数。在 AT&T 汇编语法中分别为 b、w、l 和 q。如果从操作数(例如寄存器移动)中可以看出数据大小,则可以省略后缀。

标签: assembly reverse-engineering


【解决方案1】:

字节操作对单个字节进行操作,字操作对数据字进行操作。典型的字长为 2、4 或 8 字节,即 16 位、32 位或 64 位。

假设字长为 16 位,例如,如果将字节 0x23 写入内存位置 0x1000,则地址 0x1000 处的内存值将更改为 0x23。如果您将单词0x2342 写入地址0x1000,则效果取决于您机器的字节序。little endian机器上首先存储最低有效字节,地址0x1000的内存接收值0x42,地址0x1001的内存接收值0x23。在 big endian 机器上,情况正好相反。

这同样适用于所有其他指令。

许多现代处理器只有用于字长数据的算术指令,唯一的字节长指令是特殊的加载和存储指令。在这样的架构中,单个字节中的数据在加载到寄存器时会被零扩展或符号扩展为一个完整的字,因此您可以像操作一个完整的字一样对其进行操作。例如,0x80 在零扩展时变为 0x0080,在符号扩展时变为 0xff80

【讨论】:

    【解决方案2】:

    movcmp中的操作后缀表示操作中要修改的大小。示例:mov $ 2, (% ebx)。将数字 2 移动到 ebx 的 1 个字节还是将数字 2 移动到 ebx 的 4 个字节?大小前缀bwl 用于此目的,分别表示大小为1、2 和4 字节。更多:http://flint.cs.yale.edu/cs421/papers/x86-asm/asm.html

    【讨论】:

    • 这不是一个 x86 问题(AT&T 语法不使用 cmp.b,它应该是 cmpb,但是是的,它是相似的。(% 和 @987654331 之间的空格@ 是有效的。你必须写 %ebx$ 2 可能是有效的,如果奇怪的话。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    相关资源
    最近更新 更多