汇编语言4(顺序、分支)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章
地址表形成多分支
➢ 需要在数据段事先安排一个按顺序排 列的转移地址表
➢ 输入的数字作为偏移量。因为只有2个 字节16位偏移地址,所以偏移量需要 乘2
➢ 关键是要理解间接寻址方式JMP指令
Table db disp1, disp2, disp3, disp4, ...
地址表 分支1地址 分支2地址
mov cx,16 ;循环计数器置初值
mov dl,-1 ;计位器置初值
again: inc dl
test ax,1
ror ax,1
;循环指令不影响ZF
loope again
;CX≠0且ZF=jmj1eom(vp 测nbdoyo试ttnfee位oYu,为nddl0),定继最,续计满大循数足环控循条制环件循次退环数出固
例题 无符号数除以2
;将AX中存放的无符号数除以2,如果是奇数,则 加1后除以2
test ax,01h ;测试AX最低位
jz even
;最低位为0:AX为偶数
add ax,1
;最低位为1:AX为奇数,需要加1
even: rcr ax,1
;AX←AX÷2
;如果采用SHR指令,则不能处理AX=FFFFH 的特殊情况
第4章
多分支程序设计
图示
➢多个条件对应各自的分支语句体,哪个条 件成立就转入相应分支体执行。多分支可以 化解为双分支或单分支结构的组合,例如:
or ah,ah
;等效于cmp ah,0
jz function0 dec ah jz function1 dec ah jz function2
;ah=0,转向function0 ;等效于cmp ah,1 ;ah=1,转向function1 ;等效于cmp ah,2 ;ah=2,转向function2
jmp two ;一定要跳过另一个分支体
one: mov dl,’1’ ;DL←’1’
two: mov ah,2
int 21h ;显示
双分支程序改为单分支程序
例题 显示BX最高位
对比
shl bx,1 ;BX最高位移入CF jnc one ;CF=0,即最高位为0,转移 mov dl,’1’ ;CF=1,即最高位为1,DL←’1’ jmp two ;一定要跳过另一个分支体 one: mov dl,’0’ ;DL←’0’ two: mov ah,2 int 21h ;显示
➢ 顺序程序完全按指令书写的前后顺序执 行每一条指令,是最基本、最常见的程 序结构
例4.1 计算 例4.2 移位 例题 代码转换
.model small .stack .data X dw 5 Y dw 6 Z dw 7 W dw ?
例4.1
.code .startup mov ax,X add ax,Y add ax,Z mov W,ax .exit 0 end
➢ 尝试:计算1~100数字之和,并将结果存入字 变量SUM中。(用顺序或分支结构能实现吗?
有没有其它方法呢?)★ ★ ★
第4章
4.3 循环程序设计
➢ 循环结构一般是根据某一条件判断为 真或假来确定是否重复执行循环体
➢ 循环指令和转移指令可以实现循环控 制;还可以采用MASM 6.x提供的循环 控制伪指令实现
dw disp5,disp6,disp7,disp8 ;取得各个标号的偏移地址
此处等同于 offset disp1
例4.4 代码段-2/3
start1: mov dx,offset msg ;提示输入数字
mov ah,9
int 21h
mov ah,1
;等待按键
int 21h
cmp al,'1' ;数字 < 1?
例4.2-2/2
图示
12 34 56 78 87 65 43 21h
移位后 34 56 78 87 65 43 21 00h
例题 代码转换-1/2
;查表法,实现一位16进制数转换为ASCII码显示 .model small .stack 256 .data
ASCII db 30h,31h,32h,33h,34h,35h db 36h,37h,38h,39h ;0~9的ASCII码 db 41h,42h,43h,44h,45h,46h ;A~F的ASCII码
;换码:AL←DS:[BX+AL]
mov dl,al ;入口参数:DL←AL
mov ah,2 ;02号DOS功能调用
int 21h .exit 0 end
;显示一个ASCII码字符
第4章
4.2 分支程序设计
➢ 分支程序根据条件是真或假决定执行与否 ➢ 判断的条件是各种指令,如CMP、TEST等
执行后形成的状态标志
பைடு நூலகம்
例4.3 判断有无实根-1/2
.startup mov al,_b imul al mov bx,ax ;BX中为b2 mov al,_a imul _c mov cx,4 imul cx ;AX中为4ac(DX无有效数据)
例4.3 判断有无实根-2/2
cmp bx,ax ;比较二者大小 jge yes ;条件满足? mov tag,0 ;第一分支体:条件不满足,tag←0 jmp done ;跳过第二个分支体 yes: mov tag,1 ;第二分支体:条件满足,tag←1 done: .exit 0
计数控制循环 循环次数固定
.startup
xor ax,ax ;被加数AX清0
mov cx,100
add ax,cx
;从100,99,...,2,1倒序累加
loop again
mov sum,ax ;将累加和送入指定单元
.exit 0
end
习题4.16-1/2
;用二进制显示从键盘输入的一个字符的ASCII码
jb start1
cmp al,'8' ;数字 > 8?
ja start1
and ax,000fh ;将ASCII码转换成数字
例4.4 代码段-3/3
dec ax
shl ax,1 ;等效于add ax,ax
mov bx,ax jmp table[bx]
可以改为 call table[bx]
;(段内)间接转移:IP←[table+bx]
start2: mov ah,9
int 21h .exit 0 disp1: mov dx,offset msg1
;处理程序1
jmp start2 ...
对应修改为 ret
第4章
练习一
➢ 例题4.2如果要求算术右移8位,如何修改程 序?
➢ 编写一个程序,把从键盘输入的一个小写字 母用大写字母显示出来。
双分支程序改为单分支程序
例题 显示BX最高位
mov dl,’0’ ;DL←’0’ shl bx,1 ;BX最高位移入CF jnc two ;CF=0,最高位为0,转移 mov dl,’1’ ;CF=1,最高位为1,DL←’1’ two: mov ah,2 int 21h ;显示
编写分支程序,需留心分支的开始和结束
jns nonneg ;分支条件:AX≥0
neg ax ;条件不满足,求补
nonneg: mov result,ax ;条件满足
;计算AX的绝对值 Bad cmp ax,0 jl yesneg ;分支条件:AX<0 jmp nonneg
yesneg: neg ax ;条件不满足,求补 nonneg: mov result,ax ;条件满足
循环指令LOOP:例4.5等 循环指令LOOPE:例4.6 转移指令:例4.7
多重循环:例4.8等
第4章
循环结构
初始化
循环体
修改部分 Y
控制条件 N
结束
循环的初始状态
循环的工作部分 及修改部分
计数控制循环 条件控制循环
sum again:
.model small
例4.5 求和
.stack
.data dw ? .code
第4章
双分支程序设计
条件成立跳转执行第 2个分支语句体,否 则顺序执行第1个分 支语句体。注意第1 个分支体后一定要有 一个JMP指令跳到第 2个分支体后
例题 显示BX最高位
对比
shl bx,1 ;BX最高位移入CF
jc one
;CF=1,即最高位为1,转移
mov dl,’0’
;CF=0,即最高位为0,DL←’0’
qvar
.data dq 1234567887654321h .code mov al,byte ptr qvar[6] mov byte ptr qvar[7],al mov al,byte ptr qvar[5] mov byte ptr qvar[6],al mov al,byte ptr qvar[4] mov byte ptr qvar[5],al mov al,byte ptr qvar[3] mov byte ptr qvar[4],al
hex db 0bh ;任意设定了一个待转换的一位16进制数
例题 代码转换-2/2
.code
.startup
mov bx,offset ASCII ;BX指向ASCII码表
mov al,hex
;AL取得一位16进制数,正是ASCII码表中位移
and al,0fh ;只有低4位是有效的,高4位清0
xlat
例题 单分支和双分支
;寄存器AL中是字母Y或y,则令AH=0;否则 令AH=-1
cmp al,’Y’ ;AL是大写Y否? jz next ;是,转移 cmp al,’y’ ;AL是小写y否? jz next ;是,转移 mov ah,-1 ;不是Y或y,则AH=-1,结束 jmp done ;一定要跳过另一个分支体 next: mov ah,0 ;是Y或y,则AH=0,结束 done: ...
例4.2-1/2
图示
mov al,byte ptr qvar[2] mov byte ptr qvar[3],al mov al,byte ptr qvar[1] mov byte ptr qvar[2],al mov al,byte ptr qvar[0] mov byte ptr qvar[1],al mov byte ptr qvar[0],0
mov ah,1
;从键盘输入一个字符
int 21h
mov bl,al
;BL←AL=字符的ASCII码
;DOS功能会改变AL内容,故字符ASCII码存入BL
mov ah,2
mov dl,':' ;显示一个分号,用于分隔
int 21h
习题4.16-2/2
mov cx,8 ;CX←8(循环次数)
again: shl bl,1 ;左移进CF,从高位开始显示
notfound: mov byteY,-1 ;ZF=1,16个位均为0
done: .exit 0
mov bx,offset string 例4.7 大小写
again: mov al,[bx] ;取一个字符
or al,al ;是否为结尾符0
jz done ;是,退出循环
cmp al,'A' jb next cmp al,'Z'
;是否为大写条A~件Z控制循环 利用标志退出
第4章
➢ 中国有句古话:
“凡事预则立,不预则废”
第4章
程序结构
指令系统
汇编语言 程序
程序格式
第4章
教学重点
综合应用第2章指令系统和第 3章伪指令与指令格式,第4 章从程序结构角度展开程序 设计,重点掌握: ✓分支结构程序设计 ✓循环结构程序设计 ✓子程序结构程序设计
第4章
4.1 顺序程序设计
➢ 转移指令Jcc和JMP实现分支控制;还可以 采用MASM 6.x提供的条件控制伪指令实现
单分支:求绝对值等 双分支:例4.3等 多分支:例4.4等
第4章
单分支程序设计
➢条件成立跳转,否 则顺序执行分支语 句体;注意选择正 确的条件转移指令 和转移目标地址
;计算AX的绝对值
例题 求绝对值
Good cmp ax,0
mov dl,0 ;MOV指令不改变CF
adc dl,30h ;DL←0+30H+CF
;CF若是0,则DL←'0';若是1,则DL←'1'
mov ah,2 int 21h ;显示 loop again
计数控制循环 循环次数固定
;CX减1,如果CX未减至0,则循环
.startup
例4.6
mov ax,wordX ;测试目标送AX
...
例4.4 数据段-1/3 .data
msg db 'Input number(1~8):',0dh,0ah,'$' msg1 db 'Chapter 1 : ...',0dh,0ah,'$' msg2 db 'Chapter 2 : ...',0dh,0ah,'$‘
... msg8 db 'Chapter 8 : ... ',0dh,0ah,'$' table dw disp1,disp2,disp3,disp4