![]() |
1
8
cpu简单地解码指令。在8086的情况下,第一个字节告诉处理器要获得多少。它不一定是第一个字节,第一个字节必须以某种方式表明你需要得到更多,更多可以表明你需要更多。对于像x86系列这样的8位指令集,您从一个字节开始,然后查看需要多少字节,并且还未对齐,因此必须将指令流视为字节流才能对其进行解码。 你应该自己编写一个非常简单的指令集模拟器,只有少量的指令,也许足以加载一个寄存器,添加一些东西,然后循环。对于你想理解的东西来说,这是非常有教育意义的,如果要写的话,可能需要半个小时。 |
![]() |
2
7
TLDR:解决方案比固定大小的阵列更复杂。 这都是关于上下文的,这就是为什么像IDA这样的反汇编器有复杂的算法来实现这一点。 对于x86,指令的长度是可变的。但如果你知道指令的开始,你就知道指令的结束。正因为如此,你可能知道下一个故事从哪里开始。我将很快解释例外情况。但首先,这里有一个例子:
说明:
移动到eax是
请注意,这两个指令(
例外情况:跳转/调用可能会变得棘手。可以跳转到 “指令中间” …但仍然执行。 让我们看看:
机器代码:
如果我们稍后有一条jmp指令跳转到上述指令的第三个字节的地址(在它中间的某个位置),它只会执行3个NOP(无操作),然后跳转到它后面的下一条指令(不将eax设置为0x909090)。这是因为
|
![]() |
Ruslan · 我需要检查CPUID.01:EDX[5]吗? 6 月前 |
![]() |
M Rajoy · DOS中断10与AX 700 7 月前 |
![]() |
rdre8 · x86指令,堆栈指针解释 11 月前 |
![]() |
user997112 · AVX512执行512位8位字符的AND 1 年前 |
![]() |
St.Antario · 两个连续的语句是否排列在一起? 1 年前 |
![]() |
spyblock · 试图将值传递到保留字节 1 年前 |