第五课 标志寄存器
EFL拆开就是上面的各个标志位
例:202(001000000010)对照下图
1.运算结构标志位
- CF位(进位标志):表示最高位有没有进位,借位不算
- PF位(辅助标志):表示运算结果中最低有效字节“1”的个数是否是偶数,偶数则为1,奇数反之
(最低有效字节也就是0000 0010 0000 0011 最后两个字节,8、16、32位都看最后两个字节)
- AF位(辅助进位标志):表示低4位的相加是否有进位,有进位则为1,比如32位0555FFFF就是看第四位(加粗)有没有进位,16位时05FF就看第二位有没有进位,8位时5F就看第一位有没有进位
- ZF位(零标志):表示运算结果是否为0,是则为1(判断运算结果是否为1)
注: mov eax,0
不影响标志寄存器,因为mov是赋值操作不是运算
- SF位(符号标志):反映运算结果的符号位,与运算结果的最高位相同,因为如果是运算结果的最高位即表示正负(7F:01111111)+2=(81:10000001)
如al 7F+2
或者ax 7fff+2
SF才能进1
- OF位(溢出标志):表示有符号数加减运算所得结果是否溢出(先大概可以理解成有符号计算看OF,无符号计算看CF)
2.状态控制标志位
- DF(方向标志位):在串处理指令中,每次操作后,如果DF=0,则esi、edi递增,如果DF=1,则esi、edi递减。(可以用在movsw命令中,当DF=1时,edi和esi-4)
3.命令
ADC与SBB
ADC:目前理解是不仅计算了1+2,还加上了进位标志的1
标志位都清空,留下CF为1,等一下可以演示出CF的1被加上的效果
1+2本应为3,但是此时计算结果是4,说明CF进位的1被加上了
SBB:与加法相同,4-2-1
XCHG命令
XCHG:交换寄存器数据(不可交换立即数)
movs命令
简写:
注意:
1、只能使用EDI和ESI两个寄存器(寄存器里面需要是地址)
2、只是mov拷贝操作
3、ESI和EDI都进行了加4的操作,方便下一个值的赋值,这里加4还是加2取决于movd还是movw,加还是减取决于DF标志位
4、堆栈地址不变
STOS命令
注:
1、和MOVS命令一样执行后EDI地址会加或减
2、加或减一样受DF标志控制
3、注意数据宽度
4、得用简写,不知道为什么具体写会语法错误
REP命令
注意:
1、用完后ecx会清空
2、不能用cx去定义,最后循环几次是看整个ecx寄存器
作业:
第六课 JCC命令
JMP:修改EIP
CALL:push 下一条语句地址(栈顶+4)+修改eip
CMP:相减后不保留相减结果保留零标志位结果(用于判断两数是否相等,相等时相减即是0,零标志位为1)
TEST:两个数值进行与操作,结果不保存,改变标志位(用于确定某个寄存器是否等于0)
JCC指令:
JCC指令 | 中文含义 | 英文原意 | 检查符号位 | 典型C应用 |
JZ/JE | 若为0则跳转;若相等则跳转 | jump if zero;jump if equal | ZF=1 | if (i == j);if (i == 0); |
JNZ/JNE | 若不为0则跳转;若不相等则跳转 | jump if not zero;jump if not equal | ZF=0 | if (i != j);if (i != 0); |
JS | 若为负则跳转 | jump if sign | SF=1 | if (i < 0); |
JNS | 若为正则跳转 | jump if not sign | SF=0 | if (i > 0); |
JP/JPE | 若1出现次数为偶数则跳转 | jump if Parity (Even) | PF=1 | (null) |
JNP/JPO | 若1出现次数为奇数则跳转 | jump if not parity (odd) | PF=0 | (null) |
JO | 若溢出则跳转 | jump if overflow | OF=1 | (null) |
JNO | 若无溢出则跳转 | jump if not overflow | OF=0 | (null) |
JC/JB/JNAE | 若进位则跳转;若低于则跳转;若不高于等于则跳转 | jump if carry;jump if below;jump if not above equal | CF=1 | if (i < j); |
JNC/JNB/JAE | 若无进位则跳转;若不低于则跳转;若高于等于则跳转; | jump if not carry;jump if not below;jump if above equal | CF=0 | if (i >= j); |
JBE/JNA | 若低于等于则跳转;若不高于则跳转 | jump if below equal;jump if not above | ZF=1或CF=1 | if (i <= j); |
JNBE/JA | 若不低于等于则跳转;若高于则跳转 | jump if not below equal;jump if above | ZF=0或CF=0 | if (i > j); |
JL/JNGE | 若小于则跳转;若不大于等于则跳转 | jump if less;jump if not greater equal | SF != OF | if (si < sj); |
JNL/JGE | 若不小于则跳转;若大于等于则跳转; | jump if not less;jump if greater equal | SF = OF | if (si >= sj); |
JLE/JNG | 若小于等于则跳转;若不大于则跳转 | jump if less equal;jump if not greater | SF != OF 或 ZF=1 | if (si <= sj); |
JNLE/JG | 若不小于等于则跳转;若大于则跳转 | jump if not less equal;jump if greater | SF=0F 且 ZF=0 | if(si>sj) |
注:低于高于表示无符号数,小于大于表示有符号数
作业
1、call把返回地址压入栈,再把eip指向函数地址(eip变成立我们要跳转执行的地址)
2、把原先call压进去的返回地址弹出来了,栈顶+4,eip指向返回地址
第七课 堆栈图
1.函数
函数的入口
汇编中的函数
函数有入口出口,但不一定有返回值和参数
2、堆栈
windows堆栈:
什么是堆栈平衡: