微机原理第三章课件.ppt

上传人(卖家):晟晟文业 文档编号:4292190 上传时间:2022-11-26 格式:PPT 页数:135 大小:397.05KB
下载 相关 举报
微机原理第三章课件.ppt_第1页
第1页 / 共135页
微机原理第三章课件.ppt_第2页
第2页 / 共135页
微机原理第三章课件.ppt_第3页
第3页 / 共135页
微机原理第三章课件.ppt_第4页
第4页 / 共135页
微机原理第三章课件.ppt_第5页
第5页 / 共135页
点击查看更多>>
资源描述

1、微 机 原 理微机原理第三章 汇编语言程序设计微 机 原 理概述汇编语言:汇编语言是一种面向计算机的符号语 言。用指令的助记符、符号地址、标 号、伪指令等书写程序的语言。汇编语言源程序:用汇编语言书写的源程序。汇编:将汇编语言源程序翻译成机器语言程序 的过程。汇编程序:完成汇编过程的系统程序。ASM和MASM 微 机 原 理3.1 汇编语言的基本元素在8086/8088汇编语言中,有两类汇编语言指令。一类是执行性指令,称为指令语句,汇编程序汇编后可产生机器指令代码;另一类是指示性语句,称为伪指令,其作用仅仅是告诉汇编程序对源程序中的执行性指令应该如何产生代码,或分配存储区。微 机 原 理3.1

2、.1 汇编语言的指令语句格式 由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由14个部分组成。其格式是:标号 指令助记符 操作数;注释微 机 原 理1标号(标识符 Identifiers)标识符是由程序员定义的具有特定意义的字符序列,是给指令或某一存储单元地址所起的名字。标识符可由下列字符组成:字母:A z;数字:0 9;特殊字符:?、_、$。标识符最多为31个字符。数字不能作标识符的第一个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址。当标识符后不带冒号时,表示变量。伪指令前的标识符不加冒号。标号 指令助记符 操作数;注释微 机 原 理2指令助记符(保

3、留字Reserved words)是一类特殊的标识符,可以是8086/8088的指令助记符,也可以是伪指令。如果指令带有前缀(如LOCK、REP、REPEREPZ、REPNEREPNZ),则指令前缀和指令助记符要用空格分开。标号 指令助记符 操作数;注释 微 机 原 理3操作数 指令执行的对象。例如:RET ;无操作数 INC CX ;一个操作数 MOV CX,DI ;两个操作数 如果是伪指令,则可能有多个操作数,例如:COST DB 3,4,5,6,7 ;5个操作数 当操作数超过1个时,操作数之间应用逗号分开。操作数可以是常数、寄存器名、标号、变量,也可以是表达式,例如:MOV AX,BP+

4、4 ;标号 指令助记符 操作数;注释微 机 原 理4注释 该项是为源程序所加的注解,用于提高程序的可读性。在注释前面要加分号“;”,它位于操作数之后。汇编时,对注解不作处理,仅在列源程序清单时列出,供编程人员阅读。例如:IN AL,PORTB ;读B口到AL中 标号 指令助记符 操作数;注释微 机 原 理3.1.2 汇编语言的运算符汇编语言运算符所指定的操作由汇编程序在汇编过程中完成,结果作为指令的目标代码被保存,与程序执行时CPU完成的可执行指令是两回事,故汇编语言运算符也称为伪操作符。汇编语言的运算符有:算术运算符:+、MOD(取余数);逻辑运算符:AND、OR、NOT、XOR;关系运算符

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

6、小于 LT(Less Than)、大于 GT(Greater Than)、小于等于 LE(Less Than or Equal)、大于等于 GE(Greater Than or Equal)关系运算符连接的两个操作数,必须都是数字的或是在同一段内的存储器地址。若关系为假(关系不成立),则结果为0H;若关系为真(关系成立),则结果为0FFFFH。微 机 原 理例如:MOV BX,(PORT LT 5)AND 20)OR (PORT GE 5)AND 30)当PORT的值小于5时,上述指令汇编为:MOV BX,20否则为 MOV BX,30微 机 原 理3取值运算符(分析运算符)把存储器地址操作数

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

8、,SEG SLOT;将SLOT的段地址送入AX寄存器 MOV AX,OFFSET SLOT;将SLOT的偏移地址送入AX寄 存器,微 机 原 理4属性运算符(合成运算符)属性运算符用来给指令中的操作数指定一个临时属性,而暂时忽略当前的属性。(1)合成运算符PTR 忽略当前操作数的类型(字节或字)及属性(NEAR或FAR),而给出一个临时的类型或属性。一般格式如下:类型(或属性)PTR 操作数表达式 PTR 运算符建立一个存储器地址操作数,它与PTR右边的存储器地址操作数有相同的段地址与偏移量,其类型由左边的操作数决定。微 机 原 理例如:SLOT DW 25 MOV AL,BYTE PTR S

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

10、IS运算符后面指定。例如:MY_BYTE EQU THIS BYTE MY_WORD DW?将建立MY_BYTE具有字节类型,且与MY_WORD 具有相同的段和偏移量。微 机 原 理(3)段取代运算符 用于在一条指令中以新的段属性取代旧的段属性。有两种格式:段寄存器:地址表达式例如:ADD AX,ES:ALT 段名:地址表达式 所用的段名事前必须通过ASSUME伪指令与一个段寄存器建立联系。例如:ASSUME ES:EXTRA_DATA ADD AX,EXTRA_DATA:ALT微 机 原 理(4)短程运算符SHORT 仅用于无条件转移指令。指出转移的标号不仅是NEAR型的,并且是在下一条指令

11、的128 127个字节范围内。运算符SHORT事先对标号作了说明,则会汇编成两字节的转移指令,既节省了单元又加快了执行速度。例如:JMP SHORT H2 ;H2:MOV AX,0 微 机 原 理3.1.3 表达式 表达式是由运算符和操作数组成的序列。在汇编时,它产生一个确定的值。仅表示一个常量,相应的表达式称为常量表达式;也可以表示一个存储单元的偏移地址,相应的表达式称为地址表达式。操作数通常有下列几种类型 微 机 原 理1常数 汇编语言语句中出现的常数有7种:二进制数 二进制数字后跟字母B,如 01000001B。八进制数 八进制数字后跟字母Q或O,如 202Q或202O。十进制数 十进制

12、数字后跟 D或不注,如 85D或85。十六进制数 十六进制数字后跟 H,如 56H,0FFH。注意,当数字的第一个字符是AF时,在字符前应添加一个数字0,以示和变量的区别。微 机 原 理 十进制浮点数 浮点十进制数如 25E-2。十六进制实数 十六进制实数后跟R,数字的位数必须是8,16或20。在第一位是0的情况下,数字的位数可以是9,17或21。如 0FFFFFFFFR。以上第、两种数字格式只允许在MASM中使用。字符和字符串 字符和字符串要求用单引号括起来,如BD。微 机 原 理2常量操作数 常量操作数是一个数值操作数,一般是常量或者是常量的标识符。例如 常量操作数有100,PORT,VA

13、L等。数字常量操作数可采用二、八、十或十六进制等形式。操作数值的允许范围为6553665535。字符串常量操作数值为相应字符的ASCII码。常量操作数是出现在程序中的确定值,它在程序的运行期间不会发生变化。微 机 原 理3存储器操作数 存储器操作数是一个地址操作数,代表一个存储单元的地址。可以分为变量及标号两者类型:变量是存放该变量的存储单元的符号地址 存储器操作数所代表的是某个数据在数据段、附加段或堆栈段中的地址,称变量。变量所对应的存储单元内容在程序的运行过程中是可以改变的。标号则是指令代码的符号地址 存储器操作数所代表的是某条指令代码在码段中的地址,在程序运行过程中不能改变,标号通常作为

14、转移指令或调用指令的目标操作数。微 机 原 理存储器操作数作为存储单元的地址,有三个属性:(1)段地址:存储单元所在段的段地址;(2)偏移地址:存储单元在所在段内的偏移地址;(3)类型:变量的类型是存储单元所存放数据项的 字节数;标号的类型作为转移或调用指令的目标 操作数的寻址方式,即 NEAR和FAR。标号的默认类型属性为NEAR。微 机 原 理4常量表达式 常量表达式通常由常量操作数及运算符构成,在汇编时,产生一个常量。例如:PORT_VAL+1 PORT_VAL AND 20H 分析运算符作用于存储器操作数所形成的表达式也是常量表达式。例如:OFFSET SUM SEG SUM TYPE

15、 CYCLE 微 机 原 理5地址表达式 地址表达式通常由存储器操作数与运算符构成。地址操作数构成地址表达式时,必须有明确的物理意义。所以对存储器操作数的运算可以是加或减一个常量。例 SUM2、CYCLE5 表达式SUM2、CYCLE5的值仍然是一个存储器操作数,其段地址与类型分别与存储器操作数SUM及CYCLE相同,但偏移地址分别比SUM大2及CYCLE小5。表达式是在汇编时计算的,而变量单元的内容在程序的运行过程中可以改变。微 机 原 理3.1.4 汇编语言程序汇编步骤 用汇编语言编写源程序 经过汇编生成目标程序 经过链接生成执行程序 汇编目标程序汇编程序MASM.EXE汇编语言源程序执行

16、程序链接编辑程序EDIT.EXE链接程序LINK.EXE文件名.ASM 文件名.OBJ 文件名.EXE微 机 原 理1编写源程序 用文本编辑程序EDIT.EXE或EDLIN编写汇编语言源程序,产生扩展名为.ASM的源文件。2 汇编 用汇编语言编写的源程序经过汇编程序MASM.EXE自动翻译成目标程序,产生扩展名为.OBJ的目标文件;对源程序中使用了非法指令,标号重复,相对转移超出转移范围等非逻辑性错误给出提示。8086的汇编程序为ASM-86,扩展后的宏汇编程序为MASM-86,增加了宏处理功能、条件汇编及某些伪指令,且可支持8087协处理器的操作。微 机 原 理汇编程序的主要功能是:1、将汇

17、编语言源程序翻译成机器语言代码;2、按程序指定,分配存储区域(包括程序区,数据区,堆栈区等);3、将各种进位制数据转换成二进制数;4、把字符转换成ASCII码;5、计算出数值表达式的值;6、对源程序进行检查,给出程序的语法错误信息,如非法格式,未定义的助记符、标号、漏掉操作数等。微 机 原 理3链接 用链接程序LINK.EXE将一个或多个.OBJ目标程序进行链接,生成扩展名为.EXE的可执行程序。4调试 经过上述步骤所获得的.EXE可执行文件,在运行过程中可能出现逻辑错误,需对可执行文件.EXE进行调试。调试汇编程序最常用的工具是动态调试程序DEBUG。其中从某地址运行程序、设置断点、单步跟踪

18、等功能,可以支持对程序的调试。微 机 原 理3.2 伪指令 伪指令语句也称为指示性语句,是用来对程序的汇编过程进行控制,实现初始化存储器、定义符号常数、列表、存储空间分配等处理。根据功能的不同,伪指令可分为以下几种类型:数据定义伪指令 符号定义伪指令 段定义伪指令 过程定义伪指令 宏定义 模块组织和多模块连接微 机 原 理3.2.1 数据定义伪指令 该类伪指令用来定义存储空间及其所存数据长度。DB:定义字节,即每个数据是1个字节;DW:定义字,即每个数据占1个字(2个字节);DD:定义双字,即每个数据占2个字。低字部 分在低地址,高字部分在高地址;DQ:定义4字长,即每个数据占4个字;DT:定

19、义10个字节长,用于压缩式十进制数。微 机 原 理例:DATA1 DB 5,6,8,100,ABCD表示从DATA1单元开始,连续存放5,6,8,100,共占4个字节地址。DATA2 DW 7,287表示从DATA2单元开始,连续存放7,287两个字,共占4个字节地址。定义一个存储区时,也可以不放数据,如TABLE DB?;表示在TABLE单元中存放的内容是随机的。微 机 原 理05H06H08H64H41H42H43H44H07H00H1FH01H42H41H44H43HDATA1DATA2DATA1 DB 5,6,8,100,ABCDDATA2 DW 7,287,AB,CDDATA3 DD

20、 ABCD,CD44H43H42H41H44H43H00H00HDATA3微 机 原 理 当定义一个存储区内的每个单元要放置同样的数据时,可用DUP操作符,一般格式为:COUNT DUP(?);COUNT 为重复的次数,?为要重复的数据。如:BUFFER DB 100 DUP(0);表示以BUFFER为首地址的100个字节中存放00HBUFFER1 DB 100 DUP(3,5,2DUP(10),35),24,NUM表示以BUFFER1为首地址的区域存放(3,5,10,10,35)100次,和24,NUM微 机 原 理3.2.2 符号定义伪指令 等值伪指令EQU 给左边符号定义一个值。该值可以

21、是任何有效的操作数表达式,如一个常数、另一个符号名或地址表达式,甚至一个指令助记符。在程序中,凡是出现该符号的地方,汇编时均用该值代替。如:TIMES EQU 50;TIMES=50 DATA DB TIMES DUP(?)FIRST EQU SECOND+1;FIRST=SECOND+1 ADD1 EQU ADD;为ADD指定一个别名ADD1 微 机 原 理 解除伪指令PURGE 用于释放由EQU伪指令定义的符号变量,这样这些变量就可以被重新定义。EQU伪指令定义的符号在PURGE伪指令解除前,不能重新定义。例:PURGE 符号名1,符号名2,符号名N 等号赋值伪指令“=”功能与EQU相似,

22、能对已定义的符号名重新定义而无须先释放。TIMES=50;FIRST=SECOND+1;ADD1=ADD;微 机 原 理3.2.3 段定义伪指令 一个完整的汇编源程序由代码段、堆栈段、数据段,有时还有附加段所组成。段定义伪指令可将源程序划分成若干段,以便汇编和连接时将各同名段进行组合。段定义伪指令一般格式为:段名 SEGMENT 定位类型 组合类型 类别 ;段体内容,由指令及伪指令组成。段名 ENDS SEGMENT和ENDS应成对使用,缺不可。微 机 原 理 段名:段名是不可省略的,是给定义的 段所起的名称。例如:STACK SEGMENT STACK DW 20DUP(?)STACK EN

23、DS 定位类型:表示该段起始地址位于何处。字节型(BYTE),段起始地址可位于任何地方;字型(WORD),段起始地址必须位于偶地址;节型(PARA),即段起始地址必须能被16除尽;页型(PAGE),即段起始地址可被256除尽;缺省时,段起始地址便定位为PARA型的。微 机 原 理 组合类型:组合类型用于告诉连接程序,该段 和其它段的组合关系。连接程序可以将不同模 块的同名段进行组合。组合类型有:NONE 表明本段与其它段逻辑上不发生关 系,省略时,便指定为这一组合类型。PUBLIC与其它模块中用PUBLIC说明的同名 段按先后连接成一个逻辑段,使用同一个 物理段地址。STACK 将具有STAC

24、K类型的同名段连接成 一个大的堆栈,由各模块共享。微 机 原 理COMMON与其它模块中由COMMON说明的 所有同名段连接时,被重叠放在一起,其长度是同名段中最长者的长度。MEMORY由MEMORY说明的段。在连接时,它被放在所装载程序的最后存储区(最高地址)。若几个段都有MEMORY组合类型,则连接程序只认定首先遇到的段具有MEMORY组合类型,其它段则认为是COMMON类型,并被叠放在一起。AT表达式段地址是表达式所给定的值。在程序中就可由用户直接来定义段地址。但这种方式不适用于代码段。微 机 原 理 类别:是用单引号括起来的字符串,以表明该 段的类别。如代码段(CODE)、数据段(DA

25、TA),堆栈段(STACK)等。各模块中同一类型的段可能具有不同的名字,连接时将同类别的段(但不一定同名)放在连续的存储区内。上述的组合类型便于多个模块的连接。若程序仅有一个模块,即只包括代码段、数据段和堆栈段时,为了和其它段有区别,除了堆栈段用STACK说明外,其它段的组合类型、类别均可省略。微 机 原 理例如有两个模块:模块1 STACKSEGMENT STACK DW 300DUP(?)STACK ENDS DATA SEGMENT COMMON DATA ENDS CODE SEGMENT PUBLIC CODE ENDS 模块2 STACK SEGMENT STACK DW 30DU

26、P(?)STACK ENDS DATA SEGMENT COMMON DATA ENDS CODE SEGMENT PUBLIC CODE ENDS END微 机 原 理3.2.4 设定段寄存器伪指令ASSUME段寄存器定义伪指令。用于建立段名 和段寄存器之间的严格对应关系。可通知汇编程 序哪一个段寄存器是当前段的段寄存器,以便对 使用变量或标号的指令汇编出正确的目的代码。其格式为:ASSUME 段寄存器:段名,段寄存器:段名,ASSUME伪指令只是指明某一个段地址与段寄存器的联系,没有将段地址送入该寄存器的操作。因此要将段地址装入段寄存器还需用汇编指令来实现。微 机 原 理例如:CODE S

27、EGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送AX MOV DS,AX ;AX内容送DS,本指令执行 完 之后,DS才为实际段值CODE ENDS 由于DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始化为正确的堆栈段地址,在程序中就不必设置。但DS数据段或ES附加段必须MOV指令对DS和ES进行初始化,以装入段地址。微 机 原 理3.2.5 ORG 伪指令 ORG:伪指令用于指定段内程序或数据代码存放的起始偏移地址,即用语句中表达式的值作为起始偏移地址,此后的程序或数据代码将连续存放,除非遇到另一个新的ORG语

28、句。一般格式为:ORG 例如:DATASEGMENT BUFF1DB23,56H,EOF ORG2000H BUFF2DBSTRING DATAENDS 微 机 原 理3.2.6 定义过程的伪指令 具有一定功能的程序段作为一个过程(相当于一个子程序)。可以被别的程序调用(用CALL指令)或由JMP指令转移到此执行;也可以由程序顺序执行;或作为中断处理程序,在中断响应后转此执行。一个过程由伪指令PROC和ENDP来定义。其格式为:过程名 PROC 类型(FAR/NEAR,缺省为NEAR)RET过程名 ENDP 过程体内至少应有一条RET指令。过程可以嵌套,也可以递归使用,即过程可以调用过程或本身

29、。过程体微 机 原 理例如:延时100ms的过程,可定义如下:DELAY PROC PUSH BX PUSH CX MOV BL,10AGAIN:MOV CX,2801;延时10msWAI:LOOP WAI DEC BL JNZ AGAIN POP CX POP BX RETDELAY ENDP 微 机 原 理CODE1 SEGMENT ASSUME CS:CODE1 FARPROC PROC FAR RET FARPROC ENDPCODE1 ENDS CODE2 SEGMENT ASSUME CS:CODE2CALL FARPROC.CALL NEARNEAR PROC NEARRETNE

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

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

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

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

34、。解:(1)了解平方表的存放位置;(2)根据X的值,找到X对应X2在表中位置。微 机 原 理STACK SEGMENT DB 100 DUP(?)STACK ENDSDATA SEGMENT SUR DB?DIS DB?SQTAB DB 0,1,4,9,16,25,36,49,64,81DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA 微 机 原 理BEGIN:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA BX,SQTAB;取平方表基地址 MOVAH,0 MOVAL

35、,SUR ;AL=X ADDBX,AX ;计算地址偏移 MOVAL,BX ;取出X的平方值 MOVDIS,AL RETCODE ENDS END BEGIN微 机 原 理BEGIN:PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX LEA BX,SQTAB MOVAL,SUR ;AL=X XLAT SQTAB MOVDIS,AL RETCODE ENDS END BEGIN为使程序精练,可采用换码指令XLAT,代码段如下:微 机 原 理结束用户程序返回DOS的方法1.系统功能调用 INT 21H的4CH号子功能 在用户程序结束处用以下语句:MOV A

36、H,4CH INT 21H2.利用RET指令 上面的例子中所采用的方法。3.程序转移到内存中偏移量为0的地方 JMP 04.利用中断调用 INT 20H 微 机 原 理BEGIN:MOV AX,DATA MOV DS,AX LEA BX,SQTAB MOVAL,SUR ;AL=X XLAT SQTAB MOVDIS,AL MOV AH,4CH INT 21HCODE ENDS END BEGIN利用系统功能调用 INT 21H的4CH号子功能返回DOS微 机 原 理3.3.3 分支结构程序设计 分支结构程序的基本思想是根据某些条件和状态来控制程序下一步的走向。首先执行能影响状态的指令,如算术逻

37、辑运算指令、移位指令或位操作指令,然后用条件转移类指令对各种状态标志进行判断,进而转移形成分支。设计分支结构程序一般有两种方法:比较/测试分支结构法;跳转表分支结构法;微 机 原 理1.比较/测试分支结构法 采用比较指令CMP和测试指令TEST,产生相应的状态标志,选择适当的条件转移指令,实现不同情况的分支转移。一条转移指令产生两路分支,n 条转移指令可产生 n+1条分支。=0?BX=0BX=1BX=1YY 0?例1 实现符号函数。1 X 0Y=0 X=0 1 X SI?一次排序结束?总排序结束?YNNYYAXSI微 机 原 理程序如下:LEADI,BUFFER;取首地址MOV BL,99 ;

38、须经N-1次排序NEXT0:MOV SI,DI ;SI恢复指向首地址MOV CL,BL ;每次排序的比较次数NEXT3:MOV AX,SI ;当前16位数放在AX中ADDSI,2 ;SI指向下一个16位数CMPAX,SI ;当前数与下一个数比较JNCNEXT5 ;大于等于则不交换MOV DX,SI ;小于则交换MOV SI 2,DX ;可 XCHG SI,AXMOV SI,AX ;MOV SI-2,AXNEXT5:DECCL ;计算比较次数JNZNEXT3DECBL ;每次排序的比较次数减一JNZNEXT0HLT微 机 原 理 LEADI,BUFFER;取首地址 MOVCOUNT,100;排序

39、元素的个数 CLD ;地址递增排序NEXT1:MOVBX,1 ;交换标记 DECCOUNT ;每次排序的比较次数减一 JZEXIT ;比较次数为0则结束 MOVSI,DI ;SI恢复指向首地址 MOVCX,COUNT ;每次排序的比较次数NEXT2:LODSW ;当前数AX,SI 下一个数 CMPAX,SI ;当前数与下一个数比较 JNCNEXT3 ;大于等于则不交换 XCHGSI,AX ;小于则交换 MOVSI 2,AX ;大数存入上一位置 XORBX,BX;有交换则交换标记清零NEXT3:LOOPNEXT2 ;一次排序是否结束?CMPBX,0 ;一次排序是否有交换?JENEXT1 ;有交换

40、则继续EXIT:MOVAX,4C00H INT21H微 机 原 理3.3.5 子程序设计 子程序是常用的程序结构,将频繁使用的功能写成子程序的形式,可使源程序及目标程序缩短,提高效率和可靠性。在8086/8088中,子程序和过程的含义是一致的。主程序可多次调用一个或多个子程序;子程序可被多个主程序调用,也可再调用其他子程序;子程序调用子程序,称子程序嵌套;调用自己称递归调用;子程序调用时,CPU自动将调用时的断点压入堆栈保存;子程序调用时,由程序将要用到寄存器内容压入堆栈保护;子程序返回前,将压入堆栈的寄存器内容弹出,恢复现场;微 机 原 理 编写子程序有以下几点基本要求:1.子程序必须有一定

41、的通用性,确定入口参数和出口参数。2.选用适当的方法进行主程序和子程序间参数的传递。利用寄存器进行参数传递。例 9 利用存储单元按事先约定的规则进行参数传递。利用堆栈进行参数传递。例10 3.注意现场信息的保护和恢复,最好在子程序中进行保护。4.正确使用堆栈。子程序嵌套较多时,使用堆栈要仔细。5.编制子程序文件,主要包括以下内容:子程序的名称;子程序的功能描述;子程序的入口参数和出口参数;子程序所使用的寄存器和存储单元列表,对其作用描述;本子程序所调用的其他子程序列表;子程序调用形式举例;9微 机 原 理例9 两个6字节数相加。程序如下:DATA SEGMENTADD1 DB 0FEH,86H

42、,7CH,35H,68H,77HADD2 DB 45H,0BCH,7DH,6AH,87H,90HSUM DB 6DUP(0)COUNT DB 6DATA ENDSSTACK SEGMENT DB 100DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMADD:MOVAX,DATA MOVDS,AX MOVAX,STACK MOVSS,AX微 机 原 理MOV SI,OFFSET ADD1MOV DI,OFFSET ADD2MOV BX,OFFSET SUMMOV CX,COUNTCLCAGAIN:CALL SUBADDLOO

43、P AGAINMOV AX,4C00HINT21HSUBADDPROC ;完成一个字节相加PUSH AX ;入口参数:SI,DI,BXMOV AL,SI ;出口参数:SI,DI,BXADCAL,DIMOV BX,ALINCSI;INCDI;INCBX;POPAXRETSUBADDENDPCODEENDSEND MADD微 机 原 理例10 把内存中的字变量NUMBER的值,转换为4个ASCII 码表示的十六进制数码串,串的起始地址为STRING。DATASEGMENTNUMBERDW25AFHSTRINGDB4DUP(?),$DATAENDSCODESEGMENTASSUMECS:CODE,D

44、S:DATA,ES:DATABEGIN:MOV AX,DATAMOV DS,AXMOV ES,AXLEABX,STRINGPUSH BXPUSH NUMBERCALL BINHEX LEADX,STRING MOV AH,9 INT21H调用时 IP 低调用时 IP 高NUMBER 低NUMBER 高STRING 低STRING 高 原栈顶微 机 原 理BINHEX PROC PUSHBP MOVBP,SP PUSHAX PUSHDI PUSHCX PUSHDX PUSHF MOVAX,BP+4 ;MOVDI,BP+6 ;STRING ADDDI,LENGTH STRING-1;MOVDX,A

45、X ;DX=25AFH MOVCX,4 BP 低 BP 高调用时 IP 低调用时 IP 高NUMBER 低NUMBER 高STRING 低STRING 高 原栈顶$微 机 原 理AGAIN:ANDAX,000FH;保留后四位CALLHEXD ;转换成ASCII码STD ;从后向前STOSB ;存串PUSHCX ;保存循环次数MOVCL,4SHRDX,CL ;对 25AFH 右移四位MOVAX,DX ;POPCX ;恢复循环次数LOOPAGAIN ;未完则继续POPFPOPDXPOPCXPOPDIPOPAXPOPBPRET4 ;返回且使SP指向原栈顶BINHEXENDP微 机 原 理HEXDPR

46、OCCMPAL,0AH ;JLADDZ ;小于0AH 则加 30HADDAL,a00AH;大于等于则加 37HADDZ:ADDAL,0RETHEXDENDPCODEENDSEDNBEGIN微 机 原 理例11 64位加法,有两个64位数相加,和放在BUFFER缓 冲区中(不考虑进位)。参数放在存储单元中。程序如下:DATASEGMENTVAL1DD01H,12345678HVAL2DD02H,65AB0788HBUFFERDD?,?DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,S

47、S:STACK微 机 原 理STARTPROCFARBEGIN:PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXCALLADD64NUM1DWOFFSET VAL1,SEG VAL1NUM2DWOFFSET VAL2,SEG VAL2RESULTDWOFFSET BUFFER,SEG BUFFERRETSTARTENDP微 机 原 理ADD64 PROC PUSHBP MOVBP,SP PUSHF PUSHAX PUSHBX PUSHCX PUSHSI PUSHDI MOVBX,BP+2 LDSSI,DWORD

48、PTR CS:BX ADDSI,LENGTH VAL1 LDSDX,DWORD PTR CS:BX+4 ADDDX,LENGTH VAL2 LESDI,DWORD PTR CS:BX+8 ADDDI,LENGTH BUFFER XCHGDX,BX MOVCX,4 STD XORAX微 机 原 理AGAIN:LODSWADCAX,BXSTOSWDECBXDECBXLOOPAGAIN MOVBX,BP+2ADDBX,0CHMOVBP+2,BXPOPDIPOPSIPOPCXPOPBXPOPAXPOPFPOPBPRETADD64ENDPCODEENDSEND BEGIN微 机 原 理例12 数的阶乘

49、n*(n 1)!按照阶乘的定义 n!=这是一个递归定义式,1在程序设计时,可采用子程序的的递归调用形式。DATASEGMENTNUMDB 5FNUMDW?DATAENDSSTACKSEGMENTDB 100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDSMOVAX,0PUSHAXMOVCX,1PUSHCX MOVAH,0MOVAL,NUM微 机 原 理CALLFACTORMOVFNUM,AXPOPCXMOVAX,4C00HINT21HFACTORPROCCMPAX,0JNZIIAMOVDL,1RETIIA:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(微机原理第三章课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|