七.标志寄存器
Push指令:
- PUSH r32
- PUSH r16
- PUSH m16
- PUSH m32
- PUSH imm3/imm16/imm32
POP指令
POP时加几取决于后面容器的宽度
- POP r32
- POP r16
- POP m16
- POP m32
PUSHAD指令:
PUSHAD指令压入32位寄存器,其入栈顺序是:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI .
POPAD指令
1.POPAD指令则是PUSHAD指令的逆操作。
2.POPAD指令则是PUSHAD指令的逆操作。POPAD指令按照与上面相反的顺序依次弹出寄存器的值。顺序为EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX.
3.PUSHAD POPAD不会影响标志位
- 进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0.
- 奇偶标志PF(Parity Flag):奇偶标志PF用于反应运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0.
- 辅助进位标志AF:
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0
- .在字操作时,发生低字节向高字节进位或借位时
- .在字节操作时,低4位向高4位进位或借位时。
- 零标志ZF:
零标志ZF用来反映运算结果是否为0。
如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志。
- 符号标志SF:
符号标志SF用来反映运算结果的符号位,他与运算结果的最高位相同。
- 溢出标志OF:
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。
如果运算结果超出当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被置为0。
最高位进位与溢出的区别:
进位标志表示无符号数运算结果是否超出范围。
溢出标志表示有符号数运算结果是否超出范围。
溢出主要是给有符号运算使用的,在有符号的运算中,有如下的规律:
①.正+正=正,如果结果是负数,则说明有溢出
②.负+负=负,如果结果是正数,则说明有溢出
③.正+负,永远都不会有溢出
ADC指令:带进位加法
格式:ADC R/M,R/M/IMM 两边不能同时为内存,宽度要一样
ADC AL,CL
ADC BYTE PTR DS:[12FFC4],2
ADC BYTE PTR DS:[12FFC4],AL
SBB指令:带借位减法
格式:SBB R/M,R/M/IMM 两边不能同时为内存,宽度要一样
SBB AL,CL
SBB BYTE PTR DS:[12FFC4],2
SBB BYTE PTR DS:[12FFC4],AL
XCHG指令:交换数据
格式: XCHG R/M,R/M/IMM 两边不能同时为内存,宽度要一样
XCHG AL,CL
XCHG BYTE PTR DS:[12FFC4],EAX
XCHG BYTE PTR DS:[12FFC4],AL
MOVS指令:移动数据 内存-内存
BYTE/WORD/DWORD
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSB
MOVS WORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSW
MOVS DWORD PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSD
REP指令:按计数寄存器(ECX)中指定的次数重复执行字符串指令
MOV ECX,10
REP MOVSD