微型计算机技术(精品).ppt
《微型计算机技术(精品).ppt》由会员分享,可在线阅读,更多相关《微型计算机技术(精品).ppt(79页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、微型计算机技术 学习辅导(4)太原广播电视大学 郭建勇第四章 汇编语言程序设计基础 41循环程序设计 在程序设计中,常常需要一段程序反复执行若干次,这通常用循环的方法来实现,借助几种循环控制指令和前缀可以方便地实现循环。411基本结构的循环程序(1)初始化部分:循环前的准备工作,包括建立指针、设置变量及循环初值等。(2)循环体:这是循环程序的工作部分,完成循环的基本操作。(3)修改部分:修改参数,包括操作数地址、循环计数值或其他控制变量。(4)控制部分:根据对循环条件的判断结果,控制循环的执行或结束。初始化循环体初始化修改部分修改部分循环体循环控制循环控制YNNY先工作后判断先判断后工作例:编
2、制一个程序,将BX寄存器中的二进制数用十六进制数的形式显示出来。(1)BX寄存器中的二进制数可用4位十六进制数显示,故循环次数为4,放入CH中。(2)BX循环左移4次,最高位数字移到最低位置;(3)09的数字与ASCII码差为30H;AF(41H 46H)与ASCII码差为37H;故09的数字+30H,而AF应+37H。开始CX循环记数值BX循环左移4次转换为ASCII码9?+7显示次数=0?结束PROGNAM SEGMENT MOV AH,4CHMAIN PROC FAR INT 21H ASSUME CS:PROGNAM MAIN ENDPSTART:MOV CH,4 PROGNAM EN
3、DS ROTATE:MOV CL,4 ROL BX,CL MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL PIRNTIT ADD AL,07H PIRNTIT:MOV DL,AL MOV AH,4CH INT 21H DEC CH JNZ ROTATE例:统计某字单元中二进制数位值为1的个数,统计结果存放在变量ONE中。DATA SEGMENTNUM DW 1669H FINI:MOV AH,4CHONE DB?INT 21HDATA ENDS CODE ENDSCODE SEGMENT END START ASSNUM CS:CODE DS:DAT
4、ASTART:MOV AX,DATA MOV DS,AX MOV AX,NUMCOMP:CMP AX,0 JZ FINI SHL AX,1 JNC COMP INC ONE JMP COMP 开始AXNUMAX=0?AX左移一位CF=1?ONE+1结束YY412 多重循环程序 一个计算过程可能要依赖几个互相独立变化的参数,这就需要在一个循环过程中再包含一个循环过程,形成外层循环嵌套内层循环的结构形式,这种程序就称为多重循环程序。多重循环程序设计的基本方法和单重循环程序设计是一致的,应分别考虑各层循环的控制条件及其程序实现,相互之间不能混淆。另外要注意在每次通过外层循环再次进入内层循环时,初始条
5、件必须重新设置。例:有一个首地址为A的N字数组,请编制程序使该数组中的数按照从小到大的次序排列(整序)。采用起泡排序算法实现整序:从第一个数开始依次对相邻两个数Ki和Ki十l进行比较,若Ki Ki十l,Ki的位置不动,Ki十l继续和Ki十2比较;若Ki Ki十1,则两者交换位置。Ki十1(交换前的Ki)继续和Ki十2比较。可以看出,在第一遍比较了N-1次后,最大的数已经放到了最后,所以在第二遍时,只需比较N-2次,同样道理,第三遍只需比较n-3次。如果有N个数,最多要比较n-1遍。序号 数 比较遍数 1 2 3 4 比较次数 1 2 3 4 1 2 3 1 2 1 1 32 32 32 16
6、16 15 15 8 8 2 85 85 16 16 32 15 15 16 8 8 15 15 3 16 16 85 15 15 15 32 8 8 8 16 16 16 4 15 15 85 8 8 8 32 32 32 32 5 8 8 85 85 85 85 85 第一遍 比较5-1=4次 挑出最大数 85 第二遍 比较5-2=3次 挑出第二大数 32 第三遍 比较5-3=2次 挑出第三大数 16 第四遍 比较5-4=1次 挑出第四大数 15 完成整序 开始置外循环次数 N-1置内循环次数 N-1I=0KIKI+1?CNUNT2-1=0?=0?CNUNT1-1结束KIKI+1I=I+1
7、NNNDSEG SEGMENTN EQU 5A DW 5 DUP(?)DSEG ENDSCSEG SEGMENTMAIN PROC FAR ASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEG MOV DS,AX NUM :ADD SI,2 MOX CX,N LOOP LOOP2 DEC CX MOV CX,DXLOOP1:MOV DX,CX LOOP LOOP1 MOV SI,0 MOV AH,4CHLOOP2:MOV AX,ASI INT 21H CMP AX,ASI+2 MAIN ENDP JLE NUM XCHG AX,ASI+2 CSEG ENDS MOV
8、ASI,AX END START 42 分支程序设计4.2.1 分支程序结构 两路(单重)分支结构 多路(多重)分支结构 这两种结构都要求先对条件进行判定,然后根据判定结果确定执行哪路分支,判定一次只能有一路分支被选择。一般来讲一个条件两路分支;N个条件,2N路分支。判定条件判定条件ABABXYN 4.2.2 分支程序的设计方法 分支程序的实现方法有多种,最常用的方法有:利用比较和条件转移指令实现分支,利用逻辑尺控制分支,以及利用地址跳转表实现分支等方法。例:X/2 X0 Y=2 X=0 2X X0 这个问题可以通过X与0的比较,利用条件转移指令来确定三个计算分支中的某一支。MOV AL,X
9、CMP AL,0 JL M1 JZ M2 SAL AL,1 JMP NEXT M1:SAR AL,1 JMP NEXT M2:MOV AL,2 NEXT:MOV X ,AL ALXX0?AL2X=0?AL2AL2XALYNYN利用逻辑尺控制分支也是常见的一种分支程序设计方法。例:编写一个显示程序,要求显示A和B共8次,显示次序为A3次,B2次,A1次,B2次。因此,可设计一个逻辑尺:00011011,0表示显示A,1表示显尔B。编程时,逐值测试逻辑尺,是0则执行显示A的分支,是l则执行显示B的分支。部分程序如下:.MOV CX,8 MOV BL,00011011BLOP:SHL BL,1 JC
10、 M1 CALL AA1 JMP NEXT M1:CALL BB1NEXT:LOOP LOP HLTCX次数BL逻辑尺逻辑尺左移一位=1?执行A执行BYNCX-1=0?N分支程序设计时要注意各个分支一定要转入到公共操作上。本例和上例中的橙色框。利用地址跳转表的方法主要用于多路分支(三路分支以上)的情况,下面通过一个实例来说明这种程序设计方法。在调用DOS文件管理功能时,如出现了错误(如使用了非法功能号),DOS则根据AX中的错误码,将相应的错误信息显示出来。(AX)15各表示一种错误,其错误信息分别为ERl ER5。AX除l 5之外的数码是无效的。(1)错误信息提示的地址分别为ERl ER5。
11、(2)ERl ER5构成跳转表,表首地址为ERTAB。(3)表中各项的地址为表首址+(功能号-1)21号错误提示2号错误提示3号错误提示4号错误提示5号错误提示ER1ER2ER3ER4ER5ER1ER2ER3ER5ER4ERTABERTAB+2ERTAB+4ERTAB+6ERTAB+8DATA SEGMENT CMP AX,5 OUTR DB “非15”JG OUTR ;5转至OUTRER1 DB “错误1提示”CMP AX,1 ER2 DB “错误2提示”JGE TADR ;15转TADRER3 DB “错误3提示”OUTR:LEA DX,OUTRER4 DB “错误1提示”JMP DISP
12、M ;转至DISPMER5 DB “错误1提示”TADR:MOV BX,AXEVEN DEC BXERTAB DW ER1,ER2,ER3 SHL BX,1 DW ER4,ER5 MOV DX,ERTABBXDATA ENDS DISPM:MOV AH,9CODE SEGMENT INT 21HSHOWERR PROC FAR POP BX ;恢复现场 ASSUME CS:CODE,DS:DATA POP DX MOV SI,DATA POP AX MOV DS,SI REG PHSU AX ;保护现场 SHOWERR ENDP PUSH DX CODE ENDS PUSH BX END 4.
13、3 子程序设计 子程序又称为过程,在程序实现中,如果要多次用到一些功能相同的程序段,那么就可以用伪操作PROC和ENDP把这些程序段定义成子程序。需要时用CALL指令来调用它,调用程序也称为主程序。子程序有两种属性:NEAR(缺省的属性)和FAR。和调用程序在同一代码段中的子程序使用NEAR属性,和调用程序不在同一代码段中的子程序使用FAR属性。4.3.1 主程序与子程序之间的参数传送 主程序在调用子程序时,需要传送一些参数(入口参数)给子程序,子程序运行完后也要将运行结果(出口参数)回送给主程序。利用寄存器传送参数传送参数的方式:利用存储区传送参数 利用堆栈传送参数 1利用寄存器传送参数 这
14、种参数传送的方式方便、快速,但只适合传送参数较少的情况。例:编写程序,将一个16位二进制数转换成用ASCII表示的十进制数。这是一个常用的转换子程序,应提供给所有的用户调用。因此,要将该子程序的人口参数和出口参数注释清楚,方便调用。本例是通过DX和DI寄存器传递参数的。DATA SEGMENTOUTB DB 5 DUP(30H)N EQU 12345HDATA ENDSCOND SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,N ;入口参数 LEA SI,OUTB ;入口参数 CALL BIN-TO-ASC ;调子
15、程序 MOV AX,4C00H INT 21H 入口参数:DX =被转换数 DI =结果单元首地址 出口参数:DI =ASCII码结果单元首地址 BIN-TO-ASC PROC PUSH CX ;保护现场 POP DI;恢复现场 PUSH AX POP AX PUSH DI POP CX ADD DI,4 ;指向最低位 RET BINAO:MOV AX,DX BIN-TO-ASC ENDP MOV DX,0 CODE ENDS MOV CX,10 END START DIV CX ;10 XCHG AX,DX;商余数 ADD AL,30H;转换ASCII码 MOV DI,AL;存结果 DEC
16、DI ;修改指针 CMP DX,0 JNZ BINA0 ;0,转BINA0本例中,N为二进制数,先除10,余数为个位,或30H变为ASCII码;再对商除10,余数为十位,或30H变为ASCII码;直至商为0。2利用存储区传送参数参数存放在存储区中,入口参数为存储区首地址。适合参数较多的情况。例:TABLE数组中存有15个十进制数,挑出最大数存放在MAX单元中。DATA SEGMENT FOUNT PROCTABLE DB 4,6,8,4,9 MOV AL,SIN EQU 15 DEC CX MAX DB?INC SIDATA ENDS LOP :CMP AL,SICODE SEGMENT JG
17、 L1 ASSUME CS;CODE,DS:DATA MOV AL,SISTART:MOV AX,DATA L1 :INC SI MOV DS,AX LOOP LOP MOV CX,N FOUNT ENDP LEA SI,TABLE;入口参数 CODE ENDS CALL FOUNT END START MOV MAX,AL MOV AH,4CH INT 21H 3.利用堆栈传送函数 利用堆栈适合于传送参数多,而且子程序有嵌套、递归调用的情况。主程序将参数或参数地址推入堆栈,子程序从堆栈中取出参数或参数地址。利用堆栈传送涵数一定要注意堆栈的变化,如果参数和返回地址混淆,会造成子程序不能正确返回
18、的错误。例:调加密子程序将数组中的数据Aj加密。秘约规则为Aj2,再各位求反。DSEG SEGMENT START:MOV AX,DSEG N EQU 20 MOV DS,AXARAY DW N DUP(?)MOV AX,SSEGDSEG ENDS MOV SS,AXSSEG SEGMENT LEA SP,TOP;指定栈底 DW 64 DUP(?)LEA BX,ARAYTOP LABEL WORD PUSH BX ;首地址入栈SSEG ENDS MOV BX,N ;个数入栈CSEG SEGMENT PUSH BX ASSUME CS:CSEG,CALL ECRY SS:SSEG,MOV AX,
19、4C00H DS:DSEG INT 21HECRY PROC POP BX PUSH BP ;用BP取 POP AX MOV BP,SP;入口参数 POP BP PUSH AX ;保护现场 RET 4 PUSH BX ECRY ENDP PUSH CX CSEG ENDS PUSH SI END START MOV SI,0 MOV CX,BP+4;取入口参数 MOV BX,BP+6DONE:MOV AX,BX+SI SHL AX,1 XOR AX,0FFFFH ADD SI,2 LOOP DONE POP SI ;恢复现场 POP CX 保护现场后 恢复现场后SICXBXAXBP个数N首地址
20、栈底BP返回地址首地址返回地址个数N栈底SPMOV BP,SP 4.4 IO程序设计 信息交换 地址端口:地址信息 主机 I/O接口 数据端口:状态信息 状态端口:数据信息4.4.1 直接控制 IO的程序设计 1IO端口 在80 x86微机中,IO端口编址在一个独立的地址空间中,这个IO空间允许设置64K(65536)个8位端口或32K(32768)个16位端口。2IO程序举例对于IO和存储器分离的地址空间系统,80 x86有专门的IO指令与端口进行通信。下面通过几个IO程序的例子,说明使用IO指令直接在端口级上输入输出的方法。输入指令 输出指令IN AN,30H OUT 30H,ALIN A
21、X,40H OUT 40H,AXIN AL,DX ;DX16位端口地址 OUT DX,AX;DX16位端口地址 IN AX,DX ;DX16位端口地址 OUT DX,AX;DX16位端口地址 例:SOUND程序。程序通过IO指令使设备控制寄存器(1O端口地址为61H)的第1位交替为0和l,而61H端口的第l位和扬声器的脉冲门相连,交替为0和l的脉冲电流被放大后送到扬声器使之发出了声音。7 6 5 4 3 2 1 0 SOUND PROC PUSH AX PUSH DX MOV DX,1000 IN AL,61H DEC DX AND AL,11111100B JNZ TRIG TRIG:XOR
22、 AL,00000010B POP DX OUT 61H,AL POP AX MOV CX,6000 RETDELAY:LOOP DELAY SOUND ENDP1/0与门放大器端口 61H本例中CX=6000它决定发声频率值小声音尖锐,值大声音低沉。DX=1000决定发声时间长短。例:PRTCHAR程序。这是一个采用查询方式的打印字符程序。程序通过反复渎取并测试打印机的状态来控制输出。在打印机接口中,数据寄存器的端口地址为378H,状态寄存器的端口地址为379H,控制寄存器的端口地址为37AH。7 6 5 4 3 2 1 0 忙位(0=忙)未用应答(0=可接受)打印出错(0=出错)纸出界(1
23、=出界)联机状态(1=联机)7 6 5 4 3 2 1 0 未用 选通(1=输出数据)工作方式 自动换行(1=换行)(0=禁止中断方式)初始化(1=正常)选择位(1=接通)状态寄存器端口379H控制寄存器 端口37AHDATA SEGMENT MOV DX,37AHMESS DB PRINTER IS NORMAL MOV AL,0DH;选通输出COUNT EQU -MESS OUT DX,ALDATA ENDS MOV AL,0CH CSEG SEGMENT OUT DX,AL ASSUME CS:CSEG,DS:DATA INC SISTART:MOV AX,DATA LOOP NEXT
24、MOV DX,AX MOV AH,4CH LEA SI,MESS;建地址指针 INT 21H MOV CX,COUNT;CX次数 CSEG ENDSNEXT:MOV DX,379H;DX状态地址 END START WAIT:IN AL,DX ;AL状态端口 TEST AL,80H ;测忙否 JZ WAIT ;忙(=0)再测 MOV AL,SI;不忙,输出 MOV DX,378H;DX数据地址 OUT DX,AL TEST指令测状态寄存器的第7位,为0表示忙,循环再测,直至为1空闲时,再取字符输 出打印。称为查询方式。0DH为控制寄存器选通信号,0CH为结束选通。又例:CPU要从3个设备轮流输
25、人数据,PROCl,PROC2,PROC3分别是设备l,设备2和设备3的数据输入程序,它们的状态寄存器的端口地址分别用STAT1,STAT2,STAT3表示,这三个状态寄存器的5位是输入准备位。轮流查询三个数据输入设备的程序段:INPUT:IN AL,STAT1 ;AL状态寄存器1 TEST AL,20H ;输入准备好?JZ DEV2 ;否,转DEV2 CALL FAR PTR PROC1 ;准备好,调PROC1DEV2:IN AL,STAT2 TEST AL,20H JZ DEV3 CALL FAR PTR PROC2DEV3:IN AL,STAT3 TEST AL,20H JZ NO-IN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微型计算机 技术 精品
限制150内