河科大微机原理七课件_第1页
河科大微机原理七课件_第2页
河科大微机原理七课件_第3页
河科大微机原理七课件_第4页
河科大微机原理七课件_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

用指令助记符、标号、寄存器名、数字等符号构成的编写程序的语言叫汇编语言。汇编语言是机器语言的表示,它比机器语言好读,比高级语言占用的内存少、执行速度快。因此汇编语言总是程序设计的重要手段。

第七章汇编语言程序设计1§7.1概述用汇编语言编写的程序叫汇编语言程序,简称源程序。机器语言程序称目标程序。将源程序翻译成目标程序的过程叫做汇编。2上机环境硬件系统软件

应用软件

操作系统:DOS系统编辑器:EDIT.exe汇编程序:MASM.exe连接程序:LINK.exe调试程序:DEBUG.exe用户开发的程序:ABC.exe等CPU、存储器(ROM、RAM)、I/O接口、输入、输出设备3编辑源程序EDITABC.ASM汇编源程序MASMABC.ASM形成目标程序ABC.OBJ连接目标程序LINKABC.OBJ形成可执行程序ABC.EXE运行程序用DEBUG调试5伪指令是汇编语言程序中的指示性语句,它体现程序员的汇编意图,其作用是在源程序汇编时指导汇编程序汇编,而本身不会产生目标代码和占用内存。伪指令的具体功能是向汇编程序提供下列信息:如何分段、段的定义和说明,段间关系,模块的定义和说明以及模块间的关系,数据的定义,开始汇编和结束汇编等。§7.2伪指令(指示性语句)6指令性语句是用指令系统中的指令构成的语句。例

MOVAX,BX指示性语句是指示汇编程序进行汇编的操作。例MOVAX,4+8中的+

codeSEGMENT

中的SEGMENTMOVBX,OFFSETstring中的OFFSET指示性语句与指令性语句:7

1、等值语句:

格式

符号名EQU表达式作用是用符号名等值指定的表达式。其中表达式可以是任何有效的操作数,汇编时用语句中的表达式代替程序中符号所在的地方。应用:1.定义符号常量,方便修改程序。2.某表达式多次出现时,用等值伪指令可以方便编程。一、符号定义伪指令9例如:EMPEQU8COUNTEQUEMP+6

2、等号语句:格式

符号名=表达式作用是用符号名等值指定的表达式,用“=”定义的符号名可重新定义。

例如:NMU=6NMU=NMU+610

格式

变量名助记符操作数[,操作数,...]

用来定义程序中所用的内存操作数。其中变量名指示内存操作数的地址(符号地址);助记符指示内存操作数的类型(字节、字、双字等);

操作数指示内存操作数的内容。二、数据定义伪指令11例:DATA-BYTEDB10,4,10HDATA-WORDDW100,100H,—5HDATA-DWDD6+20,0FFFDH数据定义伪指令中的表达式也可以是字符串如: MESS DB

‘ABCD’数据定义伪指令的表达式中会出现“?”数据项,ABCDB ?,?,DEFDW ?,50,?这时汇编程序会对“?”数据项保留相应的存储空间,而不存入数据。130AH04H10HDATA-BYTE64H00HDATA-WORD00H01HFBHFFH1AH00H00H00HDATA-DW100100H-52614MESS41H42H43H44HABCDEF32H注意:3个及其以上的字符,只能用DB定义15格式

段名SEGMENT[定位类型][组合类型][类别]、、、、、、段名ENDS

段定义由伪操作SEGMENT开始、ENDS结束。其中:SEGMENT和ENDS必须成对出现,且语句前必须有段名,段名必须相同。

SEGMENT和ENDS语句之间可以有指令和其他伪操作,

表示存放在该段内存的变量、指令或其他伪操作对该段内存的处理程序中可以定义多个段。程序经汇编、连接及装入内存后,段名为一具体的段值。三、段定义伪操作17AASEGMENT;数据段1

str1DB'Hello!’AAENDSBBSEGMENT;数据段2

str2DB6dup(?)BBENDSCCSEGMENT;代码段

ASSUMECS:CCASSUMEDS:AA,ES:BB

start:CLDMOVAX,AA

MOVDS,AXLEASI,str1

MOVAX,BB

MOVES,AXLEADI,str2MOVCX,6REPMOVSBMOVAH,4CHINT21HCCENDSENDstart数据传送源程序:18定位类型、组合类型和类别说明段的属性,它们用方括号括起来表示可以缺省。若不缺省,各项排序不能错,项与项要用空格分开。

定位类型有四种:

PAGE(页)型要求该段物理地址低8位全为0PARA(节)型要求该段物理地址低4位全为0WORD型要求该段物理地址码为偶数(最低位为0)

BYTE型该段的物理地址可为任意值。

组合类型说明本段与其它段的关系。

‘类别’它可以是任何合法的名称。19

ASSUME伪操作的作用指示汇编程序指令中用到的标号、过程及变量所在的段。其中对标号、过程必须用CS段寄存器指示,对变量可用CS、DS、ES、SS段寄存器指示。

若未用ASSUME语句指示指令中用到的标号、过程和变量所在的段,汇编程序将给出错误信息。

ASSUME语句只起指示作用,并无实际的操作。在程序中引用定义的变量做内存操作数时,需按寻址方式用传送指令(如MOV)给相应的段寄存器赋值。21例用程序实现1234H+5678HdataSEGMENTvalueDW1234H,5678HresultDW?

dataENDS

codeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;给DS赋值MOVDS,AXMOVAX,value;取数ADDAX,value+2;两数相加MOVresult,AX;保存结果MOVAH,4CH;返回DOSINT21H

codeENDSENDstart12H34H78H56Hvalueresult22

格式

过程名PROC类型、、、过程名ENDP

过程定义由伪操作PROC开始、ENDP结束。其中:PROC和ENDP必须成对出现,

且语句前必须有过程名,过程名必须相同。

PROC和ENDP语句之间为子程序的指令序列。程序中可以定义多个过程。五、过程定义伪操作23例1displayPROC、、、、、、RET;NEAR属性的过程对应段内返回displayENDP例2displayPROCFAR、、、、、、RET;FAR属性的过程对应段间返回displayENDP251、NAME和TITLE伪操作

格式:

NAME

模块名

格式:

TITLE

模块名在源程序开始可用NAME或TITLE为模块命名,模块名的作用是指示给连接程序进行连接用。源程序中可无模块定义,此时源文件名作为模块名。六、模块定义和程序结束伪操作26格式:

END启动地址作用是指示源程序到此结束。汇编程序对END之后的语句不进行处理。程序中所有有效语句应放在END语句之前。源程序中必须有END结束语句。汇编程序对无END语句的源程序不进行处理,

只给出无END语句错误信息。2、END伪操作27包括:TYPE,LENGTH,SIZE,SEG,OFFSET。把一些特征或存贮器地址的一部分作为数值回送。八、数值回送操作符:29·TYPE格式:TYPEvariable回送该变量的以字节数表示的类型。(DB为1,DW为2,DD为4,DQ为8,DT为10)或label标号,回送标号类型数值(NEAR为-1,FAR为-2)例:ARRAYDW1,2,3ADDSI,TYPEARRAY汇编程序其形式:ADDSI,230格式:

LENGTHvariable对于变量中使用DUP汇编回送分配给变量项数,其他情况回送1。例:FESSDW100DUP(0) 对于MOVCX,LENGTH

FESS 汇编程序将其形式:MOVCX,100 其他情况,回送1。·LENGTH31例:ARRAYDW1,2,3 对于指令MOVCX,LENGTHARRAY 汇编程序将使其形式为:MOVCX,1例:TABLEDB‘ABCD’ 对于指令MOVCX,LENGTHTABLE汇编程序使其形式为:MOVCX,1LENGTH(续)32格式:SIZEvariable 回送分配给该变量的字节数LENGTH*TYPE例:FEESDW100DUP(0) MOVCX,SIZEARRAY 将形成:MOVCX,200·SIZE33例:TABLEDB‘ABCD’ MOVCX,SIZETABLE 将形成MOVCX,1例:ARRAYDW1,2,3 MOVCX,SIZEARRAY 形式MOVCX,2 LENGTH*TYPE=2SIZE(续)34

TYPE变量的返回值是类型的字节数:DB为1,DW为2,DD为4,DQ为8,DT为10

TYPE标号的返回值是:

NEAR为-1,FAR为-2。

LENGTH变量返回DUP分配的项数,对于其他情况则返回1。

SIZE返回值是:

LENGTH和TYPE值的乘积,即变量的字节数。小结:35

SEG取符号地址的段地址例MOVAX,SEG

yy

OFFSET取符号地址的偏移地址例MOVBX,OFFSET

yy

SEG(OFFSET)36SEG、OFFSET只能对符号地址操作MOVAX,SEG[BX]MOVBX,OFFSET[SI]

注意:37一、概述(一)判断程序质量的标准简明、易读、易维护。速度快、执行时间短。占用内存空间小。§7.4汇编语言程序设计381.编写程序主体。分析问题,建立模型,确定算法。按算法画出程序流程图。按流程图编写程序。(二)编写汇编语言程序步骤392.分配内存空间,编写汇编程序。分配内存空间,规划必要的区段。编写完整的汇编语言程序。(二)编写汇编语言程序步骤3.调试、优化。检查源程序,优化结构。上机运行,调试。40

顺序结构分支结构循环结构子程序结构(三)几种程序结构41顺序结构42两个分支YN

、、、CMPAL,BLJGgreat

JMPexitgreat:

exit:、、、、、、

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

、、、CMPAL,0

JGgreat

JLless

JMPexitless:

JMPexitgreat:

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

CALLsub、、

CALLsub、、

CALLsub、、MOVAH,4CHINT21HsubPROC、、、、RETsubENDPcodeENDSENDstart子程序结构46例:试设计一个对两个32位二进制数相加的程序。设被加数2A3B078EH和加数4C508F55H从数据段的BGS单元(令BGS=2000H)开始依次存放,要求将两数和放在加数之后。分析:这是一个简单的加法问题,因为数据不长,可采用顺序程序设计方法。因为是两个32位数相加,应先加低16位,再加高16位,加高16位时还要考虑低16位相加产生的进位,应选用带进位加法指令。还要注意,多字节数在内存是放在连续的存储单元中,且高字节放高地址单元,低字节放低地址单元。二、汇编语言程序设计举例47内存单元分配如下:BGS=2000H8EH07H3BH2AH55H8FH50H4CH…被加数加数和48DATASEGMENTORG2000HBGSDD2A3B078EH,4C5D8F55HDD?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAORG1000HSTART:MOVAX,DATAMOVDS,AXMOVBX,BGS49MOVAX,[BX]MOVBX,BGS+4ADDAX,[BX]MOVBX,BGS+8MOV[BX],AXMOVBX,BGS+2MOVAX,[BX]MOVBX,BGS+6ADCAX,[BX]MOVBX,BGS+10MOV[BX],AX低4位高4位50MOVAH,4CHINT21HCODEENDSENDSTART返回DOS同一问题,若数据很长,或采用字节加法,则重复很多次,可考虑采用循环程序设计方法:DATASEGMENTORG2000HBGSDB8EH,07H,3BH,2AHDB55H,8FH,5DH,4CHDB4DUP(?)DATAENDS51CODESEGMENTASSUMECS:CODE,DS:DATAORG1000HSTART:MOVAX,DATAMOVDS,AXMOVCX,4CLCMOVSI,BGSLOOP1:MOVAX,[SI]ADCAX,[SI+4]MOV[SI+8],AX一次加法52INCSILOOPLOOP1MOVAH,4CHINT21HCODEENDSENDSTART53例:已知从内存10000H单元开始连续存放着大小不同的两个16位二进制无符号数X1和X2。试设计一个程序,将其中的大数放到10050H单元,小数放到10052H单元。

解:显然,这是一个双分支程序。根据比较结果(CF标志)用条件转移指令实现分支。

X1LX1HX2LX2H10000H10050H大数小数54DATA SEGMENTORG 0000HMADDWX1,X2ORG0050HMAX DW 2 DUP (?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOVDS, AX MOV AX,[0000H] 55MOV BX,[0002H]CMP AX, BX JNC LOP1 MOV [MAX] ,BX MOV [MAX+2], AXLOPT:MOVAH,4CH

INT21HLOP1:MOV [MAX], AX MOV [MAX+2], BX JMP LOPTCODEENDSENDSTART56例将寄存器BX中的内容以十六进制形式显示出来。 (二进制十六进制)有关字符、数码转换的处理1.

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

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

计算机要利用显示器、键盘等外设时,须据程序设计的需要进行有关转换。58例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’对应的ASCII41H39H33H45H59算法:取出要显示的某4位,转换为对应的ASCII码,再调用DOS系统功能进行显示。1)对于0000~1001(0~9),先扩展成一个字节,高4位清0,加上30H后,即可得字符’0’~’9’对应的ASCII码。00000001B+30H=31H;00001001B+30H=39H

0001B‘1’1001B‘9’2)对于1010~1111(A~F),先扩展成一个字节,高4位清0,加上30H后,还要再加上07H,才能得到’A’~’F’对应的ASCII码00001010B+30H+07H=41H1010B‘A’00001111B+30H+07H=46H1111B‘F’60CODESEGMENTASSUMECS: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

61print:MOVAH,02H;显示DL中的字符INT21HDECCH;显示结束?JNZnextMOVAH,4CH;返回DOSINT21HCODEENDS

ENDstart62编程将CPU内SP、BP、SI、DI4个16位寄存器当前的内容分别用十六进制形式显示出来。

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

子程中注意寄存器值的保存和恢复注意CS、IP、PSW寄存器值的获取方法63CODESEGMENTASSUMECS:CODEstart:MOVBX,SP;显示SP

CALLLISTBXMOVBX,BP;显示BP

CALLLISTBXMOVBX,SI;显示SI

CALLLISTBX

MOVBX,DI;显示DI

CALLLISTBX

MOVAH,4CH;返回DOSINT21H64LISTBXPROCPUSHF

;保存寄存器

MOVCH,4MOVCL,4next:ROLBX,CLMOVDL,BLANDDL,0FHADDDL,30HCMPDL,39HJLEprintADDDL,07Hprint:MOVAH,02H;输出字符INT21HDECCHJNZnextMOVDL,20H;显示空格符MOVAH,02HINT21HRET

;子程返回LISTBXENDPCODEENDENDstart65子程与主程的参数传送:用寄存器传送用定义的变量传送3)利用地址表传送4)

用堆栈传送66

一、概述:

例:编写完整汇编语言程序,要求:清屏,显示“HelloChina!”方法:将0AH功能输入的字符串,用09H功能显示出来。结果如下:dataSEGMENTmaxDB12,?,4DUP(?)stringDB‘HelloWorld!’,’$’dataENDS§7.7DOS功能调用67

codeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,maxMOVAH,0AH;调用0AH输入功能INT21HLEADX,stringMOVAH,09H;调用09H显示功能INT21HMOVAH,4CHINT21H;返回DOScodeENDSENDstart68

PC—DOS是IBMPC微型计算机的磁盘操作系统。它为用户提供了许多命令,也有80多个子程序可供用户调用。这些子程序的功能主要是实现对存储器和基本I/O设备的管理等。为了便于调用将所有子程序顺序编号,如PCDOS2.0有87个子程序,编号从0开始到57H。

用户编程原则:尽可能使用DOS的系统功能调用,提高程序可移植性。②在DOS功能不能实现情况下,考虑用BIOS功能调用。③在DOS和BIOS的中断子程不能解决问题时,使用

IN/OUT指令直接控制硬件。691.调用方法DOS系统功能调用是一种内部中断方式,它是通过INT21H指令进入功能调用,再通过功能号进入具体子程序。

需要三个语句:①将入口参数送指定寄存器②将功能号(0~57H)送AH寄存器③使用内部中断指令:INT21H70设置入口参数在AH设置功能号m执行中断指令INTN分析、应用出口参数1.调用方法71使用DOS功能调用还要注意下列问题:(1)从键盘输入的字符由系统自动转换为ASCII码,在进行数据处理时要特别注意;(2)需要在屏幕上显示的字符要在程序中将其转换为ASCII码。

2、DOS功能调用要注意的问题721.显示单字符(02H功能)入口参数DL=要显示字符的ASCII码功能号

AH=02H类型号

INT21H出口参数无实现功能显示指定字符,光标随动。例

显示字符AMOVDL,‘A’MOVAH,02HINT21H二、DOS系统功能调用(21H类型中断调用)73入口参数①定义要显示的字符串,字符串尾应为’$’,作为结束显示的标志。②DS:DX=字符串的首地址功能号

AH=09H类型号

21H出口参数无实现功能显示字符串,遇’$’停止显示,光标随动。2.显示字符串(09H功能)74例编程显示字符串’TsinghuaUniversity’dataSEGMENT

;定义显示的子符串striDB‘TsinghuaUniversity’,‘$’dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data

;置缓冲区地址于DS:DXMOVDS,AXLEADX,stri

MOVAH,09H;调显示功能

INT21HMOVAH,4CH;返回DOS

INT21HcodeENDS

ENDstart75①入口参数无

功能号

AH=01H

类型号

21H

出口参数AL=键入字符的ASCII码

实现功能

等待从键盘输入一个字并在屏幕上回显,光标移动,检测

Ctrl-Break键3.单字符输入(01H、07H功能)76例利用键盘输入的字符产生分支:MOVAH,1INT21H;等待从键盘输入

CMPAL,‘Y’

;是’Y’?

JZyesno:......JMPexityes:......exit:...77②

温馨提示

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

评论

0/150

提交评论