底层机器指令学习

intel指令系统为了缩减指令长度,采取的策略是这样的:只有在必要的时候,使用某些字节域,但是有一个域必须存在主操作码。
指令前缀有4种,而且一条指令可以前有多种前缀,每一个前缀占一个字节,在32位指令里,前缀种类的排列顺序不作规定

1] 操作数长度前缀(66H)
对于32位指令系统而言,默认寄存器都是32位的,但是我们不可避免的会使用其他长度地寄存器。如果要使用16位长度的寄存器,只需在指令前加66H,即用操作数长度前缀标记。然而对于8位长度的寄存器,不是通过操作数前缀标记的。后文将说明它和32位操作数长度如何区分的
举例:
mov eax,1 = B8 01000000
mov ax,1 =66 B8 0100
mov al,1 = B0 01
[2] 地址长度前缀(67H)
这个前缀和上一个前缀用法差不多,只不过这个前缀是标记内存地址长度的。学过汇编的人,还应该知道操作数和被操作数中,至多一个是内存操作数。在32位指令系统下,如果内存操作数的长度为16位,则需在指令前加“地址长度前缀”,即67H
[3] 段超越前缀(2eH、3eH、26H、64H、65H、36H)
当使用内存操作数时,无论那种内存操作数寻址都有默认的段寄存器,然而至多一个的内存操作数不使用默认段寄存器时,我们就需要使用段超越前缀
4] 锁定前缀和重复前缀
和协处理器有关,在指令前加F0,表示访问独享

原文地址:https://www.cnblogs.com/HuaiNianCiSheng/p/3420277.html