微机原理与接口技术 第6章2课件_第1页
微机原理与接口技术 第6章2课件_第2页
微机原理与接口技术 第6章2课件_第3页
微机原理与接口技术 第6章2课件_第4页
微机原理与接口技术 第6章2课件_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第6章汇编语言程序设计

用汇编语言编程属结构化程序设计。需按照结构化的思想来进行汇编程序的设计分析题意,确定算法根据算法画出程序框图根据框图编写程序上机调试程序执行程序按照自上而下的设计方法,设计一个汇编程序的步骤:顺序程序分支程序循环程序从结构上来讲,一般的汇编程序可分为: .486DATASEGMENTUSE16

BUF DB ?DATAENDS源程序清单:CODE SEGMENTUSE16 ASSUME CS:CODE,DS:DATABEG: MOV AX,DATA MOV DS,AX MOV AH,1 INT 21H;AL=键入字符的 MOV BUF,ALASIIC码 MOV AH,4CH INT 21HCODE ENDS END BEG

分支程序设计

转移指令可用来实现分支程序设计分支程序分三种:简单分支

复合分支多分支

简单分支即两路分支,该分支程序结构为:条件满足否?程序段1程序段2YN·486CODESEGMENTUSE16ASSUME

CS:CODEBEG:MOVBX,5678HMOVCX,16LAST:MOVAL,’0’ROLBX,1JNCNEXT

MOVAL,’1’NEXT:MOVAH,0EH

INT10HLOOPLASTMOVAH,4CHINT21H

CODEENDSENDBEGADCAL,0数→BX,16→CXC标=?‘1’→AL调BIOS.0EHCX-1→CXCX=0‘0’→ALBX左移一位10NY返DOS源程序清单:复合分支判断的条件是复合条件,称复合判断复合分支程序结构为:条件1和条件2...满足否?程序段1程序段2YNEg:某科室9人,统计月收入在800~900间的人数,并用十进制数显示

复合分支

分析:月收入是无符号数,对一批数处理应该用间址。数轴:··

N1(800)N2(900)

例.多分支段内转移要求:键入0,转P0程序段键入1,转P1程序段……键入9,转P9程序段思路:①用比较指令配合直接转移指令实现CMP键入字符,‘0’JEP0CMP键入字符,‘1’JEP1……

②用转移地址表配合间接转移指令实现

多分支

·486DATASEGMENTUSE16TABDWP0,P1,…,P9;汇编后自动装入相应的偏移地址MESGDB0DH,0AH,’strike0~9:$’DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXAGA:MOVAH,9MOVDX,OFFSETMESGINT21HMOVAH,1INT21HCMPAL,’0’JCAGACMPAL,’9’JAAGASUBAL,30HMOVZXBX,ALADDBX,BX;2×BX→BXMOVSI,OFFSETTABJMP[BX+SI];DS:[BX+SI]→IPP0:…P1:………P9:…CODEENDSENDBEG或:MOVBX,[BX+SI]JMPBX;BX→IP源程序清单:

循环程序设计循环程序的组成:循环准备

循环体循环控制Eg:假设从BUF单元开始为一个ASCII码字符串,找出其中的最大数送屏幕显示。循环程序设计思路:ASCⅡ码数为无符号数,无符号数的最小数为0YNN数据区首址→DS:BX无符号最小数→AL数据个数→CX[BX]→AL[BX]>=AL?BX+1→BXCX-1→CX显示结果返回DOSCX=0?Y·486DATASEGMENTUSE16BUFDB'QWERTYUIOP123'

COUNTEQU$-BUF;统计串长度MAXDB'MAX=',?,0DH,0AH,'$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAL,0

;无符号最小数0→ALLEABX,BUF

;串首址偏移量→BX

MOVCX,COUNT

;串长度→CX

LAST:CMP[BX],AL;比较JCNEXTMOVAL,[BX];大数→ALNEXT:INCBXLOOPLAST;循环计数MOVMAX+4,AL;最大数→MAX+4单元MOVAH,9MOVDX,OFFSETMAXINT21H;显示结果MOVAH,4CHINT21H;返回DOSCODEENDSENDBEG

源程序清单1:

·486DATASEGMENTUSE16BUFDB'QWERTYUIOP123'FLAGDB-1

;设置串结束标志MAXDB'MAX=',?,0DH,0AH,'$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAL,0

;无符号最小数0→ALLEABX,BUF

;串首址偏移量→BXLAST:CMPBYTEPTR[BX],-1

;[BX]=串结束标志?JEDISP;是,转CMP[BX],ALJCNEXTMOVAL,[BX]

;大数→ALNEXT:INCBXJMPLASTDISP:MOVMAX+4,AL

;最大数→MAX+4单元MOVAH,9MOVDX,OFFSETMAXINT21H;显示结果MOVAH,4CHINT21H;返回DOSCODEENDSENDBEG

源程序清单2:代码转换常见的代码转换有:二进制数→显示二进制数→十进制数→显示二进制数→十六进制数→显示BCD码数→二进制数代码转换A二进制数显示:例.把键盘输入的一位数(0~9),转换成等值二进数显示显示的格式要求如下:PleaseEnter:ERROR!PleaseEnter:9=00001001B程序框图:AL-30H→BL‘=’→屏幕,8→CX‘0’→屏幕‘1’→屏幕CX-1→CX‘B’→屏幕,返回DOSNN给出操作提示键盘输入→ALAL=‘0’~’9’?CF=?CX=0?BL左移一位Y显示错误信息

Y01.486DATASEGMENTUSE16MESG1DB'PleaseEnter!',0DH,0AH,'$'MESG2DB‘------Error!$'DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVAH,9MOVDX,OFFSETMESG1INT21H;显示操作提示MOVAH,1INT21H;等待键入CMPAL,3AHJNCERROR;>'9'转CMPAL,30H[EXE格式程序清单]JC

ERROR;<'0'转SUBAL,30HMOVBL,AL

;BL=0~9的二进制数MOVAH,2MOVDL,'='INT21HCALLDISPMOVAH,2MOVDL,'B'INT21HJMPEXITERROR:MOVAH,9MOVDX,OFFSETMESG2INT21H

;显示错误信息EXIT:MOVAH,4CHINT21H;---------------------------------DISPPROC;显示BL中的二进制数MOVCX,8LAST:MOVDL,'0'RCLBL,1JNCNEXTMOVDL,'1'NEXT:MOVAH,2INT21HLOOPLASTRETDISPENDPCODEENDSENDBEG[EXE格式程序清单];-------------------------------DISPPROC;显示BL中的二进制数MOVCX,8LAST:MOVDL,'0‘RCLBL,1JNCNEXTMOVDL,'1'NEXT:MOVAH,2INT21HLOOPLASTRETDISPENDPCODEENDSENDSTART[COM格式程序清单]问题:键入的是两位十进制数时,如何将该十进制数的二进制数显示在屏幕上?代码转换二.二进制数→十六进制数显示算法:四位二进制数等值的十六进制数十六进制数ASCⅡ码算法0000~10011010~11110~9A~F30H~39H41H~46H四位二进制数+30H=等值的十六进制数ASCⅡ码四位二进制数+37H=等值的十六进制数ASCⅡ码代码转换编程技巧:8位二进制数截取高4位显示显示截取低4位XXXXXXXXXXXX0000XXXX000016进制数ASCⅡ码16进制数ASCⅡ码代码转换例.设从BNUM单元开始,有4个16位的二进制数,要求把它们转换成16进制数,并送屏幕显示。

[程序清单].486DATASEGMENTUSE16BNUMDW10100B;1234HDW11000B;5678HDW01011B;1A2BHDW01101B;3C4DHBUFDB4DUP(?),‘H$’;输出缓冲区COUNTDB4DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVCX,4MOVBX,OFFSETBNUMAGA:MOVDX,[BX]

SALEDX,16

CALLN2_16ASCMOVAH,9MOVDX,OFFSETBUFINT21H

;显示一个16进数ADDBX,2;地址加2LOOPAGAMOVAH,4CHINT21H;二进数→十六进数ACSII码N2_16ASCPROCMOVSI,OFFSETBUF

;输出缓冲区地址→SIMOVCOUNT,4LAST:ROLEDX,4

ANDDL,0FHCMPDL,10JCNEXTADDDL,7NEXT:ADDDL,30HMOV[SI],DLINCSI;地址加1DECCOUNT;计数JNZLASTRETN2_16ASCENDPCODEENDSENDBEG[EXE格式程序清单]代码转换三.BCD码→二进制数例.4位BCD码数→二进制数显示算法:设4位BCD码数列为:N3N2N1N0,等值二进制数=N3×1000+N2×100+N1×10+N0=(((0×10+N3)×10+N2)×10+N1)×10+N0编程考虑:4位BCD码最大为9999H,等值的二进制数最大为16位(超过8位),而且D15位肯定为0分离出BCD千位N3,百位N2,十位N1,个位N0设计一个AX×10+BX→AX的子程序供调用,首次调用时,令AX=0,BX=N3,共调用4次,则AX中即为等值的二进制数。·486CODESEGMENTUSE16ASSUMECS:CODENUMDW4567H

;BCD码表示BEG:MOVCX,4;4次调用

MOVAX,0AGA:ROLNUM,4MOVBX,NUMANDBX,000FH

IMULAX,10ADDAX,BXLOOPAGA显示AX中的二进制数返回DOSCODEENDSENDBEG本例数据放在代码段!本例:因为AX的D15=0,是正的有符号数,所以可用IMUL指令AX×10+BX→AX[EXE格式程序清单]代码转换三.二进制数→十进制数方法:比较法,恢复余数法,除法8位二进制数最大为11111111,等值的十进制数为255,

比较法的关键:判断某二进制数(假设为BEN单元的内容)包含几个100,几个10,几个1

1.8位二进制数→十进制数,比较法:DL+1→DL(BEN)-10→BEN(BEN)>=100?NY(BEN)>=10?NY0→DLDL+1→DL(BEN)-100→BENDL+30H→屏幕0→DLDL+30H→屏幕(BEN)+30H→屏幕返回DOS.486CMPDISPMACRONNLOCALLAST,NEXTMOVDL,0;DL清0LAST:CMPBEN,NN;比较JCNEXT;BEN<NN转INCDL;DL加1SUBBEN,NNJMPLASTNEXT:ADDDL,30HMOVAH,2INT21H;显示ENDM

CODESEGMENTUSE16ASSUMECS:CODEBENDB10101110B;=174BEG:CMPDISP100CMPDISP10CMPDISP1MOVAH,4CHINT21HCODEENDSENDBEG[EXE格式程序清单]代码转换2.8位二进制数→十进制数,恢复余数法(请自学)3.8位二进制数→十进制数,“除权值求商”的算法分析把11110101B→十进制数245算法:①依次用权值100,10,1去除上次的余数,直到余数为0时停止。②每次除法所得的商数顺序排列,即为十进制数。

11110101110010010110110……2权值(100)10101……51011010……余数为0时止1权值(1)100……4

10110110101011010权值(10)10例.

将NUM单元中的16位二进制数,转换成十进制数显示。思路:16位二进制数:最大为1……1,其等值的十进制数为65535,故应判断NUM单元的数包含几个10000,几个1000,几个100,几个10,几个1设计一个XX÷YY并显示商值的宏指令供调用,XX为32位,YY为16为二进制数。DX,AX为被除数·486DIVIDEMACROXX,YYMOVAX,XXMOVDX,0MOVCX,YY;CX为除数DIVCX

;AX=商,且<1010B,DX=余数MOVAH,0EHADDAL,30HINT10HENDMCODESEGMENTUSE16ASSUMECS:CODENUMDW65530;汇编后为二进制数BEG:DIVIDENUM,10000DIVIDEDX,1000①本题在代码段中设置数据,这是COM格式?EXE格式?②如果改为:BEG:MOVBX,OFFSETNUMDIVIDE[BX],10000……是错误的,为什么?DIVIDEDX,100DIVIDEDX,10DIVIDEDX,1MOVAH,4CHINT21HCODEENDSENDBEG显示一位商值不能颠倒分析:应写成:DIVIDECS:[BX],10000[程序清单]代码转换4.8位二进制数→十进制数,“除十取余”的算法分析

把11110101→十进制数245算法:①N被(10)10除,商再被(10)10除……,直到商数为0时止。②每次所得的余数按倒序方式排列显示。编程技巧:每次除法的余数→栈,除法结束后,再从堆栈中依次弹出余数+30H→屏。11000

1111010110

温馨提示

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

评论

0/150

提交评论