第六章汇编语言程序设计_第1页
第六章汇编语言程序设计_第2页
第六章汇编语言程序设计_第3页
第六章汇编语言程序设计_第4页
第六章汇编语言程序设计_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章 汇编语言程序设计 程序设计步骤 顺序结构 查表程序 分支结构 循环结构 子程序开始确定解题步骤(算法)上机调试编程画程序框图分析问题(题意)结束重新分析题意改算法调程序课堂教学内容实验教学内容3流程图构成部件:4S1S2S3完成S1的工作完成S2的工作完成S3的工作开始结束走向只有一条路径。 一、一、顺序结构(直线程序)此题可否这样做?为什麽?MOV AX, DS:1000HADD AX, DS:1010HDAA MOV DS:1020H, AX低字节相加调整 存和高字节相加调整 存和开始结束例1、设两个BCD数1234H和5678H分别存放在数据段中从1000H和1010H开始的单元

2、中,计算这两个数的和(10 Y= 0 当 X=0 -1 当 X0X存于BL中,Y送存BH。SYMB: MOV AL,BL ;取;取X ADD AL,0 JZ STOR ;X=0,Y=X TEST AL,80H JNZ MINUS ;X0 MOV AL, 1 ;X0,Y=+1 JMP STORMINUS: MOV AL,0FFH X0,Y= -1STOR: MOV BH,AL ;保存;保存Y HLT 24例例4、判断是否为字母判断是否为字母Y。若。若AL中是字母Y(含大小写),则令AH0,否则令AH1CMP AL, y ;比较AL与小写字母yJZ NEXT ;相等,转移到NEXTCMP AL,

3、Y ;不是小写字母y,是大写字母Y ?JZ NEXT;相等,转移NEXTMOV AH,-1;不是大Y ,令AH1JMP DONE;无条件转移DONENEXT:MOV AH,0;是Y或Y,令AH0DONE:HLT例例5 5、大小写字母转换。大小写字母转换。 A41H01000001BB42H Z5AH01011001Ba61H 01100001B b62H z7AH 01111001B结论结论1:大小写字母的:大小写字母的ASCII码值相差码值相差20H结论结论2:大小写字母的:大小写字母的ASCII码值仅码值仅D5位不同位不同方法方法1(加减指令):(加减指令): “ADD DL,20H” “

4、SUB DL,20H”方法方法2(逻辑指令):(逻辑指令): “OR DL,20H” “AND DL,0DFH”26 ;如果;如果DL是一个小写字母,则转换为大写是一个小写字母,则转换为大写CMP DL ,61H; 比较,小写字母比较,小写字母a=61HJB DISP ;低于小写字母低于小写字母a (是大写字母是大写字母) ,不需要,不需要 ; 处理处理,转转DISP,否则顺序执行否则顺序执行CMP DL ,z ;和小写字母和小写字母z比较比较JA DISP ;高于小写字母高于小写字母z ,也不需要处理,也不需要处理SUB DL,20H;是小写字母,则转换为大写是小写字母,则转换为大写DISP

5、: 实现:实现:ASCII码表码表27 ;如果;如果DL是一个小写字母,则转换为大写是一个小写字母,则转换为大写CMP DL ,61H; 比较,小写字母比较,小写字母a=61HJC DISP ;低于小写字母低于小写字母a (是大写字母是大写字母) ,不需要,不需要 ; 处理处理,转转DISP,否则顺序执行否则顺序执行CMP DL ,z ;和小写字母和小写字母z比较比较JNC DISP ;高于小写字母高于小写字母z ,也不需要处理,也不需要处理SUB DL,20H;是小写字母,则转换为大写是小写字母,则转换为大写DISP: 实现:实现:ASCII码表码表 结束结束 初始化初始化 循环的初始状态循

6、环的初始状态 循环体循环体 循环的工作部分循环的工作部分及修改部分及修改部分 计数计数控制循环控制循环条件条件控制循环控制循环修改部分修改部分控制条件控制条件Y YN N一、结构(循环程序) 包含多次重复执行的程序段,循环结构使程序紧凑。 结束结束 初始化初始化 SISI源、源、DIDI目的指针、目的指针、CXCX计数计数 循环体循环体: :SISIDIDI 循环的工作部分循环的工作部分及修改部分及修改部分 计数计数控制循环控制循环修改部分修改部分:地址和地址和计数计数次数次数=0?N NY Y例例1 、 数据块传送数据块传送(计数计数控制循环控制循环) )30 MOV CX,400H;设置循

7、环次数;设置循环次数400H MOV SI,OFFSET SBUF ;SI指向指向数据段数据段源缓冲区开始源缓冲区开始 MOV DI,OFFSET DBUF ;DI指向指向数据段数据段目的缓冲区开始目的缓冲区开始AG: MOV AL,SI;循环主体(实现数据传送);循环主体(实现数据传送) MOV DI,AL;每次传送一个字节;每次传送一个字节 INC SI;SI和和DI指向下一个单元指向下一个单元 INC DI DEC CX ;循环次数;循环次数CX减减1, JNZ AG ;不为不为0继续循环继续循环 或或LOOP AG HLT;问问:上机调试需写哪些伪指令上机调试需写哪些伪指令?31可上机

8、调试可上机调试:DATA SEGMENTORG1000HSBUF DB 400H DUP(?)ORG1400HDBUF DB 400H DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,400H;设置循环次数;设置循环次数400H MOV SI,OFFSET SBUF ;SI指向指向数据段数据段源缓冲区开始源缓冲区开始 32MOV DI,OFFSET DBUF ;DI指向指向数据段数据段目的缓冲区开始目的缓冲区开始AG: MOV AL,SI;循环主体(实现数据传送);循环主

9、体(实现数据传送) MOV DI,AL;每次传送一个字节;每次传送一个字节 INC SI;SI和和DI指向下一个单元指向下一个单元 INC DI DEC CX ;循环次数;循环次数CX减减1, JNZ AG ;不为不为0继续循环继续循环 MOV AH,4CH INT 21HCODE ENDS END START 存结果存结果 初始化初始化 SISI首地址; ;和清零和清零;CX;CX计数计数 循环体循环体: :AXAXAX+AX+SISI 循环的工作部分循环的工作部分及修改部分及修改部分 计数计数控制循环控制循环修改部分修改部分:地址和地址和计数计数计计数数=0?N NY Y例例2、求首地址为

10、、求首地址为ARRAY的的10个字之和,结果存入个字之和,结果存入TOTAL。 (设(设:10个字之和小于一个字个字之和小于一个字 ) (计数计数控制循环控制循环) ) 34 MOV SI, OFFSET ARRAY MOV AX, 0 MOV CX, 10 L1: ADD AX, SI INC SI INC SI LOOP L1 ;CX-10 转移L1 ;CX-1=0顺序执行 MOV WORD PTR TOTAL, AX问问:上机调试需写哪些伪指令上机调试需写哪些伪指令?35可上机调试可上机调试:DATA SEGMENTORG1000HARRAY DB 400H ,120AH,0F58H,O

11、RG1030HTOTAL DB 2 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX 36 MOV SI, OFFSET ARRAY MOV AX, 0 MOV CX, 10 L1: ADD AX, SI INC SI INC SI LOOP L1 MOV WORD PTR TOTAL, AX MOV AH,4CH INT 21H CODE ENDS END START例例2、求首地址为、求首地址为ARRAY的的10个字之和,结果存入个字之和,结果存入TOTAL。 (若取消设定(若取消设

12、定:10个字之和小于一个字个字之和小于一个字 ) (计数计数控制循环控制循环) ) MOV SI, OFFSET ARRAY XOR AX, AX MOV BL,AL MOV CX, 10 L1: ADD AX, SI ADC BL,0 INC SI INC SI LOOP L1 ;CX-10 转移L1 ,CX-1=0顺序执行 MOV WORD PTR TOTAL, AX MOV WORD PTR TOTAL+2, BL开始置数组首址BX置数组长度CX置数组无符号数最小值AX数组字AX?内容交换修改数组指针到100字?存最大值结束YNNY例3.求无符号字 组中的最大值。已知:数组存放在DS:0

13、042H开始的单元 。字组长度100,最大值送存DS:0040H开始的单元。(实验五实验五A A和实验六子实验六子程序程序ZMAXZMAX可参考可参考)START: MOV AX,DATA ; DATA 为数据段的段名 MOV DS,AX MOV BX,0042H MOV AX,0 MOV CX,100NEXT1: CMP AX,BX JNC NEXT ;AXBX转到NEXT MOV AX,BX ; AX中存大数NEXT: INC BX INC BX LOOP NEXT1 MOV DS:0040H,AX HLT 若本题改为:“求无符号字组中的最小值最小值”,程序作何改动?循环次数已知循环次数已

14、知(计数计数控制控制) 必须采用寄存器间址,才能实现循环。40例4、 确定一串ASCII码字符串的长度(小于一个字)。已知字符串首址BUF,字符串结束标志为回车符(0DH)字符串长度存NUM。 (条件条件控制循环控制循环) )开始置字符串首址SI置字符串个数计数器 BX=1置字符串 结束符 AL=0DH是回车符吗?个数计数器 BX+1修改串地址送长度结束Y YN NST1: MOV SI,OFFSET BUF MOV BX,1 MOV AL,CRNEXT: CMP AL,SI JZ DONE INC BX ;长度加1 INC SI ;修正地址 JMP NEXT DONE: MOV WORD P

15、TR DS: NUMNUM,BX ;存字符串长度 HLT 循环次数未知,特征值控制42开始字存储单元首址SI取数-BX统计1的个数DL清零 BX=0?BX移位1次DL+0+CFDL 存结果结束Y YN N例例5、 记录某个字存储单元数据中记录某个字存储单元数据中1的个数。将的个数。将个数放入个数放入其后单元其后单元.法法1 条件条件控制循环控制循环43;数据段数据段N1 DW 1110 1111 1110 0100B DB?;代码段代码段MOV SI, OFFSET N1MOV BX,SIXOR DL,DL ;DL (统计统计1的个数的个数) 0AGAIN:TEST BX,0FFFFH;也可以

16、用;也可以用CMP BX,0JZ DONE ;全部是;全部是0退出循环退出循环SHL BX,1 ;用指令;用指令SHR BX,1也可以也可以ADC DL,0 ;利用;利用ADC指令加指令加CF的特点进行计数的特点进行计数JMP AGAINDONE: MOV SI+2 , DLHLT 44法法2计数计数控制循环控制循环开始字存储单元首址SI取数-BX, CX=16统计1的个数AL清零移位BX,查CF=0?AL+1ALCX-1CX=0?存1的个数结束YNNY45 STACK SEGMENT ORG0FF00H QQQ DW 40H DUP (?) STACK ENDS DATA SEGMENT O

17、RG0500H N1 DW 1110 1111 1110 0100B DB? DATA ENDS CODE SEGMENT ASSUME CS:CODE ,SS: STACK , DS: DATA ; 段地址寄存器说明 ORG 2000H46START : MOV AX, STACK MOV SS, AX MOV AX, DATA MOV DS, AX MOV SI, OFFSET N1 MOV BX,SI MOV CX,16 XOR AL,AL ; AL(统计统计1的个数的个数)0AGAIN: SHL BX,1 JNC DONE ;CF=0,转转DONE, 否则顺序否则顺序 INC AL ;

18、 ADD AL,1若需要若需要BCD码码 ;DAA DONE: DEC CX JNZ AGAIN MOV SI+2 , AL47MOV AH,4CHINT 21HCODE ENDSEND START 48法法3 存结果存结果 初始化初始化 数据地址 SI;SI;数数-BX BX CXCX计数计数记录记录1的个数的个数AL和和CF清零清零; ; 循环体循环体:BX:BX左移一位左移一位ALALAL+AL+0+CF0+CF 循环的工作部分循环的工作部分及修改部分及修改部分 计数计数控制循环控制循环修改部分修改部分:计数减计数减1 1计计数数=0?N NY Y49法法3 MOV SI, OFFSET

19、 N1 MOV BX,SI MOV CX,16 XOR AL,AL ; AL(统计统计1的个数的个数)0A1: SHL BX,1 ADC AL,0 ; 若需要若需要BCD码码 ;DAA LOOP A1 MOV SI+2 , AL50把把功能功能相对独立的程序段单独编写和调试,作相对独立的程序段单独编写和调试,作为一个相对独立的模块(为一个相对独立的模块(子程序子程序)供其他程序)供其他程序使用使用。子程序可以实现源程序的子程序可以实现源程序的模块化模块化,可简化源程,可简化源程序结构,提高编程效率。序结构,提高编程效率。主程序需要利用主程序需要利用CALL指令调用子程序。指令调用子程序。子程序

20、需要利用子程序需要利用RET指令返回主程序。指令返回主程序。汇编语言中,子程序要用一对过程伪指令汇编语言中,子程序要用一对过程伪指令PROC和和ENDP声明,格式如下:声明,格式如下:过程名过程名PROC NEAR/FARNEAR/FAR;过程体过程体过程名过程名ENDPNEARNEAR属性(段内近调用)属性(段内近调用)FARFAR属性(段间远调用)属性(段间远调用)一、一、子程序编写注意事项子程序编写注意事项子程序要利用过程定义伪指令声明子程序要利用过程定义伪指令声明。子程序中对堆栈的压入和弹出操作要成对使用,子程序中对堆栈的压入和弹出操作要成对使用,保持堆栈的平衡。保持堆栈的平衡。子程序

21、应安排在代码段的主程序之外,最好放在子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置。主程序执行终止后的位置。处理好子程序与主程序间的参数传递问题。处理好子程序与主程序间的参数传递问题。提供必要的子程序说明信息。提供必要的子程序说明信息。53例、主程序和子程序在同一代码段中在同一代码段中CODE SEGMENTCODE SEGMENTMAIN PROC FARMAIN PROC FAR . CALL SUBR1SUBR1 . RETMAIN ENDPMAIN ENDPSUBR1 PROC NEARSUBR1 PROC NEAR . RETSUBR1 ENDPSUBR1 ENDP

22、CODE ENDSCODE ENDSCODE SEGMENTCODE SEGMENTMAIN PROC FARMAIN PROC FAR . CALL SUBR1SUBR1 . RETSUBR1 PROC NEARSUBR1 PROC NEAR . RETSUBR1 ENDPSUBR1 ENDPMAIN ENDPMAIN ENDPCODE ENDSCODE ENDS主程序段子程序段子程序段主程序段例:例: 用显示器功能调用输出一个字符的子程序。用显示器功能调用输出一个字符的子程序。;主程序;主程序 MOV AL,?;主程序提供显示字符;主程序提供显示字符 CALL DP1;调用子程序;调用子程

23、序 MOV AL,H CALL DP1 ;子程序:显示;子程序:显示AL中的字符中的字符DP1PROC;过程定义,过程名为;过程定义,过程名为DP1PUSH AX;顺序入栈,保护寄存器;顺序入栈,保护寄存器PUSH DXMOV DL , AL ;MOV AH, 2;INT 21HPOP DX;逆序出栈,恢复寄存器;逆序出栈,恢复寄存器POP AXRET;子程序返回;子程序返回DP1ENDP;过程结束;过程结束55例:例:将将DLDL的一位的一位1616进制数(低位)转换成进制数(低位)转换成ASCIIASCII码的子程序。码的子程序。主程序:主程序:MOV DL,28H CALL HTOASC

24、 ;调用调用子程序子程序,DL=_HMOV DL,0ABH CALL HTOASC ;调用调用子程序子程序,DL=_H子程序:子程序:HTOASCHTOASCPROCPROCAND DL,0FHAND DL,0FH;只取;只取DLDL的低的低4 4位位OR DL,30HOR DL,30H;DLDL高高4 4位变成位变成3 3CMP DL,39HCMP DL,39H;是;是0 09 9,还是,还是0AH0AH0FH ?0FH ?JBE H1JBE H1;是;是0 09 9,转移,转移(则转)则转)ADD DL,7ADD DL,7;是;是0AH0AH0FH0FH,加上,加上7 7H1:H1:RET

25、RET;子程序返回;子程序返回HTOASCHTOASCENDPENDP56 例:例: 累加数组中的元素。累加数组中的元素。( (和和 ALSHLAX, 1 ;AX*2AXMOVBX, AX;AXBXSHLAX, 1;AX*4SHLAX, 1;AX*8ADDBX, AX ;BXBXSHRBX,1;(10X+4Y)/2BXMOV SI+2, BX ;BL(SI+2) ; BH(SI+3)HLT CODE ENDSENDST164:自DBCD单元开始有一个两位的非BCD数 (低位在前,高位在后) 将其转换成ASC码显示输出。ORG 1000H DATA SEGMENT DBCD DB 05H, 08

26、H DATA ENDS CODE SEGMENT ASSUMECS: CODE, DS: DATA 65 ORG 2000H STARTSTART :MOVAX, DATA ; 送段址和偏移地址 MOVDS, AX MOVSI, 1000H MOVDL, SI+1 ADDDL, 30H ;取高位显示 MOVAH, 2 INT21H66 MOVDL, SI ADDDL, 30H ; 取低位显示 MOVAH, 2 INT21H MOVAH, 4CH ;返回 INT21H CODEENDS ENDENDSTARTSTART67例例 3、将将DL内容在显示屏上进行十进制显示内容在显示屏上进行十进制显示

27、(016数值数值,即上题中统计即上题中统计1的个数)。的个数)。法法1: DL 中为中为十六进制数十六进制数(010H) DONE: CMP DL,10;DL和和10比较比较JC DIGIT;1030H取数1021H+30H-1031H取数1022H+30H -1032H开始结束83S1S2S31032H - DL2-AH, INT 21H1030H - DL2-AH, INT 21H开始结束1031H - DL2-AH, INT 21H84DATA SEGMENTDATA SEGMENTORGORG1000H1000HSZ1 DB 0A3H,0A8H,0B0H,9FH,9EH,0B1H,0A

28、FH,0ADHSZ1 DB 0A3H,0A8H,0B0H,9FH,9EH,0B1H,0AFH,0ADH DB 0A7H,0A8H DB 0A7H,0A8HDATA ENDSDATA ENDS1010H1010H =_H =_H1020H1020H =_H; =_H; 1021H1021H =_H; =_H; 1022H1022H =_H =_H1030H1030H =_H; =_H; 1031H1031H =_H; =_H; 1032H1032H =_H =_H DATA SEGMENTDATA SEGMENTBUF DB 100BUF DB 100 DB DB ? DB 100 DUPDB

29、100 DUP(?)(?)MESG DB MESG DB What is your nameWhat is your name DB DB 0DH, 0AH, $ $;字符串及结束标志;字符串及结束标志DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE, DS:DATA ASSUME CS:CODE, DS:DATAST1 PROC FARST1 PROC FARSTART : : PUSH DSPUSH DS MOV AX,0 MOV AX,0 PUSH AX PUSH AX例4:在屏幕上显示一行提示符,然后接收从键盘输入的信息

30、并存入内存缓冲区(BUF)。 MOV AX,DATAMOV AX,DATA MOV DS,AX MOV DS,AX MOV DX,OFFSET MESGMOV DX,OFFSET MESG MOV AH,9 MOV AH,9 ;显示字符串;显示字符串 INT 21HINT 21H MOV DX,OFFSET BUFMOV DX,OFFSET BUF MOV AH,10 MOV AH,10 ;输入字符串;输入字符串 INT 21HINT 21H RETRETST1 ENDPST1 ENDPCODE ENDSCODE ENDS END STARTEND START例5:在CRT上循环显示0-98之

31、间的十进制数。十进制数ASCII码CRT显示开始置数字初值回车换行产生十进制数数98?从0开始BCD转换ASCII送CRT显示延时NYDATA SEGMENTDATA SEGMENTBUF DB 3 DUPBUF DB 3 DUP(?)(?)DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE, DS:DATA ASSUME CS:CODE, DS:DATAMAIN PROC FARMAIN PROC FARST1:ST1: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV BL,

32、-1 MOV BL,-1 PUSH BX PUSH BX ;保;保 存存BLBLNEXTNEXT: MOV SI,OFFSET BUFMOV SI,OFFSET BUF MOV DLMOV DL,0DH 0DH ;回车符;回车符 MOV AH,2MOV AH,2 INT 21H INT 21H ;送显示;送显示 MOV DL,0AH ;MOV DL,0AH ;输出换行符输出换行符 MOV AH,2MOV AH,2 INT 21H INT 21H POP BX ; POP BX ;取出取出BLBL MOV AL, BL MOV AL, BL ;产生十进制数;产生十进制数 ADD AL,1ADD

33、AL,1 JZ JZ N1 N1 DAADAAN1: CMP AL,99HN1: CMP AL,99H JC JC NEXT1 NEXT1 ;ALAL低于低于99H99H转转NEXT1NEXT1 MOV AL, MOV AL, 0 0NEXT1: MOV BL,ALNEXT1: MOV BL,AL PUSH BX ; PUSH BX ;暂存暂存BL(BL(十进制数十进制数) ) MOV DL,AL ; MOV DL,AL ;十进制数转十进制数转ASCIIASCII MOV CL, MOV CL,4 4 ; ;高高4 4位转位转ASCIIASCII SHR AL,CLSHR AL,CL OR A

34、L,30HOR AL,30H MOV SI,AL MOV SI,AL INC SIINC SI MOV AL,DL MOV AL,DL ;低;低4 4位转位转ASCIIASCII AND AL,0FHAND AL,0FH OR AL,30HOR AL,30H MOV SI,AL MOV SI,AL INC SI INC SI MOV AL,$ MOV AL,$ MOV SI,AL MOV SI,AL ;字符串结束符;字符串结束符 MOV DX,OFFSET BUF MOV DX,OFFSET BUF ;9 9号调用送显示号调用送显示 MOV AH,9MOV AH,9 INT 21H INT 2

35、1H MOV CX,0FFFFH MOV CX,0FFFFH ;延时;延时DY: LOOP DY DY: LOOP DY JMP NEXT JMP NEXT RETRETMAIN ENDPMAIN ENDPCODE ENDSCODE ENDS END ST1 END ST1例例6 6: 有有100100个字节的无符号数组,已按由大到小顺序排个字节的无符号数组,已按由大到小顺序排列。现给定一个无符号数列。现给定一个无符号数x x,若数组中有,若数组中有x x,则程序结束,则程序结束,否则将否则将x x按顺序插入适当位置,并修改数组长度。按顺序插入适当位置,并修改数组长度。大小.TAB100100字节字节X 开始修改数组长度插入x数组内容=x?数组后

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论