微机原理及接口技术(第三章-6)_第1页
微机原理及接口技术(第三章-6)_第2页
微机原理及接口技术(第三章-6)_第3页
微机原理及接口技术(第三章-6)_第4页
微机原理及接口技术(第三章-6)_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

五、汇编语言程序设计

讲课内容一、概述1.编写汇编语言程序步骤2.判断程序质量的标准3.几种程序结构二、汇编语言程序设计举例例1将寄存器BX中的内容以十六进制形式显示出来。例2将键盘输入的十进制数据串转换成其相应大小的数值存放在BX寄存器中。1一、概述1.

编写汇编语言程序步骤2.

判断程序质量的标准3.

几种程序结构2一.编写汇编语言程序步骤分析实际问题,抽象描述问题的模型确定解决模型的算法按算法画出程序流程图按流程图编写程序上机调试,运行程序32.判断程序质量的标准程序的正确性程序的可读性程序的执行时间程序所占内存大小43.几种程序结构顺序结构分支结构循环结构子程结构5顺序结构6例:P156内存中自TABLESQ开始的16个单元连续存放着自然数0到15的平方值,任给一数x(0≤x≤15)在XY单元中,查表求出X的平方值,将结果存入YY单元中。DATASEGMENTTABLESQDB0,1,4,9,16,25,36,49,DB64,81,100,121,144,169,225XXDB?YYDB?DATAENDSSTACKSEGMENPARASTACK’STACK’DB50DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTACKPROCFAR**BEGIN:PUSHDS**MOVAX,0**PUSHAX **MOVAX,DATAMOVBX,OFFSETTABLESQMOVAH,0MOVAL,XXADDBX,AXMOVAL,[BX]MOVYY,ALRET**STARTENDP**CODEENDSENDBEGIN

7例3:符号函数的处理有一符号函数:

Y=1,当X>0(-128≤x≤127)0,当X=0-1,当X<0设给定值X存放于XX单元,函数Y值存放于YY单元,则按X的不同取值给Y赋值的程序如下:MOVAL,XXCMPAL,0JGEBIGRMOVYY,AL;X<0时,-1送入YY单元HLT这是一个多重分支的程序,其流程图见图

开始取数X<0?X=0?Y=0Y=1Y=FFHY=FFH送存结束YNN8例:某工厂有8种产品的加工程序RO到R7分别存放在SRRO,SBRI,…,SBR7为首地址的内存区域中,这8个首地址的偏移量连续存放在B以BASE为首地址的跳转表内,如图:BASESBRO低位字节BASE+1SBRO高位字节BASE+2SBR1低位字节BASE+3

SBR1高位字节……BASE+14SBR7低位字节BASE+15SBR7高位字节…跳转表…………SBROSBR1…SBR7≈≈9两个分支YN

、、、

CMPAL,BLJGgreat

JMPexitgreat:

exit:、、、、、、

AL≤BL处理AL>BL处理分支结构10三个分支

、、、

CMPAL,0

JGgreat

JLless

JMPexitless:

JMPexitgreat:

exit:

、、、AL=0处理AL>0处理AL<0处理YYNN分支结构11循环结构当型循环(当条件成立进入循环)循环初始设置循环体循环条件判断?YN直到型循环(直到条件成立退出循环)YN循环初始设置循环体循环条件判断?121.多处调用完成同一功能的子程:codeSEGMENTstart:、、

CALLsub

、、

CALLsub

、、

CALLsub

、、

MOVAH,4CHINT21HsubPROC

、、、、

RETsubENDPcodeENDSENDstart2.模块化程序设计:codeSEGMENTbegin:CALL

sub1

CALLsub2

CALLsub3MOVAH,4CHINT21Hsub1PROC

、、

RETsub1ENDPsub2PROC

、、

RETsub2ENDPsub3PROC

、、

RETsub3ENDPcodeENDSENDbegin

子程结构注意返回DOS语句位置13思考如下程序的执行流程:codeSEGMENTstart:、、

CALLsub

、、

CALLsub

、、;MOVAH,4CH;INT21HsubPROC

、、

、、

RETsub

ENDPMOVAH,4CH

INT21HcodeENDSENDstart程序执行不到返回DOS功能调用处,最后的结果是死机.14二、汇编语言程序设计举例例1

将寄存器BX中的内容以十六进制形式显示出来。

(二进制十六进制)例2

将键盘输入的十进制数据串转换成其相应大小的数值存放在BX寄存器中。15有关字符、数码转换的处理1.

计算机处理字符时,常用的字符编码是ASCII码。2.

数字和字母的ASCII码是一个有序序列数字0~9:30H~39H大写字母A~Z:41H~5AH小写字母a~z:61H~7AH163.计算机处理信息时,其对象都是二进制数。外设(显示器、打印机、键盘等)用ASCII码与CPU进行信息传送。例如:1)在键盘上按下某一字符键(如’9’),键盘接口向键盘缓冲区送去的是该字符的ASCII码(如39H),

不是送数字09H。

2)在文本方式下,要在显示器上显示某一字符(如’A’),

须将该字符的ASCII码(如41H)送显示缓冲区,不是送数字0AH。计算机要利用显示器、键盘等外设时,须据程序设计的需要进行有关转换。17例将CPU运算的结果通过显示器显示时,如二进制数“A9”

需将结果转换成其对应的ASCII码才能进行显示。18例

CPU要处理从键盘输入的某一数据,如键入“1234”

需将该数据串进行转换十六进制后才能应用。19例1

将BX寄存器中的内容以十六进制形式显示出来。

BX是一个16位寄存器二进制1010100100111110

用十六进显示时,每4位用一个字符显示,共4个其中0000→’0’30H,1010→’A’41H

0001→’1’31H

,1011→’B’42H

、、、、

1001→’9’39H

,1111→’F’46H?十六进制A93E屏幕上的显示‘A’‘9’‘3’‘E’对应的ASCII41H39H33H45H20算法:取出要显示的某4位,转换为对应的ASCII码,再调用DOS系统功能进行显示。1)对于0000~1001(0~9),先扩展成一个字节,高4位清0,加上30H后,即可得字符’0’~’9’对应的ASCII码。

00000001B+30H=31H00001001B+30H=39H

0001B‘1’1001B‘9’2)对于1010~1111(A~F),先扩展成一个字节,高4位清0,加上30H后,还要再加上07H,才能得到’A’~’F’对应的ASCII码

00001010B+30H+07H=41H00001111B+30H+07H=46H

1010B‘A’1111B‘F’21codeSEGMENTASSUMECS:codestart:MOVCH,4;字符个数

MOVCL,4;循环移位次数

next:ROLBX,CL

;取显示位的值

MOVDL,BL

;保存在DL中

ANDDL,0FH

;清除高4位

ADDDL,30H

;转变为数字的ASCII

CMPDL,39H;大于39H,则应转变

JLEprint;为字母A~F的ASCII

ADDDL,07H

print:MOVAH,2H;显示DL中的字符

INT21HDECCH;显示结束?

JNZnextMOVAH,4CH;返回DOSINT21HcodeENDS

ENDstart显示字符个数CH=4循环移位次数CL=4BX循环左移4位,将要显示的值移至低4位,保存在DL中清DL的高4位,只保留要显示位的值DL←DL+30H完成数值0~9的ASCII码转换YNDL←DL+07H完成数值A~F的ASCII码转换用02功能显示DL中的字符YN返回DOSDL超出39H?CH←CH-1转换结束?开始22思考:1.例1采用的是大写字母A~F进行显示,若采用小写字符a~f进行显示,程序如何改写?

1010001110011110‘A39E’或‘a39e’2.

编程将CPU内14个16位寄存器当前的内容分别用十六进制形式显示出来。23编程将CPU内14个16位寄存器当前的内容分别用十六进制形式显示出来。

要点:将上例改写为一个子程,入口参数为BX

子程中注意寄存器值的保存和恢复注意CS、IP、PSW寄存器值的获取方法24例将CPU内14个16位寄存器当前内容分别用16进制形式显示出来(采用DEBUG下R命令的显示顺序)codeSEGMENTASSUMECS:codestart:PUSHBXMOVBX,AX;显示AX

CALLlistbx

POPBX;显示BX

CALLlistbxMOVBX,CX;显示CX

CALLlistbxMOVBX,DX;显示DX

CALLlistbxMOVBX,SP;显示SP

CALLlistbxMOVBX,BP;显示BP

CALLlistbxMOVBX,SI;显示SI

CALLlistbxMOVBX,DI;显示DI

CALLlistbx

MOVBX,DS;显示DS

CALLlistbxMOVBX,ES;显示ES

CALLlistbxMOVBX,SS;显示SS

CALLlistbx

MOVBX,SEGstart

CALLlistbx

;显示CSMOVBX,OFFSETstart

CALLlistbx

;显示IP

PUSHF

POPBX;显示PSW

CALLlistbxMOVAH,4CH;返回DOSINT21H25listbxPROC

MOVCH,4MOVCL,4next:ROLBX,CLMOVDL,BLANDDL,0FHADDDL,30HCMPDL,39HJLEprintADDDL,07Hprint:MOVAH,2HINT21HDECCHJNZnext

MOVDL,20H;显示空格符

MOVAH,02HINT21HRET

;子程返回listbxENDPcodeENDSENDstart

listbxPROC

PUSHCX;保存寄存器

PUSHBXPUSHDXPUSHAXPUSHF

POPF

;恢复寄存器

POPAXPOPDXPOPBXPOPCXRET

;子程返回listbxENDPcodeENDSENDstart用十六进制显示BX内容子程

26

D:\>LIST_REG

;在DOS下执行程序0000000000FF0BDF00000912000000000BDF0BDF0BEF0BEF00003202D:\>DEBUG

LIST_REG.EXE

;利用DEBUG检测结果-R;显示当前寄存器内容AX=0000BX=0000CX=007BDX=0000SP=0000BP=0000SI=0000DI=0000DS=128EES=128ESS=129ECS=129EIP=0000NVUPEIPLNZNAPONC129E:000053PUSHBX-G;执行程序0000

0000

007B00000000000000000000128E128E129E129E00007202Programterminatednormally-运行的结果与用R命令显示的结果相同,程序运行结果正确27例2

将键盘输入的十进制数据串转换成相应大小的十六进 制数值存放在BX寄存器中。分析:

从键盘输入’1234’(表示1234)

用0AH功能输入,则缓冲区存放的内容为:06h04h31h32h33h34h0Dhnum问题:要转换成1234即04D2h存放在BX中,怎么实现?清ASCII码的高4位可得各数位大小值。01h02h03h04h04D2h?28算法一:数值大小=各位值×权值之和

1234D=千位×1000+百位×100+十位×10+个位

=1×1000+2×100+3×10+4=0000010011010010B=04D2H01h02h03h04h04D2h?29算法二:数值大小=部分和×10+下一位数值

1234D=(((0×10+1)×10+2)×10+3)×10+4=0000010011010010B=04D2H

部分和从0开始,循环次数等于输入的位数01h02h03h04h04D2h?30

dataSEGMENT

stringDB‘Input:’,’$’numDB6,?,6DUP(?)

dataENDS

CODESEGMENT

ASSUMECS:code,DS:datastart:MOVAX,dataMOVDS,AX

CALLinputCALLchangeCALLlist_bx

MOVAH,4CHINT21H

开始初始化DS的值CALLinput显示输入提示,等待从键盘输入十进制数据串CALLchange将数据串转化为相应的数值存放在BX中返回DOS主程序流程图CALLlist_bx将BX内容以16进制显示出来31input子程序流程图调用09功能显示输入提示调用0A功能等待从键盘输入数据RET返回inputPROC

LEADX,stringMOVAH,09HINT21HLEADX,numMOVAH,0AHINT21H

RETinputENDP0604313233340D00num000032change子程序流程图(BX)←输入字符的数值大小SI←数据串偏址CX←数据串长度AX←部分和初值0DI←乘数10YNRET返回AX←部分和乘10(AX)←(AX)+(BX)形成新的部分和修改SI指针,指向下一位输入BX←转换结果AXCX←CX-1CX=0?

changePROCLEASI,num+2MOVCL,num+1MOVCH,0

MOVAX,0MOVDI,10

next:

MULDIMOVBH,0MOVBL,[SI]ANDBL,0FH

ADDAX,BX

INCSI

LOOPnextzero:MOVBX,AX

RETchangeENDP

0604313233340D00num00001234D=((

(

0×10

+1

)

×10

+2)

×10

+3

)

×10

+433显示字符个数CH=4循环移位次数CL=4BX循环左移4位,将要显示的值移至低4位,保存在DL中清DL的高4位,只保留要显示位的值DL←DL+30H完成数值0~9的ASCII码转换YNDL←DL+07H完成数值A~F的ASCII码转换用02功能显示DL中的字符YNRET返回DL超出39H?CH←CH-1转换结束?list_bx子程序流程图

list_bxPROCMOVCH,4MOVCL,4next:ROLBX,CL

MOVDL,BL

ANDDL,0FH

ADDDL,30H

CMPDL,39H

JLEprint

ADDDL,07H

print:MOVAH,2HINT21HDECCHJNZnext

RET

;子程返回

list_bxENDPcodeENDS

ENDstart34例2程序存在的问题:1.未处理输入非数字字符的情况2.输入的十进制数范围为0~655353.当输入字符个数为0(直接回车)时,结果错误4.未处理负数情况5.结果的显示未换行

Input:1234最后看到的是:0D42t:1234

35编写子程序的注意事项:

注意子程中PUSH、POP应成对,否则易造成死机。dataSEGMENT

stringDB‘Hello’,’$’

dataENDS

温馨提示

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

评论

0/150

提交评论