6.1 关于程序控制类指令说明
仅修改IP会使得程序改变在当前代码段中的执行顺序,修改CS和IP会使得程序走向另一个代码段执行
6.2 无条件转移指令
WORD PTR表示16位
DWORD=double word=32位=4个字节——>4个单元;CS指向高地址单元
- 第一行:SI=1122H
- 第二行:将立即数0120H写入到内存数据段偏移地址是1122H所指向的单元中
- 第三行:SI+2
- 第四行:将0122H写入到内存数据段偏移地址是1122H+2=1124H所指向的单元中
第五行:JMP WORD PTR[SI]——JMP后为16位存储器操作数则说明是段内转移,转移地址放到了内存中;则是段内间接转移,转移目标地址在当前SI所指向的1124H中存放,故IP的值为0122H- 第五行:JMP DWORD PTR[SI-2]——>DWORD类型存储器操作数4字节的(SI-2=1124-2=1122),
故转移的目标地址在1122所指向的这四个单元中
低地址单元的内容是转移目标的偏移地址IP为0120,高地址目标的内容是转移目标的段基地址CS为0122。
6.3 条件转移指令
JC是CF=1转移,JNC是CF=0时转移
而JP和JPE都是PF=1转移
JNP和JPO都是PF=0转移
JCXZ是当CX=0时实现转移
- 前四句是清零相应要存放统计值的单元,然后LEA取首地址以及后一句取串长
- LODSB进行串装入操作将原数据串的一个单元的内容写入AL,因为前面没有前缀故写完后自动实现SI+1后停止。
- OR AL ,AL:按位相或后原数据没有改变而标志位改变可知数的正负性。
- 使用JS指令查看SF为1还是0,若为1表示是负数,则控制程序转向X1的方向执行,MINUS单元会+1(存负数单元)
- JS不为0转向下一条指令JZ,据ZF的值判断是否要跳到X2
- 不跳到X2则顺序执行PLUS单元加1指令
- LODSB已经实现指针的修改,我们还需要实现修改CX的值,判断CX是否为0(是否统计结束)若没有统计完则继续回去JMP NEXT CX-1的位置
- 前面有DEC CX指令,DEC指令会影响到ZF,执行后若ZF=0则会继续跳转到CHECK;若CX=0,则ZF=1,故直接判断ZF状态就知道CX是否减到0
6.4 循环控制指令
- 初始化先取首地址和长度
- 按串操作指令则需要先设定它的方向
- 利用LODSW将首地址第一个字单元的内容放入AX
- 分别将它赋给MAX和MIN单元
- 计数值-1
- 取第二个字并且和MAX及MIN比较
- 第二次再循环到LODSW,LODSW会自动读取一个数并且修改指针,此时已经+2修改过指针了可以继续读取下一个字节
6.5 过程调用指令
断点是调用指令的下一条指令的地址
。
近地址调用要记住偏移地址,远地址调用要记住段基地址和偏移地址
参数保护压入到堆栈保护
先压入段基地址再压入偏移地址
6.6 中断指令
n×4和n×4+1存放的是入口的偏移地址
n×4+2和n×4+3存放的是入口的段地址
- SP=1200H
- 中断指令,类型码是21H
- 断点地址为:6200H:0112H
中断子程序的入口地址:CS=(21H×4)+2;IP=21H×4
6.7 处理器控制指令
6.8 指令系统小结