《【计算机】汇编语言程序设计(4)》由会员分享,可在线阅读,更多相关《【计算机】汇编语言程序设计(4)(51页珍藏版)》请在金锄头文库上搜索。
1、1,第六节 汇编语言程序设计讲课内容 一、概述 1. 编写汇编语言程序步骤 2. 判断程序质量的标准 3. 几种程序结构二、汇编语言程序设计举例 例1 将寄存器BX中的内容以十六进制形式显示出来。 例2 将键盘输入的十进制数据串转换成其相应大小的数值存放在BX寄存器中。 复习内容:p110p140,2,1、作业3-16,3-20 2、选择其中之一大作业,(1)、实验四 任务1,作为家庭作业,在计算机上调通,经过教师检查 签字。(2)、阅读教课书中 P125 P132 (3.8.1 3.8.4节)的程序并写出总结(程序内涵)。内容: 子程与主程的参数传送:用寄存器传送 用定义的变量传送, 利用地
2、址表传送 用堆栈传送,3,一、概述1. 编写汇编语言程序步骤 2. 判断程序质量的标准 3. 几种程序结构,4,一. 编写汇编语言程序步骤分析实际问题,抽象描述问题的模型确定解决模型的算法按算法画出程序流程图按流程图编写程序上机调试, 运行程序,5,2. 判断程序质量的标准程序的正确性程序的可读性程序的执行时间程序所占内存大小,6,3几种程序结构顺序结构分支结构循环结构子程结构,7,顺序结构,8,分支结构,9,Y,Y,N,N,分支结构,10,循环结构,当型循环 (当条件成立进入循环),直到型循环 (直到条件成立退出循环),11,1多处调用完成同一功能的子程: code SEGMENT star
3、t: 、CALL subp、CALL subp、CALL subp、MOV AH, 4CHINT 21Hsubp PROC、RET subp ENDPcode ENDSEND start,2模块化程序设计: code SEGMENT begin: CALL sub1CALL sub2CALL sub3MOV AH, 4CHINT 21H sub1 PROC、RET sub1 ENDP sub2 PROC、RET sub2 ENDP sub3 PROC、RET sub3 ENDP code ENDSEND begin,子程结构,注意返回DOS语句位置,12,思考如下程序的执行流程: code S
4、EGMENT start: 、CALL subp、CALL subp、 ; MOV AH, 4CH ; INT 21Hsubp PROC、RET subp ENDPMOV AH, 4CHINT 21H code ENDSEND start,程序执行不到返回DOS功能调用处, 最后的结果是死机.,13,二、汇编语言程序设计举例例1 将寄存器BX中的内容以十六进制形式显示出来。(二进制 十六进制)例2 将键盘输入的十进制数据串转换成其相应大小的数值存放在BX寄存器中。,14,有关字符、数码转换的处理1. 计算机处理字符时,常用的字符编码是ASCII 码。 2. 数字和字母的ASCII码是一个有序序
5、列 数字09 : 30H 39H 大写字母AZ : 41H 5AH 小写字母az : 61H 7AH,15,3. 计算机处理信息时,其对象都是二进制数。外设(显示器、打印机、键盘等) 用ASCII码与CPU进行信息传送。 例如: (1) 在键盘上按下某一字符键 (如9),键盘接口向键盘缓冲区送去的是该字符的ASCII码(如39H),不是送数字09H。( 2) 在文本方式下,要在显示器上显示某一字符(如A),须将该字符的ASCII码(如41H)送显示缓冲区,不是送数字0AH。,计算机要利用显示器、键盘等外设时,须据程序设计的需要进行有关转换。,16,例 将CPU运算的结果通过显示器显示时,如二进
6、制数“A9”需将结果转换成其对应的ASCII码才能进行显示。,17,例 CPU要处理从键盘输入的某一数据,如键入“1234”需将该数据串进行转换十六进制后才能应用。,18,例1 将BX寄存器中的内容以十六进制形式显示出来。,BX是一个16位寄存器 二进制 1010 1001 0011 1110,用十六进显示时,每4位用一个字符显示,共4个 其中: 0000 0 30H , 1010 A 41H0001 1 31H , 1011 B 42H、 、1001 9 39H , 1111 F 46H,十六进制 A 9 3 E,屏幕上的显示 A 9 3 E,对应的ASCII 41H 39H 33H 45H
7、,19,算法: 取出要显示的某4位,转换为对应的ASCII码, 再调用DOS系统功能进行显示。,(1) 对于00001001(09), 先扩展成一个字节,高4位清0,加上30H后, 即可得字符09对应的ASCII码。0000 0001B + 30H= 31H 0000 1001B + 30H=39H 0001B 1 1001B 9,(2) 对于10101111(AF), 先扩展成一个字节,高4位清0,加上30H后, 还要再加上07H,才能得到AF 对应的ASCII码0000 1010B+30H+07H = 41H 0000 1111B+30H+07H =46H 1010B A 1111B F,
8、20,code SEGMENTASSUME CS:code start: MOV CH, 4 ;字符个数MOV CL, 4 ;循环移位次数 next: ROL BX, CL ;取显示位的值MOV DL, BL ;保存在DL中AND DL, 0FH ;清除高4位ADD DL, 30H ;转变为数字的ASCIICMP DL, 39H ;大于39H, 则应转变JLE print ;为字母AF的ASCII ADD DL, 07H print: MOV AH, 2H ;显示DL中的字符INT 21H DEC CH ;显示结束? JNZ nextMOV AH, 4CH ;返回DOSINT 21H code
9、 ENDSEND start,21,思考:1. 例1采用的是大写字母AF进行显示,若采用小写字符a f 进行显示,程序如何改写?1010 0011 1001 1110 A39E 或 a39e,2. 编程将 CPU 内 14个 16位寄存器当前的内容 分别用十六进制形式显示出来。,22,编程将CPU内14个16位寄存器当前的内容分别用十六进制形式显示出来。要点:将上例改写为一个子程,入口参数为BX子程中注意寄存器值的保存和恢复注意: CS 、IP、PSW寄存器值的获取方法,23,例 将CPU内14个16位寄存器当前内容分别用16进制形式显示出来 (采用DEBUG下R命令的显示顺序),24,用十六
10、进制显示 BX内容子程,25,D:LIST_REG ;在DOS下执行程序 0000 0000 00FF 0BDF 0000 0912 0000 0000 0BDF 0BDF 0BEF 0BEF 0000 3202 D: DEBUG LIST_REG.EXE ;利用DEBUG检测结果 -R ;显示当前寄存器内容 AX=0000 BX=0000 CX=007B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=128E ES=128E SS=129E CS=129E IP=0000 NV UP EI PL NZ NA PO NC 129E:0000 53 PUS
11、H BX -G ;执行程序 0000 0000 007B 0000 0000 0000 0000 0000 128E 128E 129E 129E 0000 7202 Program terminated normally -,运行的结果与用R命令显示的结果相同, 程序运行结果正确,26,例2 将键盘输入的十进制数据串转换成相应大小的十六进 制数值存放在BX寄存器中。,问题:要转换成1234 即 04D2h存放在BX中, 怎么实现?,27,算法一:数值大小 = 各位值权值之和1234D = 千位1000 + 百位100 + 十位10 + 个位= 11000 + 2100 + 310 + 4=
12、0000 0100 1101 0010B= 04D2H,28,算法二:数值大小 =部分和10 +下一位数值1234D = ( ( ( 010 + 1 ) 10 + 2 ) 10 + 3 ) 10 + 4= 0000 0100 1101 0010B= 04D2H部分和从0开始,循环次数等于输入的位数,29,30,input PROC LEA DX , string MOV AH , 09HINT 21HLEA DX , numMOV AH , 0AHINT 21HRET input ENDP CODE ENDS END start,31,change子程序流程图,change PROCLEA S
13、I, num+2MOV CL, num+1MOV CH, 0MOV AX, 0MOV DI, 10next: MUL DIMOV BH, 0MOV BL, SIAND BL, 0FH ADD AX, BX INC SILOOP nextzero: MOV BX, AXRETchange ENDP,1234D = ( ( ( 010 + 1 ) 10 + 2 ) 10 + 3 ) 10 + 4,32,list_bx子程序流程图,list_bx PROCMOV CH, 4 MOV CL, 4 next: ROL BX, CL MOV DL, BL AND DL, 0FH ADD DL, 30H CMP DL, 39H JLE print ADD DL, 07H print: MOV AH, 2H INT 21H DEC CH JNZ nextRET ;子程返回 list_bx ENDPcode ENDSEND start,