x86汇编语言入门基础(三)汇编指令篇1 逻辑位运算
x86汇编指令介绍
x86指令格式:助记符 mnemonic + 操作数 operand
操作数:表示此次操作需使用的数据,x86指令的操作数可以是寄存器REG、内存地址MEM、立即数IMM
*x86指令最多只能包含一个内存位置(处理器管线pipeline的设计,每条指令只能执行一次内存读取),
例如add [0x12345678], [0x87654321]
是无效的指令(一次使用了两个内存地址)

用词说明:
- 助记符, 即mnemonic
- 目的操作数,即destination、operand1、op1
- 源操作数,即source、operand2、op2
不同指令的操作数“取值范围”不同:寄存器reg/内存地址mem/立即数imm
逻辑位运算
AND, OR, XOR
指令格式:助记符 目的操作数, 源操作数
- 与AND、或OR、异或XOR,这三个指令都需要两个操作数,按位进行逻辑运算;
- 目标操作数op1:只能是寄存器reg或内存地址mem;
- 源操作数op2:可以是寄存器reg、内存地址mem、立即数imm;
典型应用场景
- AND 指令常用于清零特定位(用0掩码)或保留特定位(用1掩码);
- OR 指令常用于设置特定位为1(用1掩码), 例如:
- 将eax的值全设为1:
or eax, 0xffffffff
; - 将eax的最高位设为1:
or eax, 0x80;
- 将eax的值全设为1:
- XOR 指令常用于对某个寄存器进行清零,例如:
xor eax, eax
;
AND “与”门真值表
OR “或”门真值表
XOR “异或”门真值表
TEST
指令格式:test op1, op2
对两个操作数按位进行“AND 与”操作,但不会保存运算结果,仅设置标志寄存器的flag状态。
- 目标操作数op1:只能是寄存器reg或内存地址mem;
- 源操作数op2:可以是寄存器reg、内存地址mem、立即数imm;
应用场景
- 检查寄存器是否位0,例如:
test eax, eax ; jnz
;
- 检查AL最低位是否为1,例如:
test AL, 0x01;
NOT
指令格式:not 目标操作数(REG/MEM)
计算补码(可以理解为把二进制表示下的所有0变为1,把所有1变为0,取反)
- 操作数必须为寄存器REG或内存地址MEM
x86汇编指令文档阅读指引
coder32 edition | X86 Opcode and Instruction Reference 1.12
初阶阅读指引
- CTRL+F 查找指令
- 最右列description, notes:查看指令的功能描述和额外的备注信息
- 查看op1、op2:指令操作的数据
文档中的字段意义
- pf:预取标志(Prefetch Flag),指示指令是否支持预取操作。
- 0F:这是一个特定的操作码前缀,用于扩展指令集,允许更多的操作码组合。
- po:操作码(Opcode),指令的编码,用于标识具体的指令。
- so:源操作数(Source Operand),指令操作的数据源。
- o:操作数(Operand),指令操作的数据。
- pr:前缀(Prefix),用于修改指令的行为,如操作数大小前缀、地址大小前缀等。
- oc:操作码扩展(Opcode Extension),用于进一步扩展指令集,允许更多的操作码组合。
- st:状态(Status),指示指令的状态,如是否已测试、是否修改等。
- m:修改(Modify),指示指令是否修改了某些状态或寄存器。
- rl:读取(Read),指示指令是否读取了某些状态或寄存器。
- x:执行(Execute),指示指令是否执行了某些操作。
- mnemonic:助记符(Mnemonic),指令的名称,用于表示指令的功能。
- op1, op2, op3, op4:操作数(Operands),指令操作的数据,可以是寄存器、内存地址、立即数等。
- iext:指令扩展(Instruction Extension),用于进一步扩展指令集。
- tested:测试(Tested),指示指令是否已经过测试。
- f:标志(Flag),指示指令是否影响某些标志寄存器。
- modif:修改(Modify),指示指令是否修改了某些标志寄存器。
- def:定义(Define),指示指令是否定义了某些标志寄存器。
- undef:未定义(Undefined),指示指令是否未定义某些标志寄存器。
- f values:标志值(Flag Values),指示指令执行后标志寄存器的值。
- description, notes:描述和备注(Description, Notes),提供指令的功能描述和额外的备注信息。
“记住,没有人能记住所有的x86指令。无论你是在编写x86代码,还是在阅读x86程序,只要遇到不理解的地方,就要自己查找相关信息,因此快速查找的能力很关键。我们总是打开这个标签(tab)以便快速查找:http://ref.x86asm.net/coder32.html。” --摘自《x86 汇编与逆向工程:软件破解与防护的艺术》