五、顺序结构
1、程序设计的步骤
1、分析问题
2、建立数据模型
3、设计算法
4、编制程序
5、上机调试
2、流程图的应用
3、程序的基本控制结构
1、顺序结构:程序顺序执行,不发生跳转
2、分支结构:程序在执行过程中发生跳转
3、循环结构:程序重复执行多次
4、数据传送指令
对于双操作数的要求:
(以MOV指令为例)
MOV 寄存器,立即数
MOV 寄存器,寄存器
MOV 寄存器,内存单元
MOV 内存单元,寄存器
MOV 内存单元,立即数
不能两个操作数都是内存单元
CS不能用作目标操作数
IP寄存器不能做操作数
用BX、SI、DI间接寻址时,默认的段寄存器为DS
立即数不能做目标操作数
立即数不能直接送入段寄存器
源操作数与目标操作数数据类型必须相同
段寄存器之间不能互相传送
dest:
目标操作数
src:
源操作数
格式 | 说明 | 对标志位的影响 | |
---|---|---|---|
MOV | MOV dest,src | 将源操作数(字节或字)传送到目标操作数中 | 没有 |
PUSH | PUSH src | 堆栈指针先减2,再将源操作数存入,(必须是字数据)(src必须是字类型) | 没有 |
POP | POP dest | 先将栈顶中存放的字数据存入dest中,再将堆栈指针加2 (dest必须是字类型) | 没有 |
XCHG | XCHG dest,src | 交换(同一条指令中,数据类型必须一致) | 没有 |
XLAT | XLAT | 换码(查表)指令,BX和AL内容之和指出的内存字节单元的内容放到AL中 | 没有 |
LEA | LEA dest,src | 取有效地址,将源操作数地址的偏移量,即有效地址传送到dest中(dest可以是任一16位通用寄存器,但不能是IP和段寄存器) | 没有 |
LDS | LDS dest,src | 加载数据段寄存器,将src指出的连续两个字的内容,高位字为段地址送入DS,低位字为偏移量送入dest | 没有 |
LES | LES dest,src | 加载附加段寄存器,将src指出的连续两个字的内容,高位字为段地址送入ES,低位字为偏移量送入dest | 没有 |
5、算术运算指令
格式 | 说明 | 对标志位的影响 | |
---|---|---|---|
ADD | ADD dest,src | 加法,结果存入目标操作数中 | CF、OF、AF、PF、SF、ZF |
ADC | ADC dest,src | 带进位的加法,结果存入目标操作数中,dest = dest + src + CF,主要用于多字节相加 | CF、OF、AF、PF、SF、ZF |
INC | INC dest | 增一指令 | |
SUB | SUB dest,src | 减法:dest = dest - src | CF、OF、AF、PF、SF、ZF |
SBB | SBB dest,src | 带进位的减法,dest = dest - src - CF,主要用于多字节相减 | CF、OF、AF、PF、SF、ZF |
DEC | DEC dest | 自减 | 不影响CF,其与都影响 |
NEG | NEG dest | 取补指令 | CF、OF、AF、PF、SF、ZF |
CMP | CMP dest,src | 从目标操作数中减去源操作数,但结果不储存,只保存对标志位的影响 | CF、OF、AF、PF、SF、ZF |
6、逻辑操作指令
格式 | 说明 | 对标志位的影响 | |
---|---|---|---|
NOT | NOT dest | 对每一位求反 | 没有 |
AND | AND dest,src | 逻辑与,一个数与自己进行逻辑与,可以用来影响标志位;可以借助某个指定的操作数来将另一个操作数中的某个位清零 | CF、OF、AF、PF、SF、ZF |
OR | OR dest,src | 逻辑或,可以用来是操作数中的某些位置位 | CF、OF、AF、PF、SF、ZF |
XOR | XOR dest,src | 异或,可用来使操作数中的某些位取反 | CF、OF、AF、PF、SF、ZF |
TEST | TEST dest,src | 将两个操作数进行逻辑与,但不改变两个操作数的原始值,并将CF和OF置零 | CF、OF、AF、PF、SF、ZF |
7、移位操作指令
逻辑移位(SHL、SHR)
逻辑移位指令 dest,cnt
cnt可以为1,但如果大于1,则需要存放到CL中,再进行移位
执行移位指令时,一位一移,过程中源操作数的最高位发生过变化,OF为1,否则为0
左移时,最高位送入CF,右移时,最低位送入CF
不带进位循环移位(EOL、ROR)
带进位循环移位(RCL、RCR)
8、状态标志位操作指令
清0 | 置1 | 取反 | |
---|---|---|---|
CF | CLC | STC | CMC |
DF | CLD | STD | |
IF | CLI | STI |
9、简单的I/O功能调用
六、分支结构程序
1、转移指令
1.1、无条件转移指令
JMP targ
不影响标志位,可以转到内存中存放的任何程序段,targ可以是直接标号、寄存器间接寻址、存储器间接寻址
1.2、条件转移指令
根据执行该指令前CPU中状态标志位的状态决定程序执行的流程
在比较玩两个数的大小后根据比较的结果决定是否进行转移,实际是测试不同的标志位
1.2.1、单条件转移指令
条件转移指令 | |
---|---|
CF = 1 | JC |
CF = 0 | JNC |
ZF = 1 | JZ/JE |
ZF = 0 | JNZ/JNE |
SF = 1 | JS |
SF = 0 | JNS |
OF = 1 | JO |
OF = 0 | JNO |
PF = 1 | JP/JPE |
PF = 0 | JNP/JPO |
1.2.2、带符号数和无符号数的条件转移指令
条件:使用前用过CMP、SUB、SBB指令
无符号数 | 标志位 | 带符号数 | 标志位 | |
---|---|---|---|---|
A < B | JB | CF=1 | JL | SF xor OF = 1 |
A <= B | JBE | CF=1||ZF=1 | JLE | ((SF xor OF)|| ZF)=1 |
A > B | JA | CF=0||ZF=0 | JG | ((SF xor OF)||ZF)=0 |
A >= B | JAE | CF=0 | JGE | SF xor OF = 0 |
A = B | JE | ZF=1 | JE | ZF=1 |
A != B | JNE | ZF=1 | JNE | ZF=1 |