1 / 96

微机原理、汇编与接口技术

微机原理、汇编与接口技术. 朱定华. 2008. 第三章 程序设计的基本技术. 3.1. 顺序程序设计. 3.2. 分支程序设计. 3.3. 循环程序设计. 3. 5. 子程序设计. 3.1 顺序程序设计. 顺序程序 是最简单的程序,它的执行顺序和程序中指令的顺序完全一致. 3.1.1 乘除法指令. 1. 乘法指令 MUL 和符号整数乘法指令 IMUL. 格式: MUL source IMUL source ;符号整数乘法. 源操作数 source 可以是字节或字,可为寄存器或存储器操作数,不能为立即数

habib
Download Presentation

微机原理、汇编与接口技术

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 微机原理、汇编与接口技术 朱定华 2008

  2. 第三章 程序设计的基本技术 3.1 顺序程序设计 3.2 分支程序设计 3.3 循环程序设计 3.5 子程序设计

  3. 3.1 顺序程序设计 顺序程序是最简单的程序,它的执行顺序和程序中指令的顺序完全一致

  4. 3.1.1 乘除法指令 1.乘法指令MUL和符号整数乘法指令IMUL 格式:MUL source IMUL source;符号整数乘法 • 源操作数 source可以是字节或字,可为寄存器或存储器操作数,不能为立即数 • 目的操作数是AL或AX,视source的类型属性决定是AL还是AX • 在乘法指令之前必须将目的操作数送AL(字节乘)或AX(字乘)

  5. 乘法指令所执行的操作是AL或AX乘以source,乘积放回到AX或DX和AX,如下图所示乘法指令所执行的操作是AL或AX乘以source,乘积放回到AX或DX和AX,如下图所示 AL AX sourc8 sourc16 × × AX DX AX • 可用乘法运算将BCD数转换为二进制数

  6. 将AX中的3位BCD数转换为二进制数存入字节变量SB中 程序段如下: N2×102+N1×10+N0 =(N2×10+N1)×10+N0 M0V CH,10 MOV CL,4 MOV SB,AL ;暂存十位和个位 MOV AL,AH ; 百位存入AL中 MUL CH ;百位×10→AX MOV AH,SB SHR AH,CL ;取十位 ADD AL,AH ;百位×10 + 十位→AL MUL CH ;(百位×10 + 十位)×10 →AX AND SB,0FH ;取个位 ADD SB,AL ;(百位×10 + 十位)×10 +个位→SB

  7. 2.除法指令DIV和符号整数除法指令IDIV • 格式:DIV source • IDIV source;符号整数除法 • 注: • 源操作数source可以是字或字节,可为REG或MEM,不能为立即数 • 目的操作数是AX或DX和AX

  8. 除法指令所执行的操作如下图所示 AL … AH sourc8 AX AX … DX sourc16 DX AX • 可用除法运算(除10取余)将二进制数转换为BCD数

  9. 将AL中的8位无符号二进制数转换为BCD数放入AX中 “除10取余”法 MOV AL,7DH MOV CL,4 MOV BL,10 MOV AH,0 ; 将8位二进制数扩展为16位 DIV BL ; 商→AL,余数→AH(个位数) MOV BH,AH ;个位暂存 MOV AH,0 DIV BL ; 商→AL,余数→AH(十位数) SHL AH,CL OR BH,AH ; BCD数十位与个位合并 MOV AH,0 DIV BL ; AH中余数为BCD数百位 MOV AL,BH;BCD数十位与个位送AL

  10. 3. 扩展指令CBW和CWD 要把一个8位二进制数除以一个8位二进制数,要有一个16位二进制数在AX中。所以在做8位除以8位和的除法之前先要把8位被除数扩展为16位,在做16位除以16位的除法之前要把16位被除数扩展为32位。这种扩展对于无符号数除法只需将AH或DX清0,而对符号整数除法则要通过扩展符号位来把被除数扩展。

  11. 格式:CBW ; AL中的最高位扩展至AH CWD ; AX中的最高位扩展至DX • 两指令都隐含操作数,即被扩展数在AL或AX,扩展至AX 或 DX:AX • 在做8位除以8位和16位除以16位的除法之前,应先扩展AL或AX中的被除数 • 扩展指令和符号整数除法仅对补码数适用

  12. 如:有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段为: MOV SI,OFFSET ARRAY MOV AX,[SI] CWD IDIV WORD PTR 2[SI] MOV 4[SI],AX MOV 6[SI],DX

  13. 3.1.2 BCD数调整指令 用二进制数算术运算指令对BCD数进行运算,会得到一个非BCD数或不正确的BCD数。如: 0000 0011B+0000 1001B= 0000 1100B 0000 1001B+0000 0111B= 0001 0000B 第一个结果是非BCD数;第二个结果是不正确的BCD数。 若再加上6,就可以得到正确的BCD数: 0000 1100B+0000 0110B= 0001 0010B 0001 0000B+0000 0110B= 0001 0110B 对BCD数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理BCD数的结果

  14. 3.1.2 BCD数调整指令 1.BCD数加法调整指令DAA和AAA (1)压缩BCD数加法调整 格式:DAA 功能:将AL中的和调整为正确的压缩BCD数 调整规则: (AL&0FH)>9或AF=1,则AL加6; (AL&0F0H)>90H或CF=1,则AL加60H.

  15. 0011 0100 + 0101 0110 1000 1010 + 0110 1001 0000 注: • 该指令操作数隐含为AL,即只能对AL中的操作数据调整 • 对结果调整时要用到CF,AF标志,所以调整指令应紧跟BCD数加法指令 • DAA指令会影响标志 如: MOV AX,3456H ADD AL,AH ;AL=8AH,AF=0,CF=0 DAA ;AL=90H

  16. (2)非压缩BCD数加法调整 格式:AAA 功能:将AL中的和调整为正确的非压缩BCD数送AX 调整规则: (AL&0FH)>9或AF=1,则 (AL+6)&0FH→AL ,AH+1→AH ; 否则,AL&0FH →AL ,AH不变.

  17. 注: • 同DAA,AAA的操作数也隐含为AL,且要紧跟加法指令 • AAA调整后的存放规律可理解为调整后的个位数送AL,十位数(即进位)加到AH中.故执行该指令前AH应清0 如:将两个BCD数的ASCII码相加,得到和的ASCII码: MOV AL,35H ; ’5’ ADD AL,39H ; ’9’,AL=6EH MOV AH,0 AAA ;AX=0104H OR AX,3030H ; AX=3134H 即’14’

  18. 例3.1 求两个字变量W1和W2中压缩BCD数之和,存入字节变量SUM中。 如:8931+5678=14609 W1 DW 8931H W2 DW 5678H SUM DB 3 DUP(0) MOV AL , BYTE PTR W1;AL=31H ADDAL , BYTE PTR W2; AL=A9H,CF=0,AF=0 DAA ;AL=09H,CF=1 MOV SUM , AL ;存个位和十位 MOV AL , BYTE PTR W1+1;AL=89H ADC AL , BYTE PTR W2+1 ; AL=E0H, CF=0,AF=1 DAA;AL=46H, CF=1 MOV SUM+1,AL ;存百位和千位 MOV SUM+2,0 ;处理向万位的进位 RCL SUM+2,1

  19. 例3.2 求两个字变量W1和W2中非压缩BCD数之和,存入字节变量SUM中。 如:89+67=156 W1 DW 0809H W2 DW 0607H SUM DB 3 DUP(0) MOV AL , BYTE PTR W1;AL=09H ADD AL , BYTE PTR W2; AL=10H,AF=1 AAA ;AL=06H,AH=01H MOV SUM , AL;存个位 MOV AL , BYTE PTR W1+1;AL=08H ADC AL , BYTE PTR W2+1; AL=0FH,AF=0 MOV AH ,0 AAA;AL=05H,AH=01H MOV WORD PTR SUM+1,AX;存十位和百位

  20. 2.BCD数减法调整指令DAS和AAS (1)压缩BCD数减法调整 格式: DAS 功能:将AL中的差调整为正确的压缩BCD数 调整规则: (AL&0FH)>9或AF=1,则AL减6; (AL&0F0H)>90H或CF=1,则AL减60H. 如: MOV AX,5643H SUB AL,AH;AL=DEH,有借位 DAS ;AL=78H,保持借位,即134-56

  21. (2)非压缩BCD数减法调整 格式: AAS 功能:将AL中的差调整为正确的非压缩BCD数送AX 调整规则: (AL&0FH)>9或AF=1,则 (AL-6)&0FH→AL ,AH-1→AH ; 否则,AL&0FH →AL ,AH不变. 如: MOV AX,0806H SUB AL,07H;AX=08FFH AAS;AX=0709H

  22. 3.非压缩BCD数乘除法调整指令AAM和AAD (1)乘法调整 格式:AAM 功能:将AL中小于64H的二进制数变换为非压缩BCD数送AX 调整规则: AL / 0AH → AH(十位), AL MOD 0AH → AL(个位) 如: MOV AL,63H AAM;AX=0909H

  23. (2)除法调整 格式:AAD 功能:将AX中的两位非压缩BCD数变换成二进制数集中在AL中 注: • 此指令可对被除数进行预调整 • 加、减和乘法调整在相应运算操作之后进行,而除法的调整在除法操作之前进行. 如: MOV AX,0906H MOV DL,06H AAD ;AX=0060H DIV DL ;AL=10H,AH=0 MOV DL,AH ;存余数 AAM;AX=0106H

  24. 例3.4 字变量W和字节变量B中分别存放着两个非压缩BCD数,求两者的商和余数,分别存入字变量Q和字节变量R中。 分析: 先将W中的非压缩BCD数取到AX中,用AAD指令调整为二进制数,二进制的除法之后,再用AAM指令将结果调整为非压缩BCD数。 如, (W)=0909H,(B)=5, 99÷5=19…4→(Q)=0109H,(R)=04H

  25. W DW 0909H B DB 03H R DB 0 Q DW 0 MOV AX , W AAD; 0909H→63H DIV B; AL=13H,AH=04H MOV R , AH;存余数 AAM; 13H→0109H MOV Q , AX;存商

  26. 3.1.3 顺序程序设计举例 建立 立方表 显示 提示信息 例3.6 (教材P90)从键盘键入0~9的任一自然数N,求其立方值并显示. 方法:可用乘法运算实现,也可用查表法实现. INPUT DB ’Please Input N(0~9):$ ’ LFB DB ’0$1$8$27$64$125$ ’ DB ’216$343$512$729$ ’ N DB 0 MOV DX,OFFSET INPUT MOV AH,9 INT 21H

  27. MOV AH,1INT 21HMOV N,ALMOV AH,2MOV DL,0AHINT 21HMOV DL,NAND DL,0FHMOV CL,2SHL DL,CLMOV DH,0ADD DX,OFFSET LFBMOV AH,9INT 21H 键入一个数→N 输出换行 N×4→DX 显示(LFB+4*N)单元的内容,直到$结束

  28. 第三章 程序设计的基本技术 3.1 顺序程序设计 3.2 分支程序设计 3.3 循环程序设计 3.5 子程序设计

  29. 3.2 分支程序设计 顺序程序是按指令的书写(存放)顺序执行,而实际情况需要根据不同的条件做不同的处理,形成分支.汇编中的分支的条件往往是通过标志的不同状态而反映的.常用改变标志指令和转移指令实现分支.

  30. 3.2.1 条件转移指令 • 通用格式:Jcond short_lable • 操作:若满足条件,则OFFSET short_lable→IP,实现转移;否则顺序执行. • short_lable →短标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为-128~127(从本指令则为-126~+129,因为条件转移指令均为双字节指令),故只能实现段内转移.

  31. 仅判断一个标志位实现转移.参见教材:P93、表3-1仅判断一个标志位实现转移.参见教材:P93、表3-1 指令助记符 功能 标志设置 JE/JZ 相等/等于0转移 ZF=1 JNE/JNZ 不相等/不等于0转移 ZF=0 JC 有进(借)位转移 CF=1 JNC 无进(借)位转移 CF=0 JS 为负转移 SF=1 JNS 为正转移 SF=0 JO 溢出转移 OF=1 JNO 无溢出转移 OF=0 JP/JPE 偶转移 PF=1 JNP/JPO 奇转移 PF=0 1.简单条件转移指令

  32. 如: JZ/JE S_LAB→为零/相等转移 操作:测试前面操作结果为0则转移,即判ZF=1转移. • JZ , JE为等价助记符,任写一种均可,可根据程序设计意图选择. 如: MOV BX , 0FFFFH INC BX ; ZF=1 JZ NEXT ; 为0转移到NEXT … NEXT: ……

  33. 如:MOV BL , 1 ; CMP BL , 5 ; ZF=0 JE NEXT ; 比较结果相等则转移到NEXT …;不相等顺序执行 NEXT:… 注: 此类指令,均只测试前面的操作结果所设标志,指令本身不影响标志.所以,在条件转移指令前,一定有一条能正确影响标志的指令.

  34. 2.无符号数条件转移指令 条件转移常依据两个数的关系来决定,两个数的关系除相等与否,还有大小之分,比较大小时,要区分是无符号数还是符号数,否则答案不明确. 如:0FFH>00H ?视为无符号数 0FFH=255 > 00H ; 视为符号数 0FFH= -1 ﹤ 00H . 所以,应将两种类型的数分开比较: 对无符号数使用术语:低于/高于 Below/Above; 对带符号数使用术语:小于/大于Less/Greater

  35. 无符号数条件转移指令有4条(P93,表3-2): 指令助记符 功能 JB/JNAE低于/不高于等于转移 JNB/JAE不低于/高于等于转移 JA/JNBE高于/不低于等于转移 JNA/JBE不高于/低于等于转移

  36. 3.符号数条件转移指令 符号数条件转移指令有4条(P94,表3-3): 指令助记符 功能 JL/JNGE判A<B转移 JNL/JGE判A ≧ B转移 JG/JNLE 判A>B转移 JNG/JLE 判A ≦ B转移

  37. 3.2.2 无条件转移指令 条件转移范围为-128~+127,而无条件转移指令没有范围限制. 在分支程序中往往需要它将各分支重新汇集到一起. 1.无条件直接转移指令 格式:JMP target 操作:将控制转向目的标号target: target在段内: target的偏移地址→IP target在段外: target的偏移地址→IP target的段首址→CS

  38. 2. 无条件间接转移指令 格式: JMP dest 操作: 目的操作数为寄存器→寄存器内容送IP 目的操作数为字变量→字变量内容送IP 目的操作数为双字变量→双字变量内容送CS和IP 如: JMP NEXT ;无条件转移转到NEXT … NEXT: … 如: JMP WORD PTR[BX] ;即( [ BX ] ) →IP

  39. 3.2.3 分支程序设计举例 • 分支实现的基本方法有两种:一种是利用比较转移指令实现分支;一种是利用跳转表实现分支. • 视比较对象,正确选择合适的转移指令. • 要为每个分支安排正确出口. • 凡是可共用的部分,应尽量放在公共程序段中以使程序简短. • 在调试分支程序时,应使用多组数据,分别对各种分支进行反复测试.

  40. 例3.8编程计算下面函数值 (X,Y均为字节符号数) X DB -5 Y DB 20 Z DB 0 MOV Z,0 MOV AL,X XOR AL,Y;根据X、Y的符号置S标志,相同为0 JS BACK;相异为1,X、Y相异结束 MOV Z,1;Z赋1 CMP X,0;相同后,判断其中某数的符号 JNS BACK;大于等于0,结束 NEG Z ;小于0,求补得1 BACK:ret

  41. 例3.9 (教材P96)某工厂的产品有8种不同的加工处理程序P0~P7,根据键盘输入,做不同的处理,若是0~7以外的键,则退出加工处理 此例可以用两种方法实现:一种是用逐一比较判断,逐次比较转移实现二叉分支、整体上实现多分支; 另一种是跳转表法,直接实现多分支.

  42. 方法一︰逐一比较法.简单,条理清楚,易于实现,但转移范围只能是:-128~+127方法一︰逐一比较法.简单,条理清楚,易于实现,但转移范围只能是:-128~+127 INPUT DB ’Input( 0~7): $’ MOV DX , OFFSET INPUT;显示提示 MOV AH , 9 INT 21H MOV AH , 1;等待键入一个字符 INT 21H CMP AL ,’ 0 ’;为0字符则转P0 JE P0 CMP AL ,’ 1 ’;为1字符则转P1 JE P1

  43. CMP AL ,’2’ JE P2 CMP AL ,’3’ JE P3 CMP AL ,’4’ JE P4 CMP AL ,’5’ JE P5 CMP AL ,’6’ JE P6 CMP AL ,’7’ JE P7 JMP DOWN;不是0~7则退出程序

  44. P0: MOV DL ,’ 0 ’;键入0则显示0以替代P0程序 JMP EXIT P1: MOV DL ,’ 1 ’;键入1则显示1以替代P1程序 JMP EXIT ︰ P7: MOV DL ,’ 7 ’ JMP EXIT EXIT: MOV AH ,2 INT 21H DOWN: RET;分支程序一定要注意汇合到结束处

  45. 方法二:跳转表法 利用无条件的间接转移指令可实现远距离的多分支(间接跳转至不同分支的入口处) 在数据区造一地址表,存放不同的分支入口地址; 设表的首地址为PTAB,每一个 PTAB P0 入口地址占一个字单元, +2 P1 ∴Pi的入口地址=PTAB+2*i +4 P2 若将2*i→BX,则JMP PTAB[BX]: 可转到Pi入口处

  46. INPUT DB ’ INPUT(0~7):$ ’ PTAB DW P0,P1,P2,P3,P4,P5,P6,P7 ;定义地址表 LEA DX , INPUT;显示提示 MOV AH , 9 INT 21H MOV AH , 1;等待键入0~7的数字 INT 21H CMP AL ,’ 0 ’;检查输入数据,不是0~7则退出 JB EXIT CMP AL ,’ 7 ’ JA EXIT AND AX ,0FH;i*2→BX ADD AX ,AX MOV BX ,AX JMP PTAB[BX];(PTAB+2*i)=Pi→IP EXIT:RET

  47. 请思考:若为跨段标号,应修改哪些地方? 注:只需修改:DW→DD(存IP、CS)、i*2→i*4即可 键入的ASCⅡ码为无符号数, 所以,用JB、JA等指令而不能用JG、JL等. P0: MOV DL,’ 0 ’;键入0则显示0以替代P0程序 JMP DOWN P1: MOV DL,’ 1’;键入1则显示1以替代P1程序 JMP DOWN ︰ P7: MOV DL ,’ 7’ DOWN: MOV AH , 2 INT 21H JMP EXIT

  48. 第三章 程序设计的基本技术 3.1 顺序程序设计 3.2 分支程序设计 3.3 循环程序设计 3.5 子程序设计

  49. 3.3.1 循环程序的结构 四部分: ⒈ 循环准备(循环初始化) 建地址指针、置计数初值、设置必要的常数、对工作寄存器及工作单元置初值或清0等. ⒉ 循环体 重复执行的部分,循环的核心. ⒊ 循环的修改 修改计数器、寄存器、地址指针、恢复某些参数. ⒋循环控制 判断控制循环是否结束或继续.

  50. 初始化 初始化 N 进入循环? 循环体 循环体 Y 修改 修改 结束循环? N Y (a)先执行,后判断→至少执行一次循环体 (b)先判断,后执行→可以不执行循环体 循环程序的具体结构流程有两种:

More Related