
微机原理、汇编语言与接口技术 教学课件 ppt 作者 韩晓茹 ch03 汇编程序设计.ppt
102页第三章 汇编程序设计,编制汇编语言程序的步骤:,(1) 分析题意,确定算法 (2) 根据算法画出程序框图 (3) 根据框图编写程序 (4) 上机调试程序,分支结构 子程序结构,程序结构:,复合结构:多种程序结构的组合,,,,,,,…,顺序结构 循环结构,按照指令执行的顺序,程序的结构可以划分成以下三种 顺序结构:程序按照它编写的顺序执行,每条指令只执行一 次,这样的程序称为“顺序结构”的程序 循环结构:一组指令被反复地执行,这样的程序称为“循环结 构”或者“重复结构”的程序 选择结构:根据某个条件,一部分指令被执行,另一部分指 令没有被执行,这样的程序称为“选择结构”或者 “分支结构”的程序程序基本结构,,3.1 顺序程序设计,顺序程序:没有分支、循环等转移指令,按指令书写的前后顺利依次执行 最基本的程序结构 完全采用顺序结构编写的程序并不多见,例题 顺序程序设计实例 采用查表法,实现一位16进制数转换为ASCII码显示,例 数据段,;数据段 ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;对应0 ~ 9的ASCII码 db 41h,42h,43h,44h,45h,46h ;对应A ~ F的ASCII码 hex db 04h,0bh ;假设两个要显示的数据,例 代码段,;代码段 mov bx,offset ASCII ;BX指向ASCII码表 mov al,hex ;AL取得一位16进制数 ;恰好就是ASCII码表中的位移 and al,0fh ;只有低4位是有效的,高4位清0 Xlat ;换码:AL←DS:[BX+AL] mov dl,al ;入口参数:DL←AL mov ah,2 ;02号DOS功能调用 int 21h ;显示一个ASCII码字符,例 代码段(续),mov al,hex+1 ;转换并显示下一个数据 and al,0fh xlat mov dl,al mov ah,2 int 21h,【例 3‑1】将16进制数字转换为对应七段码,七段数码管:7段LED发光管 通过7个发光段的不同组合,能较好地显示16进制数字(0,…,9,A,b,C,d,E,F)。
每一段由一个二进制位控制它的亮或暗 可用一个字节来控制七段数码管的显示 各段顺时针分别称为a、b、c、d、e、f、g,有的产品还附带有一个小数点h,依次对应D0~D7位 假定0 表示对应段亮, 1 表示对应段暗,那么显示数字0 对应的控制码应为11000000B,显示数字1对应的控制代码为11111001B,依此类推,显示数字F对应的控制代码为10001110B 这种用于控制七段数码管亮暗的代码就称为七段码DSEG SEGMENT LEDTB DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 80H,90H,88H,83H,0C6H,0C1H,86H,8EH XDATA DB 9 ; 要显示的16进制数字 XCODE DB ? ; 存放要显示数字对应的七段码 DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS:DSEG START :MOV AX, DSEG MOV DS, AX MOV BX, OFFSET LEDtb MOV AL, XDATA ; 取16进制数字 AND AL, 0FH XLAT ; 查表取得对应的七段码 MOV XCODE, AL ; 保存 MOV AX, 4C00H INT 21H CSEG ENDS END START,3.2 分支程序设计,根据条件是真或假决定执行与否 判断的条件:各种指令(如CMP、TEST等)执行后形成的状态标志 分支控制:转移指令Jcc和JMP可以实现 分支结构有 单分支结构 双分支结构 多分支结构,3.2.1 单分支结构,条件成立跳转,否则顺序执行分支语句体 注意选择正确的条件转移指令和转移目标地址,【例 3-2】求绝对值,计算AL中有符号数的绝对值,cmp al,0 jge nonneg ;条件满足(AL≥0),转移 neg al ;条件不满足,求补 nonneg: mov result,al ;条件满足,;不恰当的分支 cmp al,0 jl yesneg ;条件满足(AL<0),转移 jmp nonneg yesneg: neg al ;条件满足,求补 nonneg: mov result,al ;条件不满足,3.2.2 双分支结构,条件成立跳转执行第2个分支语句体,否则顺序执行第1个分支语句体 注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后,【例 3-3】显示BX的最高位,显示BX的最高位,shl bx,1 ;BX最高位移入CF标志 jc one ;CF=1,即最高位为1,转移 mov dl,30h ;CF=0,即最高位为0:DL←30H=‘0’ jmp two ;一定要跳过另一个分支体 one: mov dl,31h ;DL← 31H=‘1’ two: mov ah,2 int 21h ;显示,可以用JNC替换JC,显示BX的最高位(另解1),shl bx,1 ;BX最高位移入CF标志 jnc one ;CF=0,即最高位为0,转移 mov dl,31h ;CF=1,即最高位为1:DL←31H=‘1’ jmp two ;一定要跳过另一个分支体 one: mov dl,30h ;DL← 30H=‘0’ two: mov ah,2 int 21h ;显示,转换为单分支结构,显示BX的最高位(另解2),mov dl,’0’ ;DL←30H=‘0’ shl bx,1 ;BX最高位移入CF标志 jnc two ;CF=0,即最高位为0,转移 mov dl,’1’ ;CF=1,即最高位为1:DL←31H=‘1’ two: mov ah,2 int 21h ;显示,编写分支程序,需留心分支的开始和结束,显示BX的最高位(无分支),mov dl,0 shl bx,1 ;BX最高位移入CF标志 adc dl,30h ;CF=0,DL←0+30h+0=30H=‘0’ ;CF=1,DL←0+30h+1=31H=‘1’ two: mov ah,2 int 21h ;显示,大小写字母转换,;如果DL是一个小写字母,则转换为大写 cmp dl,‘a’ ;小于小写字母a,不需要处理 jb disp cmp dl,‘z’ ;大于小写字母z,也不需要处理 ja disp sub dl,20h ;是小写字母,则转换为大写 disp: ……,转换原理,大小写字母的比较和转换,,结论1:大小写字母的ASCII码值相差20H 结论2:大小写字母的ASCII码值仅D5位不同,方法1(加减指令): “ADD DL,20H” “SUB DL,20H” 方法2(逻辑指令): “OR DL,20H” “AND DL,0DFH”,大小写互换(异或指令): “XOR DL,20H”,[例3-4] 将4位二进制转换成对应的十六进制字符,MOV AL, X CMP AL, 9 JA ALPH ADD AL, 30H JMP DONE ALPH: ADD AL, 37H DONE: MOV Y, AL,MOV AL, X OR AL, 30H CMP AL, ‘9’ JBE DONE ADD AL, 7 DONE: MOV Y, AL,3.2.3 多分支结构,如果可供选择的程序块多于两个,这样的结构称为多分支选择结构,如下图 (a)所示,下图 (b)是汇编语言程序的实现方法。
例 3‑5】 编程实现符号函数:变量X和Y均为数据段中字节变量 1(X0) Y = 0(X=0) X范围:(-128 ~ +127) -1(X0),,,MOV AL,X CMP AL,0 JGE BIGER MOV AL,0FFH ;X0,1送Y 单元 OK: MOV Y,AL,DATA SEGMENT PROMPT DB 0DH, 0AH, “Input a number (1~3): $” MSG1 DB 0DH, 0AH, “FUNCTION 1 EXECUTED . $” MSG2 DB 0DH, 0AH, “FUNCTION 2 EXECUTED . $” MSG3 DB 0DH, 0AH, “FUNCTION 3 EXECUTED . $” DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX,[例3-6] 从键盘上输入数字“1”到“3”,根据输入选择对应程序块执行INPUT: LEA DX, PROMPT MOV AH, 9 INT 21H ;输出提示信息 MOV AH, 1 INT 21H ;输入一个数字 CMP AL, ‘1’ JB INPUT ;“0”或非数字,重新输入 JE F1 ;数字“1”,转F1 CMP AL, ‘2’ JE F2 ;数字“2”,转F2 CMP AL, ‘3’ JE F3 ;数字“3”,转F3 JMP INPUT ;大于“3”,重新输入,F1: LEA DX, MSG1 ;F1程序块 JMP OUTPUT F2: LEA DX, MSG2 ;F2程序块 JMP OUTPUT F3: LEA DX, MSG3 ;F3程序块 JMP OUTPUT OUTPUT: MOV AH, 9 INT 21H MOV AX, 4C00H INT 21H CODE ENDS END START,DATA SEGMENT PROMPT DB 0DH, 0AH, “Input a number (1~3): $” MSG1 DB 0DH, 0AH, “FUNCTION 1 EXECUTED . $” MSG2 DB 0DH, 0AH, “FUNCTION 2 EXECUTED . $” MSG3 DB 0DH, 0AH, “FUNCTION 3 EXECUTED . $” ADDTBL DW F1, F2, F3 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA,用地址表实现多分支,START:MOV AX, DATA MOV DS, AX INPUT:LEA DX, PROMPT MOV AH, 9 INT 21H ;显示提示信息 MOV AH, 1 INT 21H ;输入一个数字 CMP AL, ‘1’ JB INPUT ;不正确输入,重新输入 CMP AL, ‘3’ JA INPUT ;不正确输入,重新输入,SUB AL, ‘1’ ;将数字字符“1”到“3”转换为0, 1, 2 SHL AL, 1 ;转换为0,2,4 MOV BL, AL MOV BH, 0 ;转入BX JMP ADDTBL[BX] ;相对寻址,转移到对应程序块 F1: LEA DX, MSG1 ;F1程序块 JMP OUTPUT F2: LEA DX, MSG2 ;F2程序块 JMP OUTPUT F3: LEA DX, MSG3 ;F3程序块 JMP OUTPUT ;这条指令可以省略,OUTPUT: MOV AH, 9 INT 21H MOV AX, 4C00H INT 21H CODE ENDS END START,3.3 循环程序设计,,循环结构也称“重复结构”,一般由以下4个部分组成:,(1)初始化部分:为循环做准备。
如:累加器清零,设置地址指针和计数器的初始值等 (2)工作部分:实现循环的基本操作 (3)修改部分:修改指针、计数器的值,为下一次循环做准备 (4)控制部分:判断循环条件,确定结束或继续循环两种结构的循环:,WHILE循环:先判断循环条件,条件满足则进入循环,循环次数最少为0次 DO-WHILE循环:。
