Day2:寻址方式、标志寄存器、JCC指令
寻址方式、标志寄存器、JCC指令
寻址方式
| 寻址方式 | 示例 | 典型用途 |
|---|---|---|
| 立即数寻址 | mov eax,42 | 加载常数 |
| 寄存器寻址 | add eax,ebx | 寄存器运算 |
| 直接寻址 | mov eax,[0x8040000] | 访问全局变量 |
| 寄存器间接寻址 | mov eax,[esi] | 指针解引用 |
| 基址寻址 | mov [ebp-4],ecx | 栈帧局部变量 |
| 变址寻址 | mov eax,[esi*4] | 数组遍历 |
| 基址变址寻址 | mov eax,[ebx+esi*2+8] | 结构体,多维数组 |
| 相对寻址 | jmp label | 跳转,函数调用 |
标志寄存器
| 标志位 | 名称 | 作用 |
|---|---|---|
| CF | Carry Flag 进位标志位 | 最高位发生进位/借位时置1 |
| PF | Parity Flag 奇偶标志位 | 1的个数为偶数时置1 |
| AF | Auxiliary Carry Flag 辅助进位标志位 | bit3和bit4之间发生进位/借位时置1 |
| ZF | Zoro Flag 零标志位 | 为0时置1 |
| SF | Sign Flag 符号标志位 | 最高位为1(负数)时置1 |
| OF | Overflow Flag 溢出标志位 | 有符号数溢出时置1 |
| DF | Direction Flag 方向标志位 | 为1时从高位到低位处理字符串,std打开,cld关闭 |
| IF | Interrupt Flag 中断标志位 | 为1时可以响应中断请求,sti打开,cli关闭 |
| TF | Trap Flag 陷阱标志位 | 为1时会触发异常,被调试器捕获,用于单步调试 |
JCC指令
TEST指令:TEST op1,op2
将两个操作数进行&操作(op1 & op2)并更新标志位:
CF=0,OF=0
&结果为0:ZF=1
结果最高位为1:SF=1
CMP指令:CMP op1,op2
进行减法操作(op1 - op2)并更新标志位:
若op1 < op2(发生借位),CF=1
若发生有符号溢出,OF=1
op1 == op2(结果为0),ZF=1
op1 < op2(结果为负数),SF=1
JCC指令:JCC Label
指令 条件 描述 JMP 无条件 无条件跳转 JE / JZ ZF=1 Jump if Equal / Jump if ZF JNE / JNZ ZF=0 Jump if Not Equal / Jump if Not ZF JS SF=1 Jump if SF JNS SF=0 Jump if Not SF JP / JPE PF=1 Jump if PF / Jump if Parity Even JNP / JPO PF=0 Jump if Not PF / Jump if Parity Odd JO OF=1 Jump if OF JNO OF=0 Jump if Not OF JB / JNAE / JC CF=1 Jump if Below / Jump if Not Above or Equal / Jump if CF JNB / JAE / JNC CF=0 Jump if Not Below / Jump if Above or Equal / Jump if Not CF JBE / JNA CF=1 或 ZF=1 Jump if Below or Equal / Jump if Not Above JA / JNBE CF=0 且 ZF=0 Jump if Above / Jump if Not Below or Equal JL / JNGE SF ≠ OF Jump if Less / Jump if Not Greater or Equal JGE / JNL SF = OF Jump if Greater or Equal / Jump if Not Less JLE / JNG ZF=1 或 SF ≠ OF Jump if Less or Equal / Jump if Not Greater JG / JNLE ZF=0 且 SF = OF Jump if Greater / Jump if Not Less or Equal
Day2:寻址方式、标志寄存器、JCC指令