四章汇编语言程序设计.ppt
《四章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《四章汇编语言程序设计.ppt(98页珍藏版)》请在三一办公上搜索。
1、第四章 汇编语言程序设计,第四章 汇编语言程序设计,在了解和熟悉了86系列指令系统的基础上,本章将介绍宏汇编语言程序的结构,伪指令,以及程序设计的一般过程和各种基本程序结构,然后介绍了系统功能调用,最后给出大量的编程实例。,4.1 汇编语言语句,语句是汇编语言源程序的基本组成单位。一个汇编语言源程序中有3种基本语句:指令语句、伪指令语句和宏指令语句。前两种是最常见、最基本的语句。指令语句和伪指令语句不仅在程序中的功能不同,而且实现其功能的方法和时间也是不同的。1、指令语句 指令语句就是计算机中指令系统的各条指令,每条指令语句在汇编时都产生一个供CPU执行的机器目标代码。计算机中每条指令语句表示
2、一种基本功能,这些基本功能是在程序运行期间由计算机硬件来实现的。一条指令语句由四个字段组成,其一般格式如下:标号:指令助记符操作数;注释,一、汇编语言语句种类及其格式,2、伪指令语句 伪指令语句指示汇编程序在汇编源程序时完成某些工作,比如完成数据定义、分配存储区、指示程序结束等。伪指令属于汇编控制命令,它所指示的操作是由汇编程序在汇编源程序时完成的,在汇编时,它不产生目标代码,在将源程序汇编成目标程序后,它就不复存在了。由上可知,伪指令语句与指令语句的主要区别是:伪指令语句经汇编后不产生机器目标代码,而指令语句经汇编后将产生相应的机器目标代码;伪指令语句所指示的操作是在程序汇编时完成的,而指令
3、语句的操作必须在程序运行时才能完成。一条伪指令语句也由四个字段组成,其一般格式如下:符号名伪指令符操作数;注释,4.1 汇编语言语句,一、汇编语言语句种类及其格式,(1)符号名 符号名在伪指令语句中是一个可选项,符号名后面没有冒号,符号名可以是常量名、变量名、过程名等。(2)伪指令符伪指令符指定汇编程序要完成的具体操作,它是伪指令语句的核心部分,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,定义过程伪指令PROC等等。(3)操作数 伪指令中的操作数可以是常数、字符串、变量、表达式,其个数由具体的伪指令决定,各个操作数之间用“,”分隔。(4)注释 伪指令语句的注释也是可选项,需要
4、时必须以“;”开始。,4.1 汇编语言语句,一、汇编语言语句种类及其格式,3、标识符 指令语句中的标号和伪指令语句中的符号名统称为标识符。它们由若干字符组成,标识符的组成规则如下:(1)一个标识符由1-3个字符组成。(2)组成标识符的字符可以是字母(A-Z或a-z)、数字(0-9)、专用字符(“?”、“”、“”、“$”、“下划线_”)。(3)除数字外,上述其余字符均可作为标识符的首字符,“”只能作为标识符的首字符。(4)不能使用属于系统的专用保留字。,4.1 汇编语言语句,一、汇编语言语句种类及其格式,二、汇编语言数据与运算符,4.1 汇编语言语句,1、常量常量是没有任何属性的纯数值,它的值在
5、汇编期间已能完全确定,且在程序运行中也不会发生变化。常量分为数值常量、字符串常量和符号常量,它主要用于指令语句中的立即数或伪指令语句中给变量赋初值等。1)数值常量数值常量分为整数和实数。例如:11100011B,45693,0FF2AH,356703Q都是正确的整数形式,又如:543.567,45.23,1.2E2,45.4E9都是正确的实数形式。2)字符串常量字符串常量是用单引号括起来的一个字符或多个字符。字符串常量以单引号中各字符的ASCII码形式存储在内存中,如H,在内存中就是41H,12就是31H,32H。使用时可在单引号内直接写字符序列,如12AB,也可写字符的ASCII码,ASCI
6、I码之间用逗号分隔(此时不需要用单引号),如31H,32H,41H,42H表示字符串12AB。3)符号常量符号常量是指用EQU伪指令或赋值语句“=”定义过的符号名,可作操作数项或在表达式中使用。,4.1 汇编语言语句,二、汇编语言数据与运算符,2、变量 在汇编语言中,变量是一个数据存储单元的名称,即数据存放地址的符号表示。它代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以改变。为方便访问变量,在程序中通过变量名来使用变量。(1)变量的定义 变量通常在数据段或附加段中使用数据定义伪指令来定义,定义变量就是给数据分配存储单元,有时为存储单元赋予一个变量名,并可同时为这些存储单元预置初值
7、。数据定义伪指令的格式为:变量名 DB(DW、DD、DQ、DT)表达式1,表达式2,,4.1 汇编语言语句,二、汇编语言数据与运算符,其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址;DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。表达式1,表达式2是给变量或指定的存储单元赋予初值,它们有以下几种形式:(a)数值表达式(b)字符串表达式(c)?表达式(d)地址表达式(只适用于DW和DD这两种数据定义伪指令)(e)带DUP的表达式(2)变量的属性 由于存储器是分段使用的,因而源程序定义的变量具有3个属性:(a)段属性(SEG)(b)偏移属性(OFFSET)
8、(c)类型属性(TYPE),二、汇编语言数据与运算符,4.1 汇编语言语句,(3)变量的使用 定义后的变量,在程序中的引用有两种情况:(a)在指令语句中,采用存储器操作数的几种寻址方式,除寄存器间接寻址方式不使用变量名外,其余各种寻址方式均可使用变量名。例如,某数据段已定义一变量ARRAY:ARRAY DW 5000H,4000H(b)在数据定义伪指令DW和DD中,操作数字段可直接引用已定义过的变量名。如:A DB 50H,40H B DW A C DD B,4.1 汇编语言语句,二、汇编语言数据与运算符,3、标号 标号是一条指令语句的符号地址,在汇编源程序中,只有在需要转向一条指令语句时,才
9、为该指令语句设置标号,以便在控制转移指令中直接引用这个标号。标号一般在代码段中定义和引用。由于标号代表了指令的符号地址,所以标号也有3个属性:(a)段属性(SEG)。标号的段属性是指标号定义所在段的段首地址。(b)偏移属性(OFFSET)。标号的偏移属性是指标号所在段的段首地址到该标号的字节距离。(c)类型属性(TYPE)。标号的类型属性表示了它的转移特性,即该标号是作为段内还是段间转移(或调用)指令的目标地址。标号的类型属性有2种:NEAR类型和FAR类型。,4.1 汇编语言语句,二、汇编语言数据与运算符,4、表达式和运算符汇编语言的指令语句和伪指令语句中,表达式是操作数项的常见形式,表达式
10、是由常量、变量、标号用运算符连接而成有意义的式子。表达式分为数值表达式和地址表达式,任一表达式的值只计算一次,表达式的计算是在源程序汇编过程中进行的,而不是在程序运行中进行的,汇编程序将表达式计算后得到一个数值或一个地址。在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算符、数值回送运算符、属性运算符和字节分离运算符。,4.1 汇编语言语句,二、汇编语言数据与运算符,(1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它只有大小而没有属性。(2)地址表达式 地址表达式是由常量、变量、标号
11、、寄存器(BX、BP、SI、DI)内容(用寄存器名加方括号表示)和运算符组成的有意义的式子。单个的变量、标号、寄存器的内容是地址表达式的特例。地址表达式中可以使用算术运算符中的“+”、“-”运算符、关系运算符、属性运算符、数值返回运算符和分离运算符。在地址表达式中,常用的形式是:变量常量。,4.1 汇编语言语句,二、汇编语言数据与运算符,(a)算术运算符:+,-,*,/,MOD,SHL,SHR。(b)逻辑运算符:AND,OR,XOR,NOT。(c)关系运算符:EQ,NE,LT,LE,GT,GE。当关系成立时,结果为0FFFFH,当关系不成立时,结果为0。(d)数值回送运算符:SEG,OFFSE
12、T,TYPE,SIZE,LENGTH。,4.1 汇编语言语句,二、汇编语言数据与运算符,OFFSET/SEG 变量/标号功能:回送变量或标号的偏址/段址TYPE 变量/标号/常数 DB DW DD DF DQ DT NEAR FAR 常数 1 2 4 6 8 10-1-2 0LENGTH 变量功能:回送由DUP定义的变量的单元数,其它情况回送1SIZE 变量功能:LENGTH*TYPE,(3)表达式运算符,(5)属性运算符:PTR,段操作符,THIS,SHORT。类型 PTR 表达式 MOV WORD PTR BX,5段操作符 MOV ES:BX,ALSHORT 标号 JMP SHORT NE
13、XTTHIS 类型 TA EQU THIS BYTE TD DW 1234H NEXT EQU THIS FAR MOV AX,2(6)分离运算符:LOW,HIGH。HIGH和LOW CONS EQU 1234H MOV AH,HIGH CONS MOV AL,LOW CONS,4.1 汇编语言语句,二、汇编语言数据与运算符,4.2 伪指令,1 数据定义伪指令2 符号定义伪指令3 段定义伪指令SEGMENT/ENDS4 假定伪指令ASSUME5 定位伪指令ORG与地址计数器($)6 过程定义伪指令PROC/ENDP7 源程序开始和结束伪指令,常用的数据定义伪指令有DB,DW,DD,DQ,DT。
14、格式:变量名 数据定义伪指令 表达式,功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。,例:DATA_BYTE DB 10,4,10H,?DATA_WORD DW 100,100H,-5,?,1 数据定义伪指令,4.2 伪指令,例:ARRAY DB HELLO DB AB DW AB,例:PAR1 DW 100,200 PAR2 DW 300,400ADDR_TABLE DW PAR1,PAR2VAR DB 100 DUP(?)DB 2 DUP(0,2 DUP(1,2),3),1 数据定义伪指令,4.2 伪指令,OPER1 DB?,?OPER2 DW?,?MOV OPER1,
15、0;字节指令 MOV OPER2,0;字指令OPER1 DB 1,2OPER2 DW 1234H,5678H MOV AX,OPER1+1 MOV AL,OPER2 类型不匹配 MOV AX,WORD PTR OPER1+1 MOV AL,BYTE PTR OPER2,(AX)=3402H(AL)=34H,1 数据定义伪指令,4.2 伪指令,4.2 伪指令,1)等价伪指令EQU2)等号伪指令=3)定义符号名伪指令LABEL,2 符号定义伪指令,1)等价伪指令EQU格式:符号名 EQ 表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名,但它不申请存储单元。用途:用符号表示常量、数值表达
16、式,即定义符号常量。使用符号常量可使程序简单明了,增强程序的可读性和通用性。EQU与属性运算符TR或THIS联合使用,可以给变量或标号定义新的类型属性并重新命名,但保持其段偏移地址属性不变。利用EQU可以用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。,2 符号定义伪指令等价伪指令EQU,例如:ALPHA EQU 9BETA EQU ALPHA+18BB EQU BP+8,4.2 伪指令,格式:符号名=表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名,并能对所定义的符号多次重复定义,且以最后一次定义的值为准。【例】定义等价
17、符号名。COST=20M=MOVLOST=LOST+10;30LOSTM=ADD;M=ADD,2 符号定义伪指令 等号伪指令=,4.2 伪指令,格式:变量名或标号 LABEL 类型功能:定义与原有变量类型不同的新变量或为指令语句定义有指定类型的标号。通常与数据定义伪指令连用,其功能类似语句“变量名或标号 EQU THIS 类型”。【例】定义新类型的变量。DDBUFLABEL DWORDBUFDB 200 DUP(0)A LABEL FARB:LEADX,BUF,4.2 伪指令,2 符号定义伪指令定义符号名伪指令LABEL,编制一个80X86汇编语言源程序,段是基础,这有两方面含义:一是必须按段
18、来构造程序,二是在程序执行时,要凭借四个段寄存器对各个段的存储单元进行访问。格式:段名 SEGMENT 定位类型 组合类型 类别 段体 段名 ENDS功能:定义一个逻辑段,指定段的名字和范围,段在内存中的起始位置、段与段之间的连接关系。说明:段名由用户指定,开始与结束的段名须一致。SEGMENT/ENDS伪指令把程序分成若干逻辑段。删节号为段体,段体内为指令和伪指令序列。段的长度不超过64KB。SEGMENT后面的参数是可选 项。,4.2 伪指令,3 段定义伪指令SEGMENT/END,假定伪指令主要用于指示汇编程序哪些段是当前段以及这些段与段寄存器之间的对应关系。格式:ASSUME 段寄存器
19、:段名,段寄存器:段名功能:该伪指令告诉汇编程序在汇编时,段寄存器CS、DS、SS和ES应具有的符号段基址,以便汇编指令时确定段和建立错误信息。但是段寄存器实际值(CS除外)还要由传送指令在执行程序时赋值。该伪指令一般出现在代码段中。【例】用ASSUME伪指令建立代码段、堆栈段与CS和SS的对应关系。DATA1SEGMENTADB 1,2,3DATA1ENDSSTACKSEGMENT STACKDB200 DUP(0)STACKENDSDATA2SGEMENTBDB 123ABCDATA2ENDS,4 假定伪指令ASSUME,4.2 伪指令,DATA3SEGMENTCDB?,?,?DATA3E
20、NDSCODESEGMENTASSUMEDS:DATA1,ES:DATA2,CS:CODE,SS:STACKSTART:MOVAX,DATA1MOVDS,AX;DATA1DSMOVAX,DATA3MOVES,AX;DATA3ESQ1:MOVAL,AQ2:MOVC,ALASSUMEDS:DATA2;建立DS与 B段的对应关系,MOVAX,DATA2MOVDS,AX MOVAL,BMOVC,ALCODEENDS ENDSTART,4.2 伪指令,4 假定伪指令ASSUME,5 定位伪指令ORG与地址计数器($),4.2 伪指令,汇编程序在汇编源程序时,每遇到一新段,就为该段设置一个初值为0的汇编地
21、址计数器,汇编程序使用汇编地址计数器保存正在汇编的数据或指令的目标代码在当前段内的偏移地址。当前地址计数器的值可用符号$表示,用户可在程序中直接使用$,表示引用当前汇编地址计数器的值。例如:ARRAY DW 4000H,5000H,6000HCOUNT EQU($-ARRAY)/2 汇编地址计数器的值可以用定位伪指令ORG设置。,格式:ORG 数值表达式功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为0-65535之间的非负整数。该伪指令把以下语句定义的内存数据或程序,从表达式指定的起点(偏移地址)开始连续存放,直至遇到新的ORG指令。【例】给汇编地址计数器赋值。DATASEGME
22、NT ORG10;置值为10VAR1DW 100H,200HORG+5;置的值为14+5,即为19VAR2DB 1,2,+1,+2NEQU-VAR2;()=23DATAENDS,5 定位伪指令ORG与地址计数器($),4.2 伪指令,在程序设计中,常把具有某种功能的程序段设计成一个过程。80X86宏汇编语言用于过程定义的伪指令的格式为:过程名 PROC NEAR 或FAR;过程体 过程名 ENDP 其中过程名是过程入口地址的符号表示,它由程序员指定,且开始处和结束处的过程名一致。过程名同标号一样,具有三种属性:段属性、偏移属性和类型属性,类型属性可指定为NEAR或FAR两种。默认时系统约定是N
23、EAR。过程体为过程内的指令和伪指令序列。定义过程是为实现子程序调用而设的,调用格式为:CALL过程名 过程由RET指令返回。,6 过程定义伪指令PROC/ENDP,4.2 伪指令,(1)源程序开始伪指令 在源程序开始处可以用NAME或TITLE为模块取名字。NAME伪指令 格式:NAME 模块名 汇编程序将以给出的“模块名”作为模块的名字。TITLE伪指令 如果程序中没有NAME伪指令,则也可使用TITLE伪指令。格式:TITLE text TITLE伪指令可指定每一页上打印的标题。同时,若程序中没有NAME伪指令,则汇编程序将用text 中的前6个字符作为模块名。text最多可有60个字符
24、。若程序中既无NAME又无TITLE伪指令,则将用源程序名作为模块名。所以NAME及TITLE伪指令并不是必要的,但一般常使用TITLE,以便在列表文件中能打印出标题来。,7 源程序开始和结束伪指令,4.2 伪指令,(2)源程序结束伪指令格式:END 地址表达式 功能:该语句为源程序的最后一个语句,用以标志整个程序的结束,即告诉汇编程序汇编工作到此结束。其中,地址表达式为可选项,若选用地址表达式,则表示此程序是主程序,它可以单独执行,其地址表达式为该程序的启动地址,即程序开始运行的第一条指令的地址,例如,“ENDSTART”,此START是第一条指令的标号;若不选用表达式,则说明此程序为一子程
25、序,不能单独运行,只能被其它程序调用。,7 源程序开始和结束伪指令,4.2 伪指令,4.3 汇编语言程序的结构,一个汇编源程序是分段的,由若干个段形成一个源程序。其中,必不可少的是代码段和堆栈段,堆栈段也可以不用显示定义,可以直接使用隐式堆栈段,如果程序中需要使用数据存储区,还要定义数据段,必要时还要定义附加段。一般情况下,对于不太复杂的程序只需要三个段(即数据段、堆栈段和代码段)就可以了,而对于复杂的程序,除了使用上述三个段以外还可以使用多个段,甚至可以使用多个程序模块。汇编语言源程序结构通常有两种,它们的区别在于代码段中某些部分的编写稍有不同。具体地说,就是用户程序运行结束后,返回DOS的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计

链接地址:https://www.31ppt.com/p-5387367.html