微机原理与接口技术.ppt
《微机原理与接口技术.ppt》由会员分享,可在线阅读,更多相关《微机原理与接口技术.ppt(116页珍藏版)》请在三一办公上搜索。
1、,侯彦利,吉林大学工学部计算机硬件基础课程微机原理与接口技术,1,吉林大学工学部计算机硬件基础课程微机原理与接口技术,2,第4章 汇编语言及其程序设计,教学目的:了解汇编语言源程序的结构掌握伪指令系统理解DOS功能调用掌握汇编语言源程序的设计方法,3,4.1 汇编语言源程序,用汇编语言编写的程序称为汇编语言源程序,将汇编语言源程序翻译成机器语言的系统程序称为汇编程序assembler,翻译的过程叫做汇编assemble。,4,4.1.1 汇编语言源程序结构,汇编语言源程序结构是指语句的格式和程序的组成部分。源程序结构取决于汇编程序,不同的汇编程序要求的源程序结构不同,不同CPU的汇编程序也不相
2、同。不过功能大致相同的汇编语言其源程序结构也大致相同。本章以80X86CPU所常用的MASM宏汇编程序为背景介绍汇编语言源程序结构。汇编语言源程序的组成部分,5,1.汇编语言源程序的组成部分:,数据段名 SEGMENT 数据段名 ENDS附加数据段名 SEGMENT 附加数据段名 ENDS堆栈段名 SEGMENT 堆栈段名 ENDS代码段名 SEGMENT 代码段名 ENDS END,每段以SEGMENT语句开始,整个程序以END语句结束,以ENDS语句结束,6,【例题4-1】将STRING 1中100个字节传送到STRING 2中,DATASEGMENT;定义数据段STRING1 DB 10
3、0 DUP(55H)DATA ENDS;数据段结束EDATA SEGMENT;定义附加段STRING2 DB 100 DUP(?)EDATA ENDS;附加段结束 STACKSEGMENT;定义堆栈段 DW 256 DUP(?)STACK ENDS;堆栈段结束 CODE SEGMENT;定义代码段ASSUME CS:CODE,DS:DATA,ES:EDATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX;初始化DS MOV AX,EDATA MOV ES,AX;初始化ES MOV AX,STACK MOV SS,AX MOV SI,OFFSET STRING1;初始化
4、源串指针MOV DI,OFFSET STRING2;初始化目的指针MOV CX,100;初始化计数器CLD;设置DF=0,使SI和DI按增量变化,增量为1REP MOVSBMOV AH,4CHINT 21H CODE ENDS;代码段结束 END START,7,汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。一个程序一般定义三类段:数据段、堆栈段和代码段,必要时增加定义附加数据段,能独立运行的程序至少包含一个代码段。,8,2.汇编语言的语句格式,汇编语言源程序中一行只
5、能写一个语句。每个语句可以有4部分:标号、操作码助记符、操作数助记符、注释。例如:BEGAIN:MOV AX,BX;BX数据传送给AX,9,标号是某条指令的地址,是用符号表示的地址,所以也叫符号地址。标号后加冒号“:”。名字是变量、段或子程序的名字。例如【例题4-1】中的DATA、EDATA、STACK和CODE。名字后面没有冒号“:”,与操作码之间用空格分隔。操作码和操作数之间用空格分隔,操作数之间用逗号分隔。分号表示注释,用来说明程序或语句的功能,常跟在语句的后面,分号为注释的开始。如果一行的第一个字符是“;”说明整行都是注释,用来说明下面程序段的功能。,10,汇编语言语句类型:,指令性语
6、句、指示性语句,11,指示性语句,又称为伪操作语句,它不是8088/8086CPU的指令,它与汇编程序(assembler)有关。指示性语句的功能主要是定义变量、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。源程序汇编后指示性语句不生成目标代码,所以常被称为伪指令。例如:DATA SEGMENT;定义数据段STRING1 DB 100 DUP(55H)DATA ENDS;数据段结束,12,指令性语句,指令性语句是可执行语句,是8088/8086CPU的指令。源程序汇编后指令性语句生成目标代码。例如:START:MOV AX,DATA MOV DS,AX;初始化DS MOV AX,EDAT
7、A MOV ES,AX;初始化ES MOV AX,STACK MOV SS,AX MOV SI,OFFSET STRING1;初始化源串指针MOV DI,OFFSET STRING2;初始化目的指针MOV CX,100;初始化计数器CLD;设置DF=0,使SI和DI按增量变化,增量为1REP MOVSBMOV AH,4CHINT21H,13,指令性语句和指示性语句的区别:1.标号和名字指令性语句的标号是指令的符号地址,后边通常加上:名字通常表示变量名、段名和过程名,后边不加:2.操作数指令性语句的操作数最多有2个,可以没有;指示性语句中的操作数至少要有1个,可以有多个,相互之间用逗号分开;,1
8、4,4.1.2 汇编语言源程序的处理过程,汇编程序(Assembler)就是处理汇编语言源程序的系统程序,处理的过程称为汇编。源程序经过汇编生成目标程序,目标程序经过连接程序连接,就得到可执行文件。,15,4.1.3 汇编语言中的操作数,汇编语言语句中的操作数可以是寄存器、存储器单元、常量、变量、名字、标号和表达式。,16,1.常量常量也称常数,有数值常量和字符常量两种。数值常量可以是二进制数、十进制数和十六进制数。十六进制数若是以字母(AF)开始,需在前面加一个数字0,用以说明这是数值常量,不是字符串。例如:MOV AX,0D3A9H字符常量是用单引号括起来的字符或字符串,源程序汇编之后它们
9、转换为相应的ASCII码。例如:MOV AL,A;AL=41H VARDBHello;相当于 VAR DB 48H,65H,6CH,6CH,6FH,17,2.变量变量是指存储单元中的数据,这些数据在程序运行中可以修改变化,因此称其为变量。每个变量可以有一个名字(变量名),也可以没有。一个变量名可以表示一个数据或一组类型相同的数据,即一个变量名可以是一个数据的符号地址,也可以是一组数据的符号首地址。变量名可以作为存储器操作数使用。例如:STRDB STRINGNUMDW 0AAH,23HLAB0DQ 01A4578H,18,变量在除了代码段之外的其他段中定义,有段、偏移量和类型三种属性。段属性:
10、变量所在的段。偏移量属性:变量的偏移地址。类型属性:变量所存储数据的数据类型,有:BYTE、WORD、DWORD、DQ(8个字节)、DT(10个字节)。,19,3.标号与名字标号在代码段中定义,后面跟冒号,是指令的符号地址。标号经常作为转移指令、循环指令和调用指令的操作数。标号有三种属性:段、偏移量和类型。段属性:标号所在的段。偏移量属性:标号的偏移地址。类型属性:标号是在本段内还是在其他段内,在本段内称为近地址属性(NEAR),在其他段内称为远地址属性(FAR),近地址属性NEAR可以省略。,20,例如:LEA SI,VAR MOV CX,100 XOR AX,AX COUNT:ADD SI
11、,2 ADD AX,SI LOOP COUNT MOV SUM,AX;COUNT的属性为近地址属性NEAR,21,名字通常指的是段名、变量名和子程序名,其后不跟冒号。标号与名字的用法作用不同,但设置方法却一样。可以使用:大小写英文字母数字0特殊字符?#$标号或名字中的第一个字符必须是英文字母或圆点,整体最长不能超过31个字符,不能使用指令助记符、寄存器名及汇编语言指令系统中的保留字。标号和名字由程序员确定。,22,表达式表达式由常量、变量和标号通过运算符结合而成。表达式中的运算在汇编时完成,运算结果可以是操作数也可以是操作数地址。例如下面指令中的源操作数:MOV AX,SEG VARMOV B
12、X,5 MOD 3ADD AL,LAB*5+DATA,23,表达式中的常用运算符:,(1)算术运算符:+、-、*、/、MODMOD是指除法运算的余数,如15 MOD 7结果为1。MOV AX,15 MOD 7;汇编之后为MOVAX,1MOV DX,ARRAY+(7-1)*2(2)逻辑运算符:AND、OR、XOR、NOT逻辑运算符只能用于数字表达式,不能用于地址表达式中。CMPAL,04H AND 75H;汇编之后为CMPAL,04,24,(3)关系运算符:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)关系运算符对两个性质相同的数据进行运算,可以构
13、成数字表达式或地址表达式,运算的结果应为逻辑值:关系成立结果为真,输出为全1;关系不成立结果为假,输出为0。例如:DATA和NUM为常量,DATA=5AH NUM=35HMOV BX,DATA GT NUM;汇编之后为MOV BX,0FFFFHMOV BX,DATA EQ NUM;汇编之后为MOV BX,0,25,(4)取值运算符:TYPE、SIZE、OFFSET、SEG TYPE Variable 或label;取变量或标号的类型。变量的类型值:DB为1、DW为2、DD为4、DQ为8、DT为10 标号的类型值:NEAR为-1;FAR为-2 例如:NUM DW 0375H,982AH,793E
14、H;定义变量 ADD SI,TYPE NUM;汇编之后为ADD SI,2,26,SIZE Variable取变量的所有操作数的字节数,也称为大小运算符。例如:LAB0 DB34,65,28 LAB1 DW 100 DUP(3755H)MOV CX,SIZE LAB0;汇编之后为MOV CX,3MOV AX,SIZE LAB1;汇编之后为MOV CX,200,27,OFFSET Variable 或label取变量或标号的偏移地址。例如:MOV BX,OFFSET NUM;与LEA BX,NUM指令等价SEG Variable 或label取变量或标号的段基址。例如:MOV BX,SEG NUM
15、;取NUM所在段的段基址,28,(5)修改属性运算符:PTR修改操作数的类型,操作仅限于本条指令。例如:MOV BX,WORD PTR LAB0段超越前缀“:”用来表示一个标号、变量或地址表达式的段属性。例如:MOV AX,ES:BX+SI,29,注意:在计算表达式值时,括号内的表达式优先计算,然后按运算符的优先顺序计算,对优先级相同的运算符按从左到右的顺序进行计算。运算符的优先级别从高到低的排列次序如下:在圆括号中的项,方括号中的项PTR、OFFSET、SEG、TYPE*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GE先NOT,AND,然后是OR和XOR,30,4.2 伪
16、 指 令,汇编语言中的指示性语句也称为伪指令。伪指令由汇编程序处理,不生成目标代码,不参与程序的执行。宏汇编程序MASM设置了几十种伪指令,下面简单介绍一些常用的伪指令:设定段寄存器伪指令数据定义伪指令符号定义伪指令过程定义伪指令宏命令伪指令 模块定义与连接伪指令,31,4.2.1段定义伪指令,段定义伪指令SEGMENT和ENDS格式:段名SEGMENT 定位类型 组合类型 类别 段名ENDS例如:DATA SEGMENT BUFFER DB 100 DUP(?)COUNT DW 100 DATA ENDS,32,(1)定位类型:说明该段对起始地址的要求。PARA:段起始地址必须能被16整除;
17、BYTE:段起始地址可以是任何地址;WORD:段起始地址必须为偶数;PAGE:段起始地址必须从页边界开始,即必须能被256整除;如果省略定位类型参数,汇编程序默认为PARA。,33,(2)组合类型:多个程序模块进行连接时,相同类型的段进行组合构成一个段。NONE:本段作为独立段装入内存,不与其他模块中的段组合,即使段名相同也不组合。PUBLIC:与其他模块中由PUBLIC说明的同名段接在一起。COMMON:与其他模块中由COMMON说明的同名段重叠存放,后连接的COMMON段会覆盖前面的内容,连接之后COMMON的长度是各分段中的最长的段的长度。STACK:与其他模块中由STACK说明的同名堆
18、栈连接在一起,形成一个大的堆栈段,由各模块共享,堆栈指针自动指向这个大堆栈段的栈顶。,34,MEMORY:将该段放在所有段的最后(高地址),如果连接时有多个MEMORY段,汇编程序将遇到的第一个作为MEMORY段,其余的作为COMMON段。AT:表达式计算出的值为段基址,但不能用这种方式指定代码段。如果省略组合类型参数,汇编程序默认为NONE。,35,(3)类别:指定段的类别。用单引号括起来的字符串,常用STACK表示堆栈段,CODE表示代码段,DATA表示数据段,EXTRA表示附加数据段。在多个程序模块连接时,具有相同类别的段在一起装入连续的内存区域,无类别的段在一起装入连续的内存区域。,3
19、6,Estacksegmentpara stack stackEstackends该段是堆栈段,段名为Estack;segment指明堆栈段开始;para说明该段必须从能被16整除的地址边界开始;stack指明组合类型;stack指明类别是堆栈类。注意:同一个段的起始和结束必须是同一个名字。,37,2.ASSUME伪指令,格式:ASSUME 段寄存器名:段名,段寄存器名:段名,ASSUME伪指令说明段名和段基址寄存器之间的关系,但它不能给段寄存器赋值,段寄存器的值需要在代码段中由指令性语句赋值。例如:ASSUME CS:CSEG,DS:DSEG,SS:SSEG,ES:EDSEG说明CSEG段是
20、代码段,DSEG段是数据段,SSEG段是堆栈段,EDSEG段是附加数据段。,38,【例题4-2】测试内存TAB单元内的数为奇数还是偶数,如是奇数则BX置成0FFFFH;如是偶数BX置成0。,39,DSEGSEGMENT;默认定位类型PARA,默认组合类型NONETAB DB?DSEG ENDS SSEGSEGMENT STACK;默认定位类型PARA,组合类型为STACK DW256 DUP(0)SSEG ENDS CSEG SEGMENT;默认定位类型PARA,默认组合类型NONEASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART:MOV AX,DSEG MOV DS,A
21、X;给DS段寄存器赋值 MOV AX,SSEG MOV SS,AX;给SS段寄存器赋值 MOV AL,TABTEST AL,01H;测试BX中最低位的逻辑值JZ EVEN1;ZF=1,AL为偶数转移至EVEN处执行MOV BX,0FFFFH;AL为奇数,设置奇数标志JMP CONEVEN1:MOV BX,0;设置偶数标志,40,CON:MOV AH,4CHINT21H CSEG ENDS;代码段结束 END START,41,4.2.2 数据定义伪指令,数据定义伪指令也称为变量定义伪指令,或存储单元分配伪指令。它用来定义变量、确定变量的类型、给变量赋初值、为变量分配存储空间等。格式:变量名 伪
22、操作助记符 操作数1,操作数2DATA SEGMENTSTRDB STRINGNUMDW 0AAH,23HLAB0DQ 01A4578HDATA ENDS,42,数据变量有5种定义命令,如下:DB:定义变量为字节类型,其后的每个操作数都占一个字节。DW:定义变量为字类型,其后的每个操作数都占两个字节。DD:定义变量为双字类型,其后的每个操作数都占二个字,即四个字节。DQ:定义变量为四个字类型,其后的每个操作数都占四个字,即八个字节。DT:定义变量为十个字节,其后的每个操作数都占十个字节。,43,例如:VARDB 67H,4FH,7AH;定义VAR为字节类型变量,3个字节类型的操作数顺序存储在以
23、VAR为首地址的连续内存单元中,每个操作数占一个内存单元。注意:使用变量时,变量的类型必须与指令的要求相符。例如:MOV AL,VAR;AL=67H,44,DELAY DW 98A3H,17D9H;定义DELAY为字类型变量,2个字类型的操作数顺序存储在以DELAY为首地址的连续内存单元中,每个操作数占2个内存单元。例如:MOV BX,DELAY+2;BX=17D9H,45,NUMDD 0AAH,3EF6AC23H;定义NUM为双字类型变量,2个双字类型的操作数顺序存储在以NUM为首地址的连续内存单元中,每个操作数占4个内存单元。,46,从NUM中取一个字,应使用如下方法:例如:MOV SI,
24、OFFSET NUMMOV CX,SI下列用法错:MOV CX,NUM;指令错误,47,LAB0 DQ 01A4578H;定义LAB0为4字类型变量,操作数存储在以LAB0为首地址的连续8个内存单元中。LAB1 DT 3958235434H;定义LAB1为10个字节类型变量,操作数存储在以LAB1为首地址的连续10个内存单元中。注意:多字节数据在内存中存放时遵守“低位存于低地址中,高位存于高地址中”的原则。,48,【例题4-3】数据段中变量的内存分配。DATASEGMENT STRDB STRING NUMDW 0AAH,23H LAB0DQ 01A4578HENDS,49,数据定义伪指令中的
25、操作数可以是数值型常量、字符串常量,也可以是常量表达式,还可以是问号?,问号表示预留相应数量的存储单元,但不存入数据。例如:DATA1DW 16*9,55*3DATA2 DB?,?变量DATA2有2个字节类型的操作数,为每个操作数预留2个存储单元,不进行初始化。,50,如果操作数很多而且相同,可以使用重复数据操作符DUP定义变量。例如:DATA3 DB 6 DUP(AAH)DATA4DB 3 DUP(?,55H,?)变量DATA3有6个操作数,初始化为AAH;变量DATA4有3组操作数,每组为3个,共9个字节类型的操作数。,51,4.2.3符号定义伪指令,符号定义伪指令也称为赋值伪指令。在程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 接口 技术
链接地址:https://www.31ppt.com/p-4519336.html