顺序、分支、循环程序设计
顺序
顺序结构:指令按照在内存中存放的地支顺序一次执行,没有任何流程改变
eg:Z=(3X+Y-5)/2
分析:三个变量XYZ,用三个内存单元来表示
算法分析:
- 3X:2X+X 一条移位指令和一条加法指令
- 3X+Y-5:一条加法指令和一条减法指令
- (3X+Y-5)/2:右移指令
流程图
分支
双分支
根据条件满足与否,分别执行两段程序或者绕过某段程序
相当于高级语言中的if else结构;多级分支采用双分支嵌套结构实现
多分支
根据一条判断指令实现多种情况下的程序转移,形式为case结构
转移指令与分支程序设计
无条件转移
格式:JMP 目标地址
功能:无条件的修改IP的内容,改变下一条将要执行的指令地址,即跳转到目标地址继续执行程序
eg:跳转到L1标号处运行指令
int a;
__asm {
jmp L1;
mov dword ptr [a], 0;
L1:
mov dword ptr [a], 1;
}
printf("a = %d\n", a);
return 0;
JMP指令针对的目标偏移量存放在16位通用寄存器或字内存单元中
条件转移
统一格式:JXX 目标地址
功能:根据某些标志位或寄存器状态作为判断条件,条件满足时,把程序流程转移到指定的目标地址,不满足就继续执行下一条指令
不修改标志位,通常执行条件转移指令前要执行一条算术运算指令或逻辑运算指令等对特定标志位有影响的指令
单条件指令
只对某一个标志位或寄存器的状态进行判断,并决定是否进行转移
- CF:JC和JNC
- ZF:JZ和JNZ
- SF:JS和JNS
- OF:JO和JNO
- PF:JP和JNP
eg:判断两个字节变量DB1和DB2内容是否相同,相同则把AL清0,否则全置1
无符号数条件转移
用于判断两个无符号数大小关系,从而决定是否执行转移的指令
前提:保证上一条影响标志位的指令是CMP或SUB指令,且参与比较的两个操作数为无符号数
目的操作数:A;源操作数:B;CF、ZF决定跳转
- JA:A>B 成立则转移
- JNBE:A≤B 不成了则转移
- JAE:A≥B 成立则转移
- JNB:A<B 不成立则转移
- JB:A<B 成立则转移
- JNAE:A≥B 不成立则转移
- JBE:A≤B 成立则转移
- JNA:A>B 不成立则转移
带符号数条件转移
用于判断两个带符号数大小关系,从而决定是否执行转移的指令
前提:保证上一条影响标志位的指令是CMP指令,且参与比较的两个操作数为带符号数
目的操作数:A;源操作数:B;OF、SF、ZF决定跳转
- JG:A>B 成立则转移
- JNLE:A≤B 不成了则转移
- JGE:A≥B 成立则转移
- JNL:A<B 不成立则转移
- JL:A<B 成立则转移
- JNGE:A≥B 不成立则转移
- JLE:A≤B 成立则转移
- JNG:A>B 不成立则转移
快速记忆
循环程序设计
8086/8088系统提供了专门的计数循环指令
循环控制指令
格式:OPCODE(8位) DISP(8位)
LOOP
格式:LOOP 目标地址
步骤:
- CX←(CX) - 1
- 若(CX)不等于0,则转移到目标地址继续循环,否则停止循环
前提:使用LOOP前把循环次数保存到CX
LOOPZ/LOOPE
格式:LOOPZ/LOOPE 目标地址
步骤:
- CX←(CX) - 1
- 若(CX)不等于0且ZF=1,则转移到目标地址继续循环,否则停止循环,顺序执行下一条指令
LOOPNZ/LOOPNE
格式:LOOPNZ/LOOPNE 目标地址
步骤:
- CX←(CX) - 1
- 若(CX)不等于0且ZF=0,则转移到目标地址继续循环,否则停止循环,顺序执行下一条指令