新版汇编语言程序设计 选择程序设计(完整版)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
示错误。
成功学院信工系
张莉
计算两个一位数的乘积
.model small .stack .data .code .startup mov ah,01h int 21h mov bl,al mov ah,02h mov dl,0Dh int 21h mov dl,0ah int 21h mov ah,1 int 21h sub al,30h sub bl,30h
成功学院信工系
张莉
(1)判断单个标志位状态
⑤ JC 和 JNC :利用进位标志CF,判断结果是否进位
或借位 ♣ JC( Jump if Overflow ) PF=1时发生跳转 ♣ JNC( Jump if Not Overflow ) PF=0时发生跳转
成功学院信工系
张莉
(2)比较无符号数高低
的目标地址去执行指令;条件不成立,则程序将顺序 执行下一条指令 操作数label是采用相对寻址方式的短转移标号 表示Jcc指令后的那条指令的偏移地址,到目标指 令的偏移地址的地址位移 距当前IP地址-128~+127个单元的范围之内
成功学院信工系 张莉
Jcc指令的分类
Jcc指令不影响标志,但要利用标志(表2.2)。
3
复杂条件的处理
分支程序设计
在高级语言中经常出现逻辑运算符AND、OR连接两 个或两个以上的关系比较,作为判断条件使用,这种 复杂条件判断在汇编语言中被分解成为两个简单判断 进行处理。
成功学院信工系
张莉
示例3
从键盘上输入2个一位数,计算并输出它们的乘积。
若通过键盘输入的不是一位数字,则输出字符”E”提
成功学院信工系 张莉
示例5
程序根据键盘输入的1-8数字转向8个不同的处理
程序段,若用户输入的是非法数字,则提示重新 输入。 需要在数据段事先安排一个按顺序排列的转移 地址表
table dw disp1, disp2, disp3, disp4, ...
地址表 分支1地址
分支2地址
...
输入的数字作为偏移量。因为只有2个字节16位 偏移地址,所以偏移量需要乘2
目标地址的范围:段间
段间转移——远转移(far)
从当前代码段跳转到另一个代码段, 可以在1MB范围 更改CS段地址和IP偏移地址 目标地址必须用一个32位数表达,叫 做32位远指针,它就是逻辑地址
代 码 段
代 码 段
实际编程时,MASM汇编程序会根据目标地址的距离,自动 处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制
第5讲 选择程序设计
掌握JMP指令的作用。
在熟悉标志位设置规则的基础上掌握Jcc指令的作用。 能够综合运用JMP、Jcc指令进行分支结构程序设计。
成功学院信工系
张莉
第5讲 选择程序设计
1
2 3
无条件转移指令
无条件转移指令 分支程序设计
成功学院信工系
张莉
1 无条件转移指令
JMP label ;程序转向label标号指定的地址
①
成功学院信工系 张莉
(3)比较有符号数大小
有符号数的大(Greater)小(Less)需要组合OF、
SF标志,并利用ZF标志确定相等(Equal) 两数的大小分成4种关系: ⑴ 小于(不大于等于):JL(JNGE) SF≠OF时发生跳转 ⑵ 不小于(大于等于):JNL(JGE) SF=OF时发生跳转 ⑶ 小于等于(不大于):JLE(JNG) SF≠OF或ZF=1时发生跳转 ⑷ 不小于等于(大于):JNLE(JG ) SF=OF且ZF=0时发生跳转
段内转移——近转移(near)
在 当 前 代 码 段 64KB 范 围 内 转 移 ( ±32KB范围) 不需要更改CS段地址,只要改变IP偏移 地址 转移范围可以用一个字节表达,在段内 -128~+127范围的转移
代 码 段
段内转移——短转移(short)
代 码 段
成功学院信工系
张莉
3
多分支程序设计
SWITCH <条件表达式> { CASE 常量表达式1: 语句1 CASE 常量表达式2: 语句2
分支程序设计
条件成立?
…
CASE 常量表达式n: 语句n DEFAULT: }
语句1 语句2
语句n+1
语句n
成功学院信工系
张莉
示例4
设X为带符号数的字节数,求下面分段函数的值。
cx again output
;标号again的指令
;转移到again处继续执行 ;转向output
result,al ;标号output的指令
成功学院信工系 张莉
段内转移、间接寻址
JMP r16/m16 ;IP←r16/m16 将一个16位寄存器或主存字单元内容送入IP寄存器, 作为新的指令指针,但不修改CS寄存器的内容
成功学院信工系 张莉
msg msg1 msg2
.data db 'Input number(1~8):',0dh,0ah,'$' db 'Chapter 1 : ...',0dh,0ah,'$' db 'Chapter 2 : ...',0dh,0ah,'$‘
... msg8 db 'Chapter 8 : ... ',0dh,0ah,'$' table dw disp1,disp2,disp3,disp4 dw disp5,disp6,disp7,disp8 ;取得各个标号的偏移地址
此处等同于 offset disp1
成功学院信工系 张莉
start1: mov dx,offset msg ;提示输入数字 mov ah,9 int 21h mov ah,1 ;等待按键 int 21h cmp al,'1' ;数字 < 1? jb start1 cmp al,'8' ;数字 > 8? ja start1 and ax,000fh ;将ASCII码转换成数字
cmp al,”0” jb lab1 cmp al,”9” ja lab1
cmp al,”0” jb lab1 cmp al,”9” ja lab1
mul bl mov bl,10 div bl add ax,3030h mov bx,ax mov ah,02h mov dl,0Dh int 21h mov dl,0ah int 21h mov dl,bl Lab1:mov ah,02h mov ah,02h mov dl,”E” int 21h int 21h mov dl,bh int 21h .exit 0 成功学院信工系 张莉 end
根据利用的标志位不同,16条指令分成3种情况: (1) 判断单个标志位状态 (2) 比较无符号数高低 (3) 比较有符号数大小
成功学院信工系
张莉
(1)判断单个标志位状态
这组指令单独判断5个状态标志之一
① JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为
零(或相等) ♣ JZ/JE(Jump if Zero/Equal) 当ZF=1时发生跳转。 ♣ JNZ/JNE( Jump if Not Zero/Not Equal ) 当ZF=0时发生跳转。
N
语句
成功学院信工系
张莉
3
双分支结构
分支程序设计
条件成立?
IF <条件表达式>
语句序列1 ELSE 语句序列2 ENDIF
Y
N 语句2
语句1
成功学院信工系
张莉
示例2
判断一元二次方程ax2+bx+c=0是否有实根,若有
实根则将字节变量tag置为1,否则,置为0. mov al,a .model small imul c .stack mov cx,4 .data imul cx a db 6 cmp bx,ax b db 10 一定要用JMP jge yes 指令跳过语句2 c db 4 mov tag,0 .code jmp done .startup yes:mov tag,1 mov al, b done:.exit 0 imul al end 成功学院信工系 张莉 mov bx,ax
jmp ax ;IP←AX jmp word ptr [2000h] ;IP←[2000h]
成功学院信工tr label
;IP←label的偏移地址 ;CS←label的段地址
将标号所在段的段地址作为新的CS值,标号在该段
内的偏移地址作为新的IP值;这样,程序跳转到新的 代码段执行
成功学院信工系
张莉
(1)判断单个标志位状态
② JS和JNS:利用符号标志SF,判断结果是正是负 ♣ JS( Jump if Sign )
SF=1时发生跳转 ♣ JNS( Jump if Not Sign ) SF=0时发生跳转
成功学院信工系
张莉
(1)判断单个标志位状态
③ JO和JNO: 利用溢出标志OF,判断结果是否产生
无符号数的大小用高(Above)低(Below)表示 利用CF确定高低、利用ZF标志确定相等(Equal) 两数的高低分成4种关系:
低于(不高于等于):JB(JNAE) CF=1时发生跳转 ② 不低于(高于等于):JNB(JAE) CF=0时发生跳转 ③ 低于等于(不高于):JBE(JNA) CF=1或ZF=1时发生跳转 ④ 不低于等于(高于):JNBE(JA ) CF=0且ZF=0时发生跳转
成功学院信工系 张莉
段内转移、相对寻址
JMP label ;IP←IP+位移量
位移量是紧接着JMP指令后的那条指令的偏移地址,
到目标指令的偏移地址的地址位移 当向地址增大方向转移时,位移量为正;向地址减小 方向转移时,位移量为负
again:
dec …… jmp …… jmp …… output: mov
成功学院信工系 张莉
3
分支程序设计
分支程序根据条件是真或假决定执行与否 判断的条件是各种指令,如CMP、TEST等执行后形
成的状态标志
转移指令Jcc和JMP可以实现分支控制;还可以采用
MASM 6.x提供的条件控制伪指令实现
成功学院信工系
张莉
3
单分支结构
分支程序设计
条件成立?
Y
IF <条件表达式> 语句序列 ENDIF
溢出 ♣ JO( Jump if Overflow ) OF=1时发生跳转 ♣ JNO( Jump if Not Overflow ) OF=0时发生跳转
成功学院信工系
张莉
(1)判断单个标志位状态
④ JP/JPE和JNP/JPO :利用奇偶标志PF,判断结果
中“1”的个数是偶是奇 ♣ JP/JPE( Jump if Parity/Parity Even ) PF=1时发生跳转 ♣ JNP/JPO( Jump if Not Not Parity/Parity Odd ) PF=0时发生跳转
3X-8 Y= X 3X-8
X>10 10 ≥ X ≥-10 X>10
其中,存放结果的变量Y是字变量
成功学院信工系
张莉
求函数值
.model small .stack .data .code .startup mov al,x cmp al,10 jg lab1 cmp al,-10 jl lab2 cbw jmp lab3 lab1:mov bl,3 imul bl sub ax,8 jmp lab3 lab2:mov bl,2 imul bl add ax,10 jmp lab3 lab3:mov y,ax .exit 0 end
只要执行无条件转移指令JMP,就使程序转到指定的
目标地址处,从目标地址处开始执行指令
操作数label是要转移到的目标地址(目的地址、转移
地址)
JMP指令分成4种类型:
⑴ 段内转移、相对寻址 ⑵ 段内转移、间接寻址 ⑶ 段间转移、直接寻址 ⑷ 段间转移、间接寻址
成功学院信工系 张莉
目标地址的范围:段内
jmp far ptr otherseg
;远转移到代码段2的otherseg
成功学院信工系 张莉
段间转移、间接寻址
JMP far ptr mem ;IP←[mem],CS←[mem+2]
用一个双字存储单元表示要跳转的目标地址。这个
目标地址存放在主存中连续的两个字单元中的,低位 字送IP寄存器,高位字送CS寄存器
mov word ptr [bx],0 mov word ptr [bx+2],1500h JMP far ptr [bx] ;转移到1500h:0
成功学院信工系
张莉
2 条件转移指令
Jcc label
;条件满足,发生转移:IP←IP+8位位移量 ;条件不满足,顺序执行
指定的条件cc如果成立,程序转移到由标号label指定
成功学院信工系
张莉
计算两个一位数的乘积
.model small .stack .data .code .startup mov ah,01h int 21h mov bl,al mov ah,02h mov dl,0Dh int 21h mov dl,0ah int 21h mov ah,1 int 21h sub al,30h sub bl,30h
成功学院信工系
张莉
(1)判断单个标志位状态
⑤ JC 和 JNC :利用进位标志CF,判断结果是否进位
或借位 ♣ JC( Jump if Overflow ) PF=1时发生跳转 ♣ JNC( Jump if Not Overflow ) PF=0时发生跳转
成功学院信工系
张莉
(2)比较无符号数高低
的目标地址去执行指令;条件不成立,则程序将顺序 执行下一条指令 操作数label是采用相对寻址方式的短转移标号 表示Jcc指令后的那条指令的偏移地址,到目标指 令的偏移地址的地址位移 距当前IP地址-128~+127个单元的范围之内
成功学院信工系 张莉
Jcc指令的分类
Jcc指令不影响标志,但要利用标志(表2.2)。
3
复杂条件的处理
分支程序设计
在高级语言中经常出现逻辑运算符AND、OR连接两 个或两个以上的关系比较,作为判断条件使用,这种 复杂条件判断在汇编语言中被分解成为两个简单判断 进行处理。
成功学院信工系
张莉
示例3
从键盘上输入2个一位数,计算并输出它们的乘积。
若通过键盘输入的不是一位数字,则输出字符”E”提
成功学院信工系 张莉
示例5
程序根据键盘输入的1-8数字转向8个不同的处理
程序段,若用户输入的是非法数字,则提示重新 输入。 需要在数据段事先安排一个按顺序排列的转移 地址表
table dw disp1, disp2, disp3, disp4, ...
地址表 分支1地址
分支2地址
...
输入的数字作为偏移量。因为只有2个字节16位 偏移地址,所以偏移量需要乘2
目标地址的范围:段间
段间转移——远转移(far)
从当前代码段跳转到另一个代码段, 可以在1MB范围 更改CS段地址和IP偏移地址 目标地址必须用一个32位数表达,叫 做32位远指针,它就是逻辑地址
代 码 段
代 码 段
实际编程时,MASM汇编程序会根据目标地址的距离,自动 处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制
第5讲 选择程序设计
掌握JMP指令的作用。
在熟悉标志位设置规则的基础上掌握Jcc指令的作用。 能够综合运用JMP、Jcc指令进行分支结构程序设计。
成功学院信工系
张莉
第5讲 选择程序设计
1
2 3
无条件转移指令
无条件转移指令 分支程序设计
成功学院信工系
张莉
1 无条件转移指令
JMP label ;程序转向label标号指定的地址
①
成功学院信工系 张莉
(3)比较有符号数大小
有符号数的大(Greater)小(Less)需要组合OF、
SF标志,并利用ZF标志确定相等(Equal) 两数的大小分成4种关系: ⑴ 小于(不大于等于):JL(JNGE) SF≠OF时发生跳转 ⑵ 不小于(大于等于):JNL(JGE) SF=OF时发生跳转 ⑶ 小于等于(不大于):JLE(JNG) SF≠OF或ZF=1时发生跳转 ⑷ 不小于等于(大于):JNLE(JG ) SF=OF且ZF=0时发生跳转
段内转移——近转移(near)
在 当 前 代 码 段 64KB 范 围 内 转 移 ( ±32KB范围) 不需要更改CS段地址,只要改变IP偏移 地址 转移范围可以用一个字节表达,在段内 -128~+127范围的转移
代 码 段
段内转移——短转移(short)
代 码 段
成功学院信工系
张莉
3
多分支程序设计
SWITCH <条件表达式> { CASE 常量表达式1: 语句1 CASE 常量表达式2: 语句2
分支程序设计
条件成立?
…
CASE 常量表达式n: 语句n DEFAULT: }
语句1 语句2
语句n+1
语句n
成功学院信工系
张莉
示例4
设X为带符号数的字节数,求下面分段函数的值。
cx again output
;标号again的指令
;转移到again处继续执行 ;转向output
result,al ;标号output的指令
成功学院信工系 张莉
段内转移、间接寻址
JMP r16/m16 ;IP←r16/m16 将一个16位寄存器或主存字单元内容送入IP寄存器, 作为新的指令指针,但不修改CS寄存器的内容
成功学院信工系 张莉
msg msg1 msg2
.data db 'Input number(1~8):',0dh,0ah,'$' db 'Chapter 1 : ...',0dh,0ah,'$' db 'Chapter 2 : ...',0dh,0ah,'$‘
... msg8 db 'Chapter 8 : ... ',0dh,0ah,'$' table dw disp1,disp2,disp3,disp4 dw disp5,disp6,disp7,disp8 ;取得各个标号的偏移地址
此处等同于 offset disp1
成功学院信工系 张莉
start1: mov dx,offset msg ;提示输入数字 mov ah,9 int 21h mov ah,1 ;等待按键 int 21h cmp al,'1' ;数字 < 1? jb start1 cmp al,'8' ;数字 > 8? ja start1 and ax,000fh ;将ASCII码转换成数字
cmp al,”0” jb lab1 cmp al,”9” ja lab1
cmp al,”0” jb lab1 cmp al,”9” ja lab1
mul bl mov bl,10 div bl add ax,3030h mov bx,ax mov ah,02h mov dl,0Dh int 21h mov dl,0ah int 21h mov dl,bl Lab1:mov ah,02h mov ah,02h mov dl,”E” int 21h int 21h mov dl,bh int 21h .exit 0 成功学院信工系 张莉 end
根据利用的标志位不同,16条指令分成3种情况: (1) 判断单个标志位状态 (2) 比较无符号数高低 (3) 比较有符号数大小
成功学院信工系
张莉
(1)判断单个标志位状态
这组指令单独判断5个状态标志之一
① JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为
零(或相等) ♣ JZ/JE(Jump if Zero/Equal) 当ZF=1时发生跳转。 ♣ JNZ/JNE( Jump if Not Zero/Not Equal ) 当ZF=0时发生跳转。
N
语句
成功学院信工系
张莉
3
双分支结构
分支程序设计
条件成立?
IF <条件表达式>
语句序列1 ELSE 语句序列2 ENDIF
Y
N 语句2
语句1
成功学院信工系
张莉
示例2
判断一元二次方程ax2+bx+c=0是否有实根,若有
实根则将字节变量tag置为1,否则,置为0. mov al,a .model small imul c .stack mov cx,4 .data imul cx a db 6 cmp bx,ax b db 10 一定要用JMP jge yes 指令跳过语句2 c db 4 mov tag,0 .code jmp done .startup yes:mov tag,1 mov al, b done:.exit 0 imul al end 成功学院信工系 张莉 mov bx,ax
jmp ax ;IP←AX jmp word ptr [2000h] ;IP←[2000h]
成功学院信工tr label
;IP←label的偏移地址 ;CS←label的段地址
将标号所在段的段地址作为新的CS值,标号在该段
内的偏移地址作为新的IP值;这样,程序跳转到新的 代码段执行
成功学院信工系
张莉
(1)判断单个标志位状态
② JS和JNS:利用符号标志SF,判断结果是正是负 ♣ JS( Jump if Sign )
SF=1时发生跳转 ♣ JNS( Jump if Not Sign ) SF=0时发生跳转
成功学院信工系
张莉
(1)判断单个标志位状态
③ JO和JNO: 利用溢出标志OF,判断结果是否产生
无符号数的大小用高(Above)低(Below)表示 利用CF确定高低、利用ZF标志确定相等(Equal) 两数的高低分成4种关系:
低于(不高于等于):JB(JNAE) CF=1时发生跳转 ② 不低于(高于等于):JNB(JAE) CF=0时发生跳转 ③ 低于等于(不高于):JBE(JNA) CF=1或ZF=1时发生跳转 ④ 不低于等于(高于):JNBE(JA ) CF=0且ZF=0时发生跳转
成功学院信工系 张莉
段内转移、相对寻址
JMP label ;IP←IP+位移量
位移量是紧接着JMP指令后的那条指令的偏移地址,
到目标指令的偏移地址的地址位移 当向地址增大方向转移时,位移量为正;向地址减小 方向转移时,位移量为负
again:
dec …… jmp …… jmp …… output: mov
成功学院信工系 张莉
3
分支程序设计
分支程序根据条件是真或假决定执行与否 判断的条件是各种指令,如CMP、TEST等执行后形
成的状态标志
转移指令Jcc和JMP可以实现分支控制;还可以采用
MASM 6.x提供的条件控制伪指令实现
成功学院信工系
张莉
3
单分支结构
分支程序设计
条件成立?
Y
IF <条件表达式> 语句序列 ENDIF
溢出 ♣ JO( Jump if Overflow ) OF=1时发生跳转 ♣ JNO( Jump if Not Overflow ) OF=0时发生跳转
成功学院信工系
张莉
(1)判断单个标志位状态
④ JP/JPE和JNP/JPO :利用奇偶标志PF,判断结果
中“1”的个数是偶是奇 ♣ JP/JPE( Jump if Parity/Parity Even ) PF=1时发生跳转 ♣ JNP/JPO( Jump if Not Not Parity/Parity Odd ) PF=0时发生跳转
3X-8 Y= X 3X-8
X>10 10 ≥ X ≥-10 X>10
其中,存放结果的变量Y是字变量
成功学院信工系
张莉
求函数值
.model small .stack .data .code .startup mov al,x cmp al,10 jg lab1 cmp al,-10 jl lab2 cbw jmp lab3 lab1:mov bl,3 imul bl sub ax,8 jmp lab3 lab2:mov bl,2 imul bl add ax,10 jmp lab3 lab3:mov y,ax .exit 0 end
只要执行无条件转移指令JMP,就使程序转到指定的
目标地址处,从目标地址处开始执行指令
操作数label是要转移到的目标地址(目的地址、转移
地址)
JMP指令分成4种类型:
⑴ 段内转移、相对寻址 ⑵ 段内转移、间接寻址 ⑶ 段间转移、直接寻址 ⑷ 段间转移、间接寻址
成功学院信工系 张莉
目标地址的范围:段内
jmp far ptr otherseg
;远转移到代码段2的otherseg
成功学院信工系 张莉
段间转移、间接寻址
JMP far ptr mem ;IP←[mem],CS←[mem+2]
用一个双字存储单元表示要跳转的目标地址。这个
目标地址存放在主存中连续的两个字单元中的,低位 字送IP寄存器,高位字送CS寄存器
mov word ptr [bx],0 mov word ptr [bx+2],1500h JMP far ptr [bx] ;转移到1500h:0
成功学院信工系
张莉
2 条件转移指令
Jcc label
;条件满足,发生转移:IP←IP+8位位移量 ;条件不满足,顺序执行
指定的条件cc如果成立,程序转移到由标号label指定