最新微机原理第三章魏PPT课件.ppt

上传人:豆**** 文档编号:57181769 上传时间:2022-11-04 格式:PPT 页数:136 大小:973.50KB
返回 下载 相关 举报
最新微机原理第三章魏PPT课件.ppt_第1页
第1页 / 共136页
最新微机原理第三章魏PPT课件.ppt_第2页
第2页 / 共136页
点击查看更多>>
资源描述

《最新微机原理第三章魏PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新微机原理第三章魏PPT课件.ppt(136页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、微机原理第三章魏微机原理第三章魏微 机 原 理概述汇编语言:汇编语言是一种面向计算机的符号语言。用指令的助记符、符号地址、标号、伪指令等书写程序的语言。汇编语言源程序:用汇编语言书写的源程序。汇编:将汇编语言源程序翻译成机器语言程序的过程。汇编程序:完成汇编过程的系统程序。ASM和MASM 微 机 原 理微 机 原 理微 机 原 理微 机 原 理微 机 原 理微 机 原 理微 机 原 理3.1.2汇编语言的运算符汇编语言运算符所指定的操作由汇编程序在汇编过程中完成,结果作为指令的目标代码被保存,与程序执行时CPU完成的可执行指令是两回事,故汇编语言运算符也称为伪操作符。汇编语言的运算符有:算术

2、运算符:+、MOD(取余数);逻辑运算符:AND、OR、NOT、XOR;关系运算符:EQ、NE、LT、GT、LE、GE;取值运算符和属性运算符。微 机 原 理1算术运算符和逻辑运算符(1)算术运算符:+、MOD算术运算符只能用于数字量操作数,结果也是数字量。用于存储器操作数时,只有、运算符有意义。MOD取模是求数字量除法所得的余数。(2)逻辑运算符:AND、OR、NOT、XOR逻辑运算符的操作只能是数字的,且结果也是数字的。存储器操作数不能进行逻辑运算。逻辑运算作为运算符时,是在程序汇编时计算的;而作为指令助记符时,则是在程序执行时计算的。微 机 原 理2关系运算符 关系运算符:EQ、NE、L

3、T、GT、LE、GE;相等EQ(Equal)、不等NE(NotEqual)、小于LT(LessThan)、大于GT(GreaterThan)、小于等于LE(LessThanorEqual)、大于等于GE(GreaterThanorEqual)关系运算符连接的两个操作数,必须都是数字的或是在同一段内的存储器地址。若关系为假(关系不成立),则结果为0H;若关系为真(关系成立),则结果为0FFFFH。微 机 原 理例如:MOVBX,(PORTLT5)AND20)OR(PORTGE5)AND30)当PORT的值小于5时,上述指令汇编为:MOVBX,20否则为MOVBX,30微 机 原 理3取值运算符(

4、分析运算符)把存储器地址操作数分解成它的组成部分。取值运算符有:SEG、OFFSET、TYPE、SIZE和LENGTHSEG给出一个变量或标号的段地址;OFFSET给出一个变量或标号的16位偏移量;TYPE返回表示存储器操作数内存变量和标号类型的数值。类型byteword dword qword tbyteNEARFAR类型值124810-1(FFH)-2(FEH)微 机 原 理SIZE取得并返回由DUP定义的内存变量的字节数。LENGTH取得并返回由DUP定义的内存变量基本单元的个数。格式:SEG符号名OFFSET符号名TYPE符号名SIZE符号名LENGTH符号名例如:MOVAX,SEGS

5、LOT;将SLOT的段地址送入AX寄存器MOVAX,OFFSETSLOT;将SLOT的偏移地址送入AX寄存器,微 机 原 理4属性运算符(合成运算符)属性运算符用来给指令中的操作数指定一个临时属性,而暂时忽略当前的属性。(1)合成运算符PTR忽略当前操作数的类型(字节或字)及属性(NEAR或FAR),而给出一个临时的类型或属性。一般格式如下:类型(或属性)PTR操作数表达式PTR运算符建立一个存储器地址操作数,它与PTR右边的存储器地址操作数有相同的段地址与偏移量,其类型由左边的操作数决定。微 机 原 理例如:SLOTDW25MOVAL,BYTEPTRSLOTSLOT已定义成字单元。若想取出它

6、的第一个字节内容,则可用PTR使它暂时改变为字节单元。MOVBX,5;汇编程序不知道传送的是字节还是字MOVBYTEPTRBX,5;若是一个字节MOVWORDPTRBX,5;若是字改变属性的例子如下:JMPFARPTRSTEP即使标号STEP原先是NEAR型的,使用FARPTR后,这个转移就变成段间转移了。微 机 原 理(2)合成运算符 THIS 象PTR一样可用来建立一个特殊类型的存储器地址操作数,新的存储器地址操作数的段和偏移量部分就是下一个能分配的存储单元的段和偏移量,即汇编程序进行汇编遇到THIS时的当前值。其类型在THIS运算符后面指定。例如:MY_BYTEEQUTHISBYTEMY

7、_WORDDW?将建立MY_BYTE具有字节类型,且与MY_WORD具有相同的段和偏移量。微 机 原 理(3)段取代运算符 用于在一条指令中以新的段属性取代旧的段属性。有两种格式:段寄存器:地址表达式例如:ADDAX,ES:ALT 段名:地址表达式所用的段名事前必须通过ASSUME伪指令与一个段寄存器建立联系。例如:ASSUMEES:EXTRA_DATAADD AX,EXTRA_DATA:ALT微 机 原 理(4)短程运算符SHORT 仅用于无条件转移指令。指出转移的标号不仅是NEAR型的,并且是在下一条指令的128127个字节范围内。运算符SHORT事先对标号作了说明,则会汇编成两字节的转移

8、指令,既节省了单元又加快了执行速度。例如:JMPSHORTH2;H2:MOVAX,0微 机 原 理3.1.3表达式 表达式是由运算符和操作数组成的序列。在汇编时,它产生一个确定的值。仅表示一个常量,相应的表达式称为常量表达式;也可以表示一个存储单元的偏移地址,相应的表达式称为地址表达式。操作数通常有下列几种类型微 机 原 理1常数 汇编语言语句中出现的常数有7种:二进制数二进制数字后跟字母B,如01000001B。八进制数八进制数字后跟字母Q或O,如202Q或202O。十进制数十进制数字后跟D或不注,如85D或85。十六进制数十六进制数字后跟H,如56H,0FFH。注意,当数字的第一个字符是A

9、F时,在字符前应添加一个数字0,以示和变量的区别。微 机 原 理 十进制浮点数浮点十进制数如25E-2。十六进制实数十六进制实数后跟R,数字的位数必须是8,16或20。在第一位是0的情况下,数字的位数可以是9,17或21。如0FFFFFFFFR。以上第、两种数字格式只允许在MASM中使用。字符和字符串字符和字符串要求用单引号括起来,如BD。微 机 原 理2常量操作数常量操作数是一个数值操作数,一般是常量或者是常量的标识符。例如常量操作数有100,PORT,VAL等。数字常量操作数可采用二、八、十或十六进制等形式。操作数值的允许范围为6553665535。字符串常量操作数值为相应字符的ASCII

10、码。常量操作数是出现在程序中的确定值,它在程序的运行期间不会发生变化。微 机 原 理3存储器操作数存储器操作数是一个地址操作数,代表一个存储单元的地址。可以分为变量及标号两者类型:变量是存放该变量的存储单元的符号地址存储器操作数所代表的是某个数据在数据段、附加段或堆栈段中的地址,称变量。变量所对应的存储单元内容在程序的运行过程中是可以改变的。标号则是指令代码的符号地址存储器操作数所代表的是某条指令代码在码段中的地址,在程序运行过程中不能改变,标号通常作为转移指令或调用指令的目标操作数。微 机 原 理存储器操作数作为存储单元的地址,有三个属性:(1)段地址:存储单元所在段的段地址;(2)偏移地址

11、:存储单元在所在段内的偏移地址;(3)类型:变量的类型是存储单元所存放数据项的字节数;标号的类型作为转移或调用指令的目标操作数的寻址方式,即NEAR和FAR。标号的默认类型属性为NEAR。微 机 原 理4常量表达式常量表达式通常由常量操作数及运算符构成,在汇编时,产生一个常量。例如:PORT_VAL+1PORT_VALAND20H分析运算符作用于存储器操作数所形成的表达式也是常量表达式。例如:OFFSETSUMSEGSUMTYPECYCLE微 机 原 理5地址表达式地址表达式通常由存储器操作数与运算符构成。地址操作数构成地址表达式时,必须有明确的物理意义。所以对存储器操作数的运算可以是加或减一

12、个常量。例SUM2、CYCLE5表达式SUM2、CYCLE5的值仍然是一个存储器操作数,其段地址与类型分别与存储器操作数SUM及CYCLE相同,但偏移地址分别比SUM大2及CYCLE小5。表达式是在汇编时计算的,而变量单元的内容在程序的运行过程中可以改变。微 机 原 理3.1.4汇编语言程序汇编步骤用汇编语言编写源程序 经过汇编生成目标程序 经过链接生成执行程序汇编目标程序汇编程序MASM.EXE汇编语言源程序执行程序链接编辑程序EDIT.EXE链接程序LINK.EXE文件名.ASM文件名.OBJ文件名.EXE微 机 原 理1编写源程序用文本编辑程序EDIT.EXE或EDLIN编写汇编语言源程

13、序,产生扩展名为.ASM的源文件。2汇编用汇编语言编写的源程序经过汇编程序MASM.EXE自动翻译成目标程序,产生扩展名为.OBJ的目标文件;对源程序中使用了非法指令,标号重复,相对转移超出转移范围等非逻辑性错误给出提示。8086的汇编程序为ASM-86,扩展后的宏汇编程序为MASM-86,增加了宏处理功能、条件汇编及某些伪指令,且可支持8087协处理器的操作。微 机 原 理汇编程序的主要功能是:1、将汇编语言源程序翻译成机器语言代码;2、按程序指定,分配存储区域(包括程序区,数据区,堆栈区等);3、将各种进位制数据转换成二进制数;4、把字符转换成ASCII码;5、计算出数值表达式的值;6、对

14、源程序进行检查,给出程序的语法错误信息,如非法格式,未定义的助记符、标号、漏掉操作数等。微 机 原 理3链接用链接程序LINK.EXE将一个或多个.OBJ目标程序进行链接,生成扩展名为.EXE的可执行程序。4调试经过上述步骤所获得的.EXE可执行文件,在运行过程中可能出现逻辑错误,需对可执行文件.EXE进行调试。调试汇编程序最常用的工具是动态调试程序DEBUG。其中从某地址运行程序、设置断点、单步跟踪等功能,可以支持对程序的调试。微 机 原 理3.2伪指令 伪指令语句也称为指示性语句,是用来对程序的汇编过程进行控制,实现初始化存储器、定义符号常数、列表、存储空间分配等处理。根据功能的不同,伪指

15、令可分为以下几种类型:数据定义伪指令 符号定义伪指令 段定义伪指令 过程定义伪指令 宏定义 模块组织和多模块连接微 机 原 理3.2.1 数据定义伪指令 该类伪指令用来定义存储空间及其所存数据长度。DB:定义字节,即每个数据是1个字节;DW:定义字,即每个数据占1个字(2个字节);DD:定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高地址;DQ:定义4字长,即每个数据占4个字;DT:定义10个字节长,用于压缩式十进制数。微 机 原 理例:DATA1DB5,6,8,100,ABCD表示从DATA1单元开始,连续存放5,6,8,100,共占4个字节地址。DATA2DW7,287表示从D

16、ATA2单元开始,连续存放7,287两个字,共占4个字节地址。定义一个存储区时,也可以不放数据,如TABLEDB?;表示在TABLE单元中存放的内容是随机的。微 机 原 理05H06H08H64H41H42H43H44H07H00H1FH01H42H41H44H43HDATA1DATA2DATA1DB5,6,8,100,ABCDDATA2DW7,287,AB,CDDATA3DDABCD,CD44H43H42H41H44H43H00H00HDATA3微 机 原 理当定义一个存储区内的每个单元要放置同样的数据时,可用DUP操作符,一般格式为:COUNTDUP(?);COUNT为重复的次数,?为要重

17、复的数据。如:BUFFERDB100DUP(0);表示以BUFFER为首地址的100个字节中存放00HBUFFER1DB100DUP(3,5,2DUP(10),35),24,NUM表示以BUFFER1为首地址的区域存放(3,5,10,10,35)100次,和24,NUM微 机 原 理3.2.2 符号定义伪指令 等值伪指令EQU给左边符号定义一个值。该值可以是任何有效的操作数表达式,如一个常数、另一个符号名或地址表达式,甚至一个指令助记符。在程序中,凡是出现该符号的地方,汇编时均用该值代替。如:TIMESEQU50;TIMES=50DATADBTIMESDUP(?)FIRSTEQUSECOND+

18、1;FIRST=SECOND+1ADD1EQUADD;为ADD指定一个别名ADD1微 机 原 理解除伪指令PURGE用于释放由EQU伪指令定义的符号变量,这样这些变量就可以被重新定义。EQU伪指令定义的符号在PURGE伪指令解除前,不能重新定义。例:PURGE符号名1,符号名2,符号名N等号赋值伪指令“=”功能与EQU相似,能对已定义的符号名重新定义而无须先释放。TIMES=50;FIRST=SECOND+1;ADD1=ADD;微 机 原 理3.2.3段定义伪指令 一个完整的汇编源程序由代码段、堆栈段、数据段,有时还有附加段所组成。段定义伪指令可将源程序划分成若干段,以便汇编和连接时将各同名段

19、进行组合。段定义伪指令一般格式为:段名SEGMENT定位类型组合类型类别 ;段体内容,由指令及伪指令组成。段名ENDSSEGMENT和ENDS应成对使用,缺不可。微 机 原 理段名:段名是不可省略的,是给定义的 段所起的名称。例如:STACKSEGMENTSTACKDW20DUP(?)STACKENDS 定位类型:表示该段起始地址位于何处。字节型(BYTE),段起始地址可位于任何地方;字型(WORD),段起始地址必须位于偶地址;节型(PARA),即段起始地址必须能被16除尽;页型(PAGE),即段起始地址可被256除尽;缺省时,段起始地址便定位为PARA型的。微 机 原 理 组合类型:组合类型

20、用于告诉连接程序,该段和其它段的组合关系。连接程序可以将不同模块的同名段进行组合。组合类型有:NONE表明本段与其它段逻辑上不发生关系,省略时,便指定为这一组合类型。PUBLIC与其它模块中用PUBLIC说明的同名段按先后连接成一个逻辑段,使用同一个物理段地址。STACK将具有STACK类型的同名段连接成一个大的堆栈,由各模块共享。微 机 原 理COMMON与其它模块中由COMMON说明的所有同名段连接时,被重叠放在一起,其长度是同名段中最长者的长度。MEMORY由MEMORY说明的段。在连接时,它被放在所装载程序的最后存储区(最高地址)。若几个段都有MEMORY组合类型,则连接程序只认定首先

21、遇到的段具有MEMORY组合类型,其它段则认为是COMMON类型,并被叠放在一起。AT表达式段地址是表达式所给定的值。在程序中就可由用户直接来定义段地址。但这种方式不适用于代码段。微 机 原 理类别:是用单引号括起来的字符串,以表明该段的类别。如代码段(CODE)、数据段(DATA),堆栈段(STACK)等。各模块中同一类型的段可能具有不同的名字,连接时将同类别的段(但不一定同名)放在连续的存储区内。上述的组合类型便于多个模块的连接。若程序仅有一个模块,即只包括代码段、数据段和堆栈段时,为了和其它段有区别,除了堆栈段用STACK说明外,其它段的组合类型、类别均可省略。微 机 原 理例如有两个模

22、块:模块1STACKSEGMENTSTACKDW300DUP(?)STACKENDSDATASEGMENTCOMMONDATAENDSCODESEGMENT PUBLICCODEENDS模块2STACKSEGMENTSTACKDW30DUP(?)STACKENDSDATASEGMENTCOMMONDATAENDSCODESEGMENTPUBLICCODEENDSEND微 机 原 理3.2.4 设定段寄存器伪指令ASSUME段寄存器定义伪指令。用于建立段名和段寄存器之间的严格对应关系。可通知汇编程序哪一个段寄存器是当前段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。其格式为:ASS

23、UME段寄存器:段名,段寄存器:段名,ASSUME伪指令只是指明某一个段地址与段寄存器的联系,没有将段地址送入该寄存器的操作。因此要将段地址装入段寄存器还需用汇编指令来实现。微 机 原 理例如:CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,DATA;DATA段值送AXMOVDS,AX;AX内容送DS,本指令执行完之后,DS才为实际段值CODEENDS由于DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始化为正确的堆栈段地址,在程序中就不必设置。但DS数据段或ES附加段必须MOV指令对DS和ES进行初始化,以装入段地址。微 机 原 理3.

24、2.5ORG伪指令ORG:伪指令用于指定段内程序或数据代码存放的起始偏移地址,即用语句中表达式的值作为起始偏移地址,此后的程序或数据代码将连续存放,除非遇到另一个新的ORG语句。一般格式为:ORG例如:DATASEGMENTBUFF1DB23,56H,EOFORG2000HBUFF2DBSTRINGDATAENDS微 机 原 理3.2.6 定义过程的伪指令具有一定功能的程序段作为一个过程(相当于一个子程序)。可以被别的程序调用(用CALL指令)或由JMP指令转移到此执行;也可以由程序顺序执行;或作为中断处理程序,在中断响应后转此执行。一个过程由伪指令PROC和ENDP来定义。其格式为:过程名P

25、ROC类型(FAR/NEAR,缺省为NEAR)RET过程名ENDP过程体内至少应有一条RET指令。过程可以嵌套,也可以递归使用,即过程可以调用过程或本身。过程体微 机 原 理例如:延时100ms的过程,可定义如下:DELAYPROCPUSHBXPUSHCXMOVBL,10AGAIN:MOVCX,2801;延时10msWAI:LOOPWAIDECBLJNZAGAINPOPCXPOPBXRETDELAYENDP微 机 原 理CODE1SEGMENTASSUMECS:CODE1FARPROCPROCFARRETFARPROCENDPCODE1ENDSCODE2SEGMENTASSUMECS:CODE

26、2CALLFARPROC.CALLNEARNEARPROCNEARRETNEARENDPCODE2ENDS微 机 原 理3.2.7宏指令 若程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。宏指令的一般格式为:宏指令名MACRO形式参量表宏体ENDM宏指令与子程序都是可完成某种功能的,供调用的程序模块。定义后可多次调用。但子程序只形成一段目的代码,调用时转来执行。而宏指令是将形成的目的代码插到主程序调用的地方。微 机 原 理例如:GADDMACROX,Y,ADD1MOVAX,XADDAX,YMOVADD1,AXENDM其中

27、X,Y,ADD1都是形式参量。调用时,用下面宏指令书写格式:GADDDATA1,DATA2,SUM这里DATA1,DATA2,SUM是实参量。实际上与该宏指令对应的源程序为:MOVAX,DATA1ADDAX,DATA2MOVSUM,AX微 机 原 理3.2.8汇编结束伪指令END伪指令表示源程序的结束。每个源程序模块必须且只能用一条END伪指令指明结束位置,汇编程序遇到END时立刻停止汇编。其一般格式为:END表达式其中表达式是可选项,表示该汇编程序模块的启动地址。例如:ENDSTART则表明该程序的启动地址为START。微 机 原 理3.3汇编语言程序设计程序设计是应用计算机解决实际问题的重

28、要环节。一个优秀的程序设计的标准为:程序结构清晰合理,易于理解和维护;程序执行时间短;源程序的语句行少;程序存储的字节数少;这些要求可通过选择算法和优化程序结构来实现。微 机 原 理3.3.1汇编语言程序设计概述一、汇编语言程序的基本结构框架汇编语言源程序由可执行的指令语句和指示性的伪指令组成。在汇编语言源程序至少包括三段:代码段、数据段、堆栈段,必要时还有附加段。微 机 原 理二、汇编语言程序设计的基本步骤1.分析实际问题,建立解决问题的模型;2.确定解决问题的算法、方法和步骤;3.根据算法画出程序流程图,即将解决问题的思路用图形表示。4.对程序中的数据的组织、存储单元分配、寄存器使用规划等

29、进行统一考虑和安排。5.根据程序流程图编写程序;6.程序检查、调试与修改;微 机 原 理三、汇编语言程序的基本结构程序根据Boehm和Jacobi的结构定理,任何程序可以由三种最基本的结构程序构成,如下图:顺序结构程序分支结构程序循环结构程序每个结构程序只有一个入口和一个出口,通过三种结构的组合和嵌套可构成任何复杂的结构化程序。微 机 原 理3.3.2顺序结构程序设计 顺序程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP自动增加的顺序进行。例1:利用查表法计算平方值。已知09的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0X9且为

30、整数。解:(1)了解平方表的存放位置;(2)根据X的值,找到X对应X2在表中位置。微 机 原 理STACKSEGMENTDB100DUP(?)STACKENDSDATASEGMENTSURDB?DISDB?SQTABDB0,1,4,9,16,25,36,49,64,81DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATA微 机 原 理BEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXLEABX,SQTAB;取平方表基地址MOVAH,0MOVAL,SUR;AL=XADDBX,AX;计算地址偏移MOV

31、AL,BX;取出X的平方值MOVDIS,ALRETCODEENDSENDBEGIN微 机 原 理BEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXLEABX,SQTABMOVAL,SUR;AL=XXLATSQTABMOVDIS,ALRETCODEENDSENDBEGIN为使程序精练,可采用换码指令XLAT,代码段如下:微 机 原 理结束用户程序返回DOS的方法1.系统功能调用INT21H的4CH号子功能在用户程序结束处用以下语句:MOVAH,4CHINT21H2.利用RET指令上面的例子中所采用的方法。3.程序转移到内存中偏移量为0的地方JMP04.利用中断

32、调用INT20H微 机 原 理BEGIN:MOVAX,DATAMOVDS,AXLEABX,SQTABMOVAL,SUR;AL=XXLATSQTABMOVDIS,ALMOVAH,4CHINT21HCODEENDSENDBEGIN利用系统功能调用INT21H的4CH号子功能返回DOS微 机 原 理3.3.3分支结构程序设计 分支结构程序的基本思想是根据某些条件和状态来控制程序下一步的走向。首先执行能影响状态的指令,如算术逻辑运算指令、移位指令或位操作指令,然后用条件转移类指令对各种状态标志进行判断,进而转移形成分支。设计分支结构程序一般有两种方法:比较/测试分支结构法;跳转表分支结构法;微 机 原

33、 理1.比较/测试分支结构法 采用比较指令CMP和测试指令TEST,产生相应的状态标志,选择适当的条件转移指令,实现不同情况的分支转移。一条转移指令产生两路分支,n条转移指令可产生n+1条分支。=0?BX=0BX=1BX=1YY0?例1实现符号函数。1X0Y=0X=01XSI?一次排序结束?总排序结束?YNNYYAXSI微 机 原 理程序如下:LEADI,BUFFER;取首地址MOV BL,99;须经N-1次排序NEXT0:MOV SI,DI;SI恢复指向首地址MOV CL,BL;每次排序的比较次数NEXT3:MOV AX,SI;当前16位数放在AX中ADDSI,2;SI指向下一个16位数CM

34、PAX,SI;当前数与下一个数比较JNCNEXT5;大于等于则不交换MOV DX,SI;小于则交换MOV SI2,DX;可XCHGSI,AXMOV SI,AX;MOVSI-2,AXNEXT5:DECCL;计算比较次数JNZNEXT3DECBL;每次排序的比较次数减一JNZNEXT0HLT微 机 原 理LEADI,BUFFER;取首地址MOVCOUNT,100;排序元素的个数CLD;地址递增排序NEXT1:MOVBX,1;交换标记DECCOUNT;每次排序的比较次数减一JZEXIT;比较次数为0则结束MOVSI,DI;SI恢复指向首地址MOVCX,COUNT;每次排序的比较次数NEXT2:LOD

35、SW;当前数AX,SI下一个数CMPAX,SI;当前数与下一个数比较JNCNEXT3;大于等于则不交换XCHGSI,AX;小于则交换MOVSI2,AX;大数存入上一位置XORBX,BX;有交换则交换标记清零NEXT3:LOOPNEXT2;一次排序是否结束?CMPBX,0;一次排序是否有交换?JENEXT1;有交换则继续EXIT:MOVAX,4C00HINT21H微 机 原 理3.3.5 子程序设计 子程序是常用的程序结构,将频繁使用的功能写成子程序的形式,可使源程序及目标程序缩短,提高效率和可靠性。在8086/8088中,子程序和过程的含义是一致的。主程序可多次调用一个或多个子程序;子程序可被

36、多个主程序调用,也可再调用其他子程序;子程序调用子程序,称子程序嵌套;调用自己称递归调用;子程序调用时,CPU自动将调用时的断点压入堆栈保存;子程序调用时,由程序将要用到寄存器内容压入堆栈保护;子程序返回前,将压入堆栈的寄存器内容弹出,恢复现场;微 机 原 理 编写子程序有以下几点基本要求:1.子程序必须有一定的通用性,确定入口参数和出口参数。2.选用适当的方法进行主程序和子程序间参数的传递。利用寄存器进行参数传递。例9利用存储单元按事先约定的规则进行参数传递。利用堆栈进行参数传递。例103.注意现场信息的保护和恢复,最好在子程序中进行保护。4.正确使用堆栈。子程序嵌套较多时,使用堆栈要仔细。

37、5.编制子程序文件,主要包括以下内容:子程序的名称;子程序的功能描述;子程序的入口参数和出口参数;子程序所使用的寄存器和存储单元列表,对其作用描述;本子程序所调用的其他子程序列表;子程序调用形式举例;9微 机 原 理例9两个6字节数相加。程序如下:DATA SEGMENTADD1 DB0FEH,86H,7CH,35H,68H,77HADD2 DB45H,0BCH,7DH,6AH,87H,90HSUMDB6DUP(0)COUNTDB6DATA ENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STAC

38、KMADD:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AX微 机 原 理MOV SI,OFFSET ADD1MOV DI,OFFSET ADD2MOV BX,OFFSETSUMMOV CX,COUNTCLCAGAIN:CALL SUBADDLOOPAGAINMOV AX,4C00HINT21HSUBADDPROC;完成一个字节相加PUSH AX;入口参数:SI,DI,BXMOV AL,SI;出口参数:SI,DI,BXADCAL,DIMOV BX,ALINCSI;INCDI;INCBX;POPAXRETSUBADDENDPCODEENDSENDMADD微 机 原 理例

39、10把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串,串的起始地址为STRING。DATASEGMENTNUMBERDW25AFHSTRINGDB4DUP(?),$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATABEGIN:MOV AX,DATAMOV DS,AXMOV ES,AXLEABX,STRINGPUSH BXPUSH NUMBERCALL BINHEXLEADX,STRINGMOV AH,9INT21H调用时IP低调用时IP高NUMBER低NUMBER高STRING低STRING高原栈顶微 机 原 理BINH

40、EXPROCPUSHBPMOVBP,SPPUSHAXPUSHDIPUSHCXPUSHDXPUSHFMOVAX,BP+4;MOVDI,BP+6;STRINGADDDI,LENGTHSTRING-1;MOVDX,AX;DX=25AFHMOVCX,4BP低BP高调用时IP低调用时IP高NUMBER低NUMBER高STRING低STRING高原栈顶$微 机 原 理AGAIN:ANDAX,000FH;保留后四位CALLHEXD;转换成ASCII码STD;从后向前STOSB;存串PUSHCX;保存循环次数MOVCL,4SHRDX,CL;对25AFH右移四位MOVAX,DX;POPCX;恢复循环次数LOOP

41、AGAIN;未完则继续POPFPOPDXPOPCXPOPDIPOPAXPOPBPRET4;返回且使SP指向原栈顶BINHEXENDP微 机 原 理HEXDPROCCMPAL,0AH;JLADDZ;小于0AH则加30HADDAL,a00AH;大于等于则加37HADDZ:ADDAL,0RETHEXDENDPCODEENDSEDNBEGIN微 机 原 理例1164位加法,有两个64位数相加,和放在BUFFER缓冲区中(不考虑进位)。参数放在存储单元中。程序如下:DATASEGMENTVAL1DD01H,12345678HVAL2DD02H,65AB0788HBUFFERDD?,?DATAENDSST

42、ACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK微 机 原 理STARTPROCFARBEGIN:PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXCALLADD64NUM1DWOFFSETVAL1,SEGVAL1NUM2DWOFFSETVAL2,SEGVAL2RESULTDWOFFSETBUFFER,SEGBUFFERRETSTARTENDP微 机 原 理ADD64PROCPUSHBPMOVBP,SPPU

43、SHFPUSHAXPUSHBXPUSHCXPUSHSIPUSHDIMOVBX,BP+2LDSSI,DWORDPTRCS:BXADDSI,LENGTHVAL1LDSDX,DWORDPTR CS:BX+4ADDDX,LENGTHVAL2LESDI,DWORDPTRCS:BX+8ADDDI,LENGTHBUFFERXCHGDX,BXMOVCX,4STDXORAX微 机 原 理AGAIN:LODSWADCAX,BXSTOSWDECBXDECBXLOOPAGAINMOVBX,BP+2ADDBX,0CHMOVBP+2,BXPOPDIPOPSIPOPCXPOPBXPOPAXPOPFPOPBPRETADD64

44、ENDPCODEENDSENDBEGIN微 机 原 理例12数的阶乘n*(n1)!按照阶乘的定义n!=这是一个递归定义式,1在程序设计时,可采用子程序的的递归调用形式。DATASEGMENTNUMDB5FNUMDW?DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDSMOVAX,0PUSHAXMOVCX,1PUSHCXMOVAH,0MOVAL,NUM微 机 原 理CALLFACTORMOVFNUM,AXPOPCXMOVAX,4C00HINT21HFACTORPR

45、OCCMPAX,0JNZIIAMOVDL,1RETIIA:PUSHAXDECALCALLFACTORIIA1:POPCXMULCL;CALLMULTIIA2:MOVDX,AXRETFACTORENDPCODEENDSENDBEGIN微 机 原 理3.3.5 MASM与高级语言的接口MASM与多种高级语言均可以混合编程,介绍一种TurboC调用汇编的过程,说明在汇编中应如何编写程序,C中如何调用程序。一般来说,在高级语言中使用汇编语言主要有以下几个原因:(1)为了提高程序某些关键部分的执行速度,可以 用汇编语言来使关键代码段的时钟周期最短;(2)完成一些高级语言中难以实现的功能,如高分辨率绘图;

46、(3)使用已经开发的汇编语言模块;微 机 原 理1TurboC与汇编语言的接口方法当TurboC调用汇编语言程序时,汇编程序指令序列必须具备一定的顺序,该顺序可描述为:正文段描述;段模式;组描述;进栈;程序体;退栈;正文段结束。例设有一个TurboC程序从键盘上获得两个数,并将其传给汇编语言子程序ASMTC.ASM完成两个数相乘并返回乘积,然后在TurboC程序中将结果显示在屏幕上。微 机 原 理先建立一个TurboC主程序EXAM3-1.C如下:includestdio.hintasmtc(int,int,long*);main()inti,j;longk;printf(Pleaseinpu

47、ti,j=?);scanf(%d,%d,&i,&j);asmtc(i,j,&k);printf(the%dtimes%dis%ldn,i,j,k);getch();其中asmtc()是调用汇编语言子程序的函数,该函数中包括三个参数,前两个为整型数,第三个为长整型数指针。微 机 原 理由上述TurboC主程序调用的汇编语言ASMTC.ASM的子程序如下:PUBLICasmtcTEXTSEGMENTBYTEPUBLICCODEDGROUPGROUPDATA,BSSDATASEGMENTWORDPUBLICDATADATAENDSBSSSEGMENTWORDPUBLICBSSBSSENDSASSUM

48、ECS:TEXT,DS:DOROUP,SS:DOROUPasmtcprocnearpushbpmovbp,sppushsi微 机 原 理movax,bp+4;*得到第一个参数i*movbx,bp+6;*得到第二个参数j*mulbx;*两数相乘*movsi,bp+8;*得到参数k的地址*movsi,ax;*送乘积的低位两个字节*incsiincsimovsi,dx;*送乘积的高位两个字节*popsipopbpRetasmtcendpTEXTENDSEND微 机 原 理2自动产生汇编语言的框架TurboC提供了一种自动产生汇编语言框架的方法。下面举例说明。首先用TurboC写一个与调用汇编程序的函

49、数名相同的空函数,如:asmtc()函数取名ASMTC.C(取名可以任意)并存起来。然后使用:tccSasmtc进行编译,编译后自动生成一个名为ASMTC.ASM的文件,该文件的格式如下:微 机 原 理ifndef?version?debugmacroendmendif?debugS“asmtc.c”TEXT segmentbytepublic“CODE”DGROUPgroup_DATA,_BSSAssumecs:_TEXT,ds:DGROUP,ss:DGROUP_TEXTends_DATAsegmentwordpublicDATAdlabelbytedlabelword_DATAends_B

50、SS segmentwordpublicBSSblabelbyteblabelword?debugCE9797B9E180761736D74632E63_BSS ends微 机 原 理_TEXTsegmentbytepublicCODE;?debugL1_asmtcprocnear1:;?debugL3ret_asmtcendp_TEXTends?debugCE9_DATAsegmentwordpublicDATAslabelbyte_DATAends_TEXTsegmentbytepublicCODE_TEXTendspublic _asmtcend在这个框架式汇编语言程序中,只要在“1:”

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁