程序控制类指令PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
类指令
转移指令 循环控制 子程序调用 中断控制
3.9 转移指令
通过修改指令的偏移地址或段地址及偏移地 址实现程序的转移
无条件转移指令 无条件转移到目标地址,执行新的指令
有条件转移指令 在具备一定条件的情况下转移到目标地址
无条件转移指令
格式:
JMP OPRD
目标地址
与JMP在 同一代码段
与JMP不在 同一代码段
2)用于无符号数的条件转移指令 ① JA/JNBE ;高于/不低于等于转移,
CF∨ZF=0 ② JNA/JBE ;不高于/低于等于转移,
CF∨ZF=1 ③ JB/JNAE ;低于/不高于等于转移,CF=
1 ④ JNB/JAE ;不低于/高于等于转移,CF=
3)用于带符号数的条件转移指令 ① JG/JNLE 大于/不小于等于转移,(SF ∨OF)∨ ZF=
┇
条件转移指令
在满足一定条件下,程序转移到目标地 址继续执行
条件转移指令均为段内短转移,即转移 范围为: -128~+127
条件转移指令的应用
1)简单条件(直接标志)转移指令(共10条) 根据CF、ZF、SF、OF、PF分别为1或0,共有10种状态,
设置了10种转移指令: JE/JZ JS JO JC JP ;标志为1转移 JNE/JNZ JNS JNO JNC JNP ;标志为0转
格式: CALL FAR PROC
段间调用例
CALL FAR TIMRE CALL DWORD PTR[SI]
段间调用例
格式:
CALL FAR PROC
格式例:
CALL FAR TIMRE
SI
CALL DWORD PTR[SI]
CS
IP
CALL
代
码
┇
段
XXH
XXH
数
XXH
据
XXH
段
返回指令
REPNE SACSB
JZ NEXT
JMP NFOUND NEXT: … NFOUND:…
3.11 子程序调用返回指令
段内调用 段间调用
段内直接调用 段内间接调用 段间直接调用 段间间接调用
调用指令与转移指令的比较
用于调用一个子过程 调用前须保护断点地址 子过程执行结束后要返回原调用处继续
转移指令例(流程图)
将存放各元素个 数的单元清零
取首地址 设串长度
取一个字节数
为负?
N
Y
为零?
Y
N 正数个数加1
负数个数加1
零元素加1
3.10 循环控制指令
控制程序在以当前IP为中心的-128~+127 范围内循环执行
循环次数由CX寄存器指定
LOOP LOOPZ LOOPNZ
无条件循环指令
执行原程序
断点恢复
段内Biblioteka Baidu用
子过程与原调用程序在同一代码 段,在调用之前只需保护断点的
入口 地址
偏移地址
格式: CALL NEAR PROC
断点
近过程名
段内调用例
CALL TIMRE
直接调用
CALL WORD PTR[SI]
间接调用
段间调用
子过程与原调用程序不在同一代码段, 在调用之前需保护断点的段基地址和偏 移地址。先将断点的CS压栈,再压入IP
STRING DB ‘Personal Computer’ …
MOV BX,OFFSET STRING DEC BX MOV CX,17 NEXT: INC BX CMP [BX],BYTE PTR 20H LOOPNE NEXT
…
方法二: MOV DI,OFFSET STRING MOV AL,20H MOV CX,17
0 ② JGE/JNL 大于等于/不小于转移,(SF ∨OF)=0 ③ JL/JNGE 小于/不大于等于转移,(SF ∨OF)=1 ④ JLE/JNG 小于等于/不大于转移,(SF ∨OF)∨ ZF=
1
转移指令例
统计内存数据段中以TABLE为首地 址的100个8位符号数中正数、负数 和零元数的个数。
无条件段内转移 段内间接寻址
JMP BX JMP WORD PTR[BX]
IP
BX=1200
┇
JMP
代
┇
码 段
指令码
┇
XXH XXH
数 据 段
┇
无条件转移指令——段间转移
转移的目标地址不在当前代码段内
指令中直接给 出目标地址
段间直接寻址
由指令中的32位存 储器操作数指出目 标地址
段间间接寻址
无条件段间转移
原则上可实现在整个内存空间的转移
无条件转移指令 段内转移
转移的目标地址在当前代码段内
指令中直接给 出目标地址
由指令中的寄存器 或存储器操作数指 出目标地址
段内直接寻址
段内间接寻址
无条件段内转移
段内直接寻址 JMP Label
近地址标号
位移量
┇
JMP
代
码
┇
段
Label
下一条要执行指令的
┇
偏移地址=当前IP+位移量
从堆栈中弹出断点地址,返回原程序 格式:
RET RET指令一般位于子程序的最后
3.12中断指令
中断与过程调用:
中断是随机事件或异常事件引起,调用则是事 先已在程序中安排好
响应中断请求不仅要保护断点地址,还要保护 PSW内容
调用指令在指令中直接给出子程序入口地址, 中断指令只给出中断向量码,入口地址则在向 量码指向的内存单元中
段内直接寻址
IP
JMP FAR Label
远地址标号
┇
JMP
代
XXH
码
XXH
段
XXH
1
XXH
Label与
CS
┇
代
JMP之间
Label
码
的位移量
段
┇
2
无条件段间转移
段内间接寻址 JMP DWORD PTR[BX]
[BX] IP
CS
代
┇
码
JMP
段 1
┇
代
指令码
码
段
┇
2
XXH
XXH
数
XXH
据
XXH
段
格式: LOOP LABEL
循环条件: CX ≠ 0
操作: DEC CX JNZ 符号地址
条件循环指令
格式:
LOOPZ LABEL LOOPE LABEL 循环条件: CX ≠ 0 ZF=1
格式:
LOOPNZ LABEL LOOPNE LABEL 循环条件: CX ≠ 0 ZF=0
例:在一个由17个字符组成的字符串STRING中,现 在查找该字符串中是否包含空格字符(其ASCII码为 20H),若未找到或尚未查完,则继续查找,直到找 到第一个空格字符或查完了才退出循环。
1. 中断指令
格式: INT n
说明: nх4
中断类型码 n=0 〜 255
n х4
入口的偏移地址 入口的段地址
存放中断服务子程序入口 地址的单元的偏移地址
该单元在数据段,段地址=DS
XXH
XXH
数
XXH
据
XXH
段
┇
代
┇
码 段
中断指令的执行过程
将PSW压入堆栈; 将INT指令的下一条指令的CS、IP压栈; 由n× 4得到存放中断向量的地址; 将中断向量(中断服务程序入口地址)
转移指令 循环控制 子程序调用 中断控制
3.9 转移指令
通过修改指令的偏移地址或段地址及偏移地 址实现程序的转移
无条件转移指令 无条件转移到目标地址,执行新的指令
有条件转移指令 在具备一定条件的情况下转移到目标地址
无条件转移指令
格式:
JMP OPRD
目标地址
与JMP在 同一代码段
与JMP不在 同一代码段
2)用于无符号数的条件转移指令 ① JA/JNBE ;高于/不低于等于转移,
CF∨ZF=0 ② JNA/JBE ;不高于/低于等于转移,
CF∨ZF=1 ③ JB/JNAE ;低于/不高于等于转移,CF=
1 ④ JNB/JAE ;不低于/高于等于转移,CF=
3)用于带符号数的条件转移指令 ① JG/JNLE 大于/不小于等于转移,(SF ∨OF)∨ ZF=
┇
条件转移指令
在满足一定条件下,程序转移到目标地 址继续执行
条件转移指令均为段内短转移,即转移 范围为: -128~+127
条件转移指令的应用
1)简单条件(直接标志)转移指令(共10条) 根据CF、ZF、SF、OF、PF分别为1或0,共有10种状态,
设置了10种转移指令: JE/JZ JS JO JC JP ;标志为1转移 JNE/JNZ JNS JNO JNC JNP ;标志为0转
格式: CALL FAR PROC
段间调用例
CALL FAR TIMRE CALL DWORD PTR[SI]
段间调用例
格式:
CALL FAR PROC
格式例:
CALL FAR TIMRE
SI
CALL DWORD PTR[SI]
CS
IP
CALL
代
码
┇
段
XXH
XXH
数
XXH
据
XXH
段
返回指令
REPNE SACSB
JZ NEXT
JMP NFOUND NEXT: … NFOUND:…
3.11 子程序调用返回指令
段内调用 段间调用
段内直接调用 段内间接调用 段间直接调用 段间间接调用
调用指令与转移指令的比较
用于调用一个子过程 调用前须保护断点地址 子过程执行结束后要返回原调用处继续
转移指令例(流程图)
将存放各元素个 数的单元清零
取首地址 设串长度
取一个字节数
为负?
N
Y
为零?
Y
N 正数个数加1
负数个数加1
零元素加1
3.10 循环控制指令
控制程序在以当前IP为中心的-128~+127 范围内循环执行
循环次数由CX寄存器指定
LOOP LOOPZ LOOPNZ
无条件循环指令
执行原程序
断点恢复
段内Biblioteka Baidu用
子过程与原调用程序在同一代码 段,在调用之前只需保护断点的
入口 地址
偏移地址
格式: CALL NEAR PROC
断点
近过程名
段内调用例
CALL TIMRE
直接调用
CALL WORD PTR[SI]
间接调用
段间调用
子过程与原调用程序不在同一代码段, 在调用之前需保护断点的段基地址和偏 移地址。先将断点的CS压栈,再压入IP
STRING DB ‘Personal Computer’ …
MOV BX,OFFSET STRING DEC BX MOV CX,17 NEXT: INC BX CMP [BX],BYTE PTR 20H LOOPNE NEXT
…
方法二: MOV DI,OFFSET STRING MOV AL,20H MOV CX,17
0 ② JGE/JNL 大于等于/不小于转移,(SF ∨OF)=0 ③ JL/JNGE 小于/不大于等于转移,(SF ∨OF)=1 ④ JLE/JNG 小于等于/不大于转移,(SF ∨OF)∨ ZF=
1
转移指令例
统计内存数据段中以TABLE为首地 址的100个8位符号数中正数、负数 和零元数的个数。
无条件段内转移 段内间接寻址
JMP BX JMP WORD PTR[BX]
IP
BX=1200
┇
JMP
代
┇
码 段
指令码
┇
XXH XXH
数 据 段
┇
无条件转移指令——段间转移
转移的目标地址不在当前代码段内
指令中直接给 出目标地址
段间直接寻址
由指令中的32位存 储器操作数指出目 标地址
段间间接寻址
无条件段间转移
原则上可实现在整个内存空间的转移
无条件转移指令 段内转移
转移的目标地址在当前代码段内
指令中直接给 出目标地址
由指令中的寄存器 或存储器操作数指 出目标地址
段内直接寻址
段内间接寻址
无条件段内转移
段内直接寻址 JMP Label
近地址标号
位移量
┇
JMP
代
码
┇
段
Label
下一条要执行指令的
┇
偏移地址=当前IP+位移量
从堆栈中弹出断点地址,返回原程序 格式:
RET RET指令一般位于子程序的最后
3.12中断指令
中断与过程调用:
中断是随机事件或异常事件引起,调用则是事 先已在程序中安排好
响应中断请求不仅要保护断点地址,还要保护 PSW内容
调用指令在指令中直接给出子程序入口地址, 中断指令只给出中断向量码,入口地址则在向 量码指向的内存单元中
段内直接寻址
IP
JMP FAR Label
远地址标号
┇
JMP
代
XXH
码
XXH
段
XXH
1
XXH
Label与
CS
┇
代
JMP之间
Label
码
的位移量
段
┇
2
无条件段间转移
段内间接寻址 JMP DWORD PTR[BX]
[BX] IP
CS
代
┇
码
JMP
段 1
┇
代
指令码
码
段
┇
2
XXH
XXH
数
XXH
据
XXH
段
格式: LOOP LABEL
循环条件: CX ≠ 0
操作: DEC CX JNZ 符号地址
条件循环指令
格式:
LOOPZ LABEL LOOPE LABEL 循环条件: CX ≠ 0 ZF=1
格式:
LOOPNZ LABEL LOOPNE LABEL 循环条件: CX ≠ 0 ZF=0
例:在一个由17个字符组成的字符串STRING中,现 在查找该字符串中是否包含空格字符(其ASCII码为 20H),若未找到或尚未查完,则继续查找,直到找 到第一个空格字符或查完了才退出循环。
1. 中断指令
格式: INT n
说明: nх4
中断类型码 n=0 〜 255
n х4
入口的偏移地址 入口的段地址
存放中断服务子程序入口 地址的单元的偏移地址
该单元在数据段,段地址=DS
XXH
XXH
数
XXH
据
XXH
段
┇
代
┇
码 段
中断指令的执行过程
将PSW压入堆栈; 将INT指令的下一条指令的CS、IP压栈; 由n× 4得到存放中断向量的地址; 将中断向量(中断服务程序入口地址)