




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 汇编语言程序设计 用汇编语言编程属结构化程序设计。 需按照结构化的思想来进行汇编程序的设计分析题意,确定算法根据算法画出程序框图根据框图编写程序上机调试程序执行程序按照自上而下的设计方法,设计一个汇编程序的步骤: 顺序程序 分支程序 循环程序从结构上来讲,一般的汇编程序可分为:Eg:从键盘输入一个字符并存储到字节变量BUF单元中.分析: 用DOS功能调用完成键入,输入 的字符保存在AL寄存器中 将AL中的内容存到定义在数据 段的变量BUF所指单元中 顺序程序设计.486DATA SEGMENT USE16 BUF DB ?DATA ENDS源程序清单:CODESEGMENT USE16
2、 ASSUME CS : CODE , DS : DATABEG:MOV AX , DATAMOV DS , AXMOV AH , 1INT 21H ;AL=键入字符的MOV BUF , AL ASIIC码MOV AH , 4CHINT 21HCODEENDSEND BEG 分支程序设计 转移指令可用来实现分支程序设计分支程序分三种: 简单分支 复合分支 多分支 简单分支 即两路分支,该分支程序结构为:条件满足否?程序段1程序段2YN Eg: 将BX寄存器的内容以二进制数格式显在屏幕上BX=1110010011100110B 简单分支 RCL0SALROLCFCFCF 486CODE SEGM
3、ENT USE16 ASSUME CS:CODE BEG: MOV BX,5678H MOV CX,16 LAST: MOV AL,0 ROL BX,1 JNC NEXT MOV AL,1 NEXT: MOV AH,0EH INT 10H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG ADC AL,0 数BX,16 CXC标=?1AL调BIOS.0EHCX-1CXCX=00ALBX左移一位10NY返DOS源程序清单: 复合分支判断的条件是复合条件,称复合判断 复合分支程序结构为:条件1和条件2.满足否?程序段1程序段2YNEg:某科室9人,统计月
4、收入在800900间的人数,并用十进制数显示 复合分支 分析:月收入是无符号数,对一批数处理应该用间址。 数轴: N1 (800) N2 (900) 多分支判断条件后有多个出口,判断一次只能选择一个分支。 多分支程序结构为:1条件属哪种情况?程序段1程序段n+m.程序段nnn+m例.多分支段内转移要求:键入0,转P0程序段 键入1,转P1程序段 键入9,转P9程序段思路:用比较指令配合直接转移指令实现 CMP 键入字符,0 JE P0 CMP 键入字符,1 JE P1 用转移地址表配合间接转移指令实现 多分支 486DATA SEGMENT USE16TAB DW P0,P1,P9 ;汇编后自
5、动装入相应的偏移地址MESG DB 0DH,0AH,strike 09:$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AXAGA: MOV AH,9 MOV DX,OFFSET MESG INT 21H MOV AH,1 INT 21H CMP AL,0 JC AGACMP AL,9JA AGASUB AL,30HMOVZX BX,ALADD BX,BX;2BXBXMOV SI,OFFSET TABJMP BX+SI;DS:BX+SI IPP0: P1: P9: CODE ENDS END
6、BEG 或:MOV BX,BX+SI JMP BX ;BX IP源程序清单: 循环程序设计循环程序的组成: 循环准备 循环体 循环控制1. 循环程序的结构Y预置循环次数其他准备工作循环体循环减1计数退出循环结果为0?N(a)单循环结构(b) 双循环结构结果为0?循环体内循环减1计数结果为0?外循环减1计数退出循环预置外循环次数其他准备工作预置内循环次数其他准备工作NNYYEg: 假设从BUF单元开始为一个 ASCII码字符串,找出其中的最大数送屏幕显示。 循环程序设计思路:ASC码数为无符号数,无符号数的最小数为0YNN数据区首址DS:BX无符号最小数AL数据个数CXBX ALBX=AL?BX
7、+1 BXCX-1 CX显示结果返回DOSCX=0?Y 486 DATA SEGMENT USE16 BUF DB QWERTYUIOP123 COUNT EQU $ -BUF;统计串长度 MAX DB MAX=,?,0DH,0AH,$ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG: MOV AX,DATA MOV DS,AX MOV AL,0 ;无符号最小数 0 AL LEA BX,BUF ;串首址偏移量BX MOV CX,COUNT ;串长度CX LAST: CMP BX,AL;比较 JC NEXT MOV AL,BX;大数
8、ALNEXT: INC BX LOOP LAST ;循环计数 MOV MAX+4,AL ;最大数MAX+4 单元 MOV AH,9 MOV DX,OFFSET MAX INT 21H ;显示结果 MOV AH,4CH INT 21H ;返回 DOSCODE ENDS END BEG 源程序清单1: 486DATA SEGMENT USE16BUF DB QWERTYUIOP123FLAG DB 1 ;设置串结束标志MAX DB MAX=,?,0DH,0AH,$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA M
9、OV DS,AX MOV AL,0 ;无符号最小数 0 AL LEA BX,BUF ;串首址偏移量BXLAST: CMP BYTE PTR BX, -1 ;BX=串结束标志 ? JE DISP ;是,转 CMP BX,AL JC NEXT MOV AL,BX ;大数ALNEXT: INC BX JMP LASTDISP: MOV MAX+4,AL ;最大数MAX+4 单元 MOV AH,9 MOV DX,OFFSET MAX INT 21H ;显示结果 MOV AH,4CH INT 21H ;返回 DOSCODE ENDS END BEG 源程序清单2:汇编程序设计举例 代 码 转 换代码转换
10、 常见的代码转换有: 二进制数显示 二进制数十进制数显示 二进制数十六进制数显示 BCD码数二进制数代码转换A二进制数显示:例.把键盘输入的一位数(09),转换成等值二进数显示显示的格式要求如下:Please Enter:ERROR!Please Enter:9=00001001B代码转换思路:键盘缓冲区中是键入字符的ASC码。 09的ASC码为30H39H。二进制数每一位代码的判断:本程序采用两种格式设计源程序:一种是EXE文件编程格式,另一种是COM文件编程格式。RCL0SALROLCFCFCF程序框图: AL-30HBL =屏幕,8CX 0 屏幕1 屏幕CX-1 CXB 屏幕,返回DOS
11、NN给出操作提示键盘输入ALAL=09?CF=?CX=0?BL左移一位Y显示错误信息 Y01 . 486DATA SEGMENT USE16MESG1 DB Please Enter ! ,0DH,0AH,$MESG2 DB -Error ! $ DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX,OFFSET MESG1 INT 21H ;显示操作提示 MOV AH,1 INT 21H ;等待键入 CMP AL,3AH JNC ERROR ;9转 CMP AL
12、,30H EXE格式程序清单 JC ERROR ;0转 SUB AL,30H MOV BL,AL ;BL=09 的二进制数 MOV AH,2 MOV DL,= INT 21H CALL DISP MOV AH,2 MOV DL,B INT 21H JMP EXITERROR: MOV AH,9 MOV DX,OFFSET MESG2 INT 21H ;显示错误信息EXIT: MOV AH,4CH INT 21H;-DISP PROC ;显示BL中的二进制数 MOV CX,8LAST: MOV DL,0 RCL BL,1 JNC NEXT MOV DL,1NEXT: MOV AH,2 INT 2
13、1H LOOP LAST RETDISP ENDPCODE ENDS END BEG EXE格式程序清单 . 486CODE SEGMENT USE16 ASSUME CS:CODE ORG 100HSTART: JMP BEGMESG1 DB Please Enter ! ,0DH,0AH,$MESG2 DB -Error ! $ BEG: MOV AH,9 MOV DX,OFFSET MESG1 INT 21H ;显示操作提示 MOV AH,1 INT 21H ;等待键入 CMP AL,3AH JNC ERROR ; 9 转 CMP AL,30H JC ERROR ; 0 转 SUB AL
14、,30H MOV BL,AL ;BL=09 的二进制数 MOV AH,2 MOV DL,= INT 21H CALL DISP MOV AH,2 MOV DL,B INT 21H JMP EXIT MOV DX,OFFSET MESG2 INT 21H ;显示错误信息 INT 21H ERROR: MOV AH,9EXIT: MOV AH,4CHCOM格式程序清单;-DISP PROC ;显示BL中的二进制数 MOV CX,8LAST: MOV DL,0 RCL BL,1 JNC NEXT MOV DL,1NEXT: MOV AH,2 INT 21H LOOP LAST RETDISP END
15、PCODE ENDS END START COM格式程序清单问题:键入的是两位十进制数时,如何将该十进制数的二进制数显示在屏幕上?代码转换二.二进制数十六进制数显示算法:四位二进制数等值的十六进制数十六进制数 ASC码算法000010011010111109AF30H39H41H46H四位二进制数+30H= 等值的十六进制数ASC码四位二进制数+37H= 等值的十六进制数ASC码代码转换编程技巧:8位二进制数截取高4位显示显示截取低4位XXXXXXXXXXXX0 0 0 0XXXX0 0 0 016进制数ASC码16进制数ASC码代码转换例.设从BNUM单元开始,有4个16位的二进制数,要求把
16、它们转换成16进制数,并送屏幕显示。 程序清单 . 486 DATA SEGMENT USE16 BNUM DW 0001001000110100B ;1234H DW 0101011001111000B ;5678H DW 0001101000101011B ;1A2BH DW 0011110001001101B ;3C4DH BUF DB 4 DUP(?), H $ ;输出缓冲区 COUNT DB 4 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATABEG: MOV AX,DATA MOV DS,AX MOV CX,4 MOV BX,
17、OFFSET BNUMAGA: MOV DX,BX SAL EDX,16 CALL N2_16ASC MOV AH,9 MOV DX,OFFSET BUF INT 21H ;显示一个16进数 ADD BX,2 ;地址加 2 LOOP AGA MOV AH,4CH INT 21H;二进数十六进数ACSII码N2_16ASC PROC MOV SI,OFFSET BUF ;输出缓冲区地址SI MOV COUNT,4LAST: ROL EDX,4 AND DL,0FH CMP DL,10 JC NEXT ADD DL,7NEXT: ADD DL,30H MOV SI,DL INC SI ;地址加1
18、DEC COUNT ;计数 JNZ LAST RETN2_16ASC ENDPCODE ENDS END BEGEXE格式程序清单代码转换三.BCD码二进制数例.4位BCD码数二进制数显示算法:设4位BCD码数列为:N3 N2 N1 N0,等值二进制数=N31000+N2100+N110+N0 =(010+N3)10+N2)10+N1)10+N0编程考虑:4位BCD码最大为9999H,等值的二进制数最大为16位(超过8位),而且D15位肯定为0分离出BCD千位N3,百位N2,十位N1,个位N0设计一个AX10+BX AX的子程序供调用,首次调用时,令AX=0,BX=N3,共调用4次,则AX中即
19、为等值的二进制数。 486CODE SEGMENT USE16 ASSUME CS:CODENUM DW 4567H ;BCD码表示BEG: MOV CX,4 ;4次调用 MOV AX,0AGA: ROL NUM, 4 MOV BX,NUM AND BX,000FH IMUL AX,10 ADD AX,BX LOOP AGA 显示AX中的二进制数 返回DOSCODE ENDS END BEG本例数据放在代码段!本例: 因为AX的D15=0,是正的有符号数,所以可用IMUL指令AX10+BXAXEXE格式程序清单代码转换三.二进制数十进制数方法:比较法,恢复余数法,除法 8位二进制数最大为111
20、11111, 等值的十进制数为255, 比较法的关键:判断某二进制数(假设为BEN单元的内容)包含几个100,几个10,几个1 1. 8位二进制数十进制数,比较法: DL+1DL(BEN)-10BEN(BEN)=100?NY(BEN)=10?NY0 DL DL+1DL(BEN)-100BENDL+30H屏幕 0DL DL+30H屏幕(BEN)+30H屏幕 返回DOS . 486CMPDISP MACRO NN LOCAL LAST, NEXT MOV DL,0 ;DL清0LAST: CMP BEN, NN ;比较 JC NEXT ;BENNN转 INC DL ;DL加1 SUB BEN, NN
21、 JMP LASTNEXT: ADD DL, 30H MOV AH,2 INT 21H ;显示 ENDMCODE SEGMENT USE16 ASSUME CS:CODEBEN DB 10101110B ;=174BEG: CMPDISP 100 CMPDISP 10 CMPDISP 1 MOV AH,4CH INT 21HCODE ENDS END BEGEXE格式程序清单代码转换2. 8位二进制数十进制数,恢复余数法(请自学)3. 8位二进制数十进制数,“除权值求商”的算法分析把11110101B十进制数245算法:依次用权值100,10,1去除上次的余数,直到余数为0时停止。每次除法所得
22、的商数顺序排列,即为十进制数。 1 1 1 1 0 1 0 111001001 1 0 0 1 0 01 0 1 1 0 11 02权值(100)10 1 0 1 5 1 0 1 1 0 1 0余数为0时止1权值(1) 1 0 0 4 1 0 1 1 0 1 1 0 1 0 1 0 11010权值(10)10例. 将NUM单元中的16位二进制数,转换成十进制数显示。思路: 16 位二进制数:最大为11,其等值的十进制数为65535,故应判断NUM单元的数包含几个10000,几个1000,几个100,几个10,几个 1设计一个XXYY并显示商值的宏指令供调用,XX为32位,YY为16为二进制数。
23、DX,AX为被除数 486DIVIDE MACRO XX,YY MOV AX,XX MOV DX,0 MOV CX,YY ;CX为除数 DIV CX ;AX=商,且1010B,DX=余数 MOV AH,0EH ADD AL,30H INT 10H ENDMCODE SEGMENT USE16 ASSUME CS:CODENUM DW 65530 ;汇编后为二进制数BEG: DIVIDE NUM, 10000 DIVIDE DX, 1000 本题在代码段中设置数据,这是COM格式?EXE格式?如果改为:BEG: MOV BX,OFFSET NUM DIVIDE BX,10000 是错误的,为什么? DIVIDE DX, 100 DIVIDE DX, 10 DIVIDE DX, 1 MOV AH, 4CH INT 21HCODE ENDS END BEG显示一位商值不能颠倒分析:应写成:DIVIDE CS:BX,10000程序清单代码转换4. 8位二进制数十进制数,“除十取余”的算法分析 把11110101十进制数245算法:N被(10)10除,商再被(10)10除,直到商数为0时止。每次所得的余数按倒序方式排列显示。编程技巧:每次除法的余数栈,除法结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年PM10自动采样器及测定仪合作协议书
- 2025年综合零售服务合作协议书
- 2025年SUR二次纤维障碍控制剂合作协议书
- 2025年上海2024道路运输危险品从业资格证考试
- 2025年口腔化学品:牙膏项目发展计划
- 农村合作社农户种植合作协议
- 金融科技行业大数据风控模型设计与实现方案
- 2025年休闲健身服务项目合作计划书
- 社区工作会议总结
- 在线平台合作协议及业务整合策略探讨
- 八省联考陕西试题及答案
- 烧烫伤健康宣教
- 医院门诊院感制度
- 腔隙性脑梗塞护理常规
- 《国务院安委会关于加强人员密集场所动火作业安全管理措施》知识培训
- 人工智能在价格预测中的应用-深度研究
- 与高校科研合作合同范本
- 统编历史七年级下册(2024版) 第一单元第4课-安史之乱与唐朝衰亡【课件】d
- 2025年诗词大赛考试指导题库300题(含答案)
- 《新闻传播学》课件
- Unit 3 The world of Science 大单元教学设计-2023-2024学年高中英语外研版(2019)必修第三册
评论
0/150
提交评论