微机原理——汇编语言程序设计_第1页
微机原理——汇编语言程序设计_第2页
微机原理——汇编语言程序设计_第3页
微机原理——汇编语言程序设计_第4页
微机原理——汇编语言程序设计_第5页
已阅读5页,还剩284页未读 继续免费阅读

下载本文档

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

文档简介

1、微机原理微机原理-汇编语言程序设计(汇编语言程序设计(1 1)汇编语言程序设计基础知识(汇编语言程序设计基础知识(1 1)本次课学习内容本次课学习内容 汇编语言的基本知识和特点。汇编语言的基本知识和特点。 汇编语言的程序结构、段定义以及语句的格式。汇编语言的程序结构、段定义以及语句的格式。 汇编语言常用伪指令的使用方法。汇编语言常用伪指令的使用方法。本次课学习目标本次课学习目标 能正确区分汇编语言和汇编程序的概念能正确区分汇编语言和汇编程序的概念 能用图表示汇编程序的建立及汇编过程能用图表示汇编程序的建立及汇编过程 了解了解MASMMASM汇编语言程序设计的规范汇编语言程序设计的规范 能正确使

2、用数据定义及存储器分配伪指令(能正确使用数据定义及存储器分配伪指令(DBDB、DWDW、DDDD、DQDQ和和DTDT)、段定义伪指令)、段定义伪指令SEGMENT/ENDSSEGMENT/ENDS、段寻址、段寻址伪指令伪指令ASSUMEASSUME,过程定义伪指令,过程定义伪指令PROC/ENDPPROC/ENDP汇编语言 汇编语言是一种面向汇编语言是一种面向CPUCPU指令系统的程序设计语言,它采用指令指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便

3、。地址,因而易记、易读、易修改,给编程带来很大方便。 用汇编语言编写的程序能够直接利用硬件系统的特性,直接对用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、位、字节、字寄存器、存储单元、I/OI/O端口等进行处理,同时也端口等进行处理,同时也能直接使用能直接使用CPUCPU指令系统和指令系统提供的各种寻址方式编制出指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度高质量的程序,这种程序不但占用内存空间少,而且执行速度快快 。汇编语言和高级语言的比较汇编语言和高级语言的比较语言语言汇编语言汇编语言高级语言高级语言代

4、码效率代码效率高高较低较低源程序可读性源程序可读性较差较差好好对硬件的依附性对硬件的依附性高高低低程序员硬件知识程序员硬件知识高高较低较低应用范围应用范围较广较广广泛广泛汇编程序汇编程序 汇编是把汇编语言程序翻译成机器语言描述的目汇编是把汇编语言程序翻译成机器语言描述的目标程序的过程。标程序的过程。 汇编程序是完成汇编任务的程序汇编程序是完成汇编任务的程序。 基本汇编基本汇编ASMASM(AssemblerAssembler)和宏汇编)和宏汇编MASMMASM(MacrMacroAssembleroAssembler)两种。)两种。 汇编程序以汇编语言源程序文件作为输入,并由汇编程序以汇编语言

5、源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列它产生两种输出文件:目标程序文件和源程序列表文件。表文件。 目标程序文件经连接定位后由计算机执行;目标程序文件经连接定位后由计算机执行; 源程序列表文件将列出源程序、目标程序的源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。机器语言代码及符号表。 汇编语言程序的建立及汇编过程汇编语言程序的建立及汇编过程编辑程序编辑程序汇编程序汇编程序文件文件文件文件连接连接程序程序编辑程序编辑程序汇编程序汇编程序文件文件文件文件库文件库文件EXE文件文件一个简单的汇编程序一个简单的汇编程序在数据段定义首地址为在数据段定义首地址为A

6、A的的1010个字符,将这个字符,将这1010个字符以相反个字符以相反次序传送到附加段首地址为次序传送到附加段首地址为B B的内存单元中。的内存单元中。 ;-;-指令语句:以指令语句:以80868086指令系指令系统的助记符指令为基础构统的助记符指令为基础构成。经汇编后产生相对应成。经汇编后产生相对应的机器代码而构成目标程的机器代码而构成目标程序,供机器执行序,供机器执行 伪指令语句:为汇编程序提供伪指令语句:为汇编程序提供一些必要的控制信息的、由伪一些必要的控制信息的、由伪指令构成的管理性语句,其对指令构成的管理性语句,其对应的伪操作是在汇编过程中完应的伪操作是在汇编过程中完成的,汇编后不产

7、生机器代码。成的,汇编后不产生机器代码。汇编语言的语句格式汇编语言的语句格式 汇编语言源程序中的每个语句可以由汇编语言源程序中的每个语句可以由4 4项组成,项组成,格式如下格式如下 名字项名字项 操作项操作项操作数项操作数项 ;注释项;注释项 AGAIN: MOV AL, SI ;AGAIN: MOV AL, SI ;取加数取加数 A DB ABCDEFGA DB ABCDEFG名字项名字项 源程序中用下列字符表示名字:源程序中用下列字符表示名字: 字母:字母:A AZ Z或或a az z; 数字:数字:0 09 9; 专用字符号:?、专用字符号:?、 、 、$ $; 名字项可以是标号或变量。

8、名字项可以是标号或变量。标号标号 在代码段定义,后面跟冒号,表示处理器指令在主存在代码段定义,后面跟冒号,表示处理器指令在主存中的逻辑地址分支、循环等程序的目的地址中的逻辑地址分支、循环等程序的目的地址 标号有三种属性:段、偏移及类型。标号有三种属性:段、偏移及类型。 段属性:定义标号的段起始地址,在段属性:定义标号的段起始地址,在CSCS寄存器中。寄存器中。 偏移属性:偏移属性:1616位无符号数。位无符号数。 类型属性:用来指出该标号是在本段内引用还是类型属性:用来指出该标号是在本段内引用还是在其他段内引用的。在其他段内引用的。例:例: AGAINAGAIN: MOV AL, SI: MO

9、V AL, SI变量变量 变量在除代码以外的其他段中定义,后面不跟冒号。变量经常变量在除代码以外的其他段中定义,后面不跟冒号。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。在操作数字段出现。它也有段、偏移及类型三种属性。 段属性定义变量的段起始地址,此值必须在一个段寄存器段属性定义变量的段起始地址,此值必须在一个段寄存器中。中。 偏移属性变量的偏移地址是偏移属性变量的偏移地址是1616位无符号数,它代表从段的位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器

10、的变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用值可以用 $ $ 来表示。来表示。 类型属性变量的类型属性定义该变量所保留的字节数。类型属性变量的类型属性定义该变量所保留的字节数。 例:例: A A DB ABCDEFG DB ABCDEFG 操作项可以是指令、伪操作或宏指令的助记符。操作项可以是指令、伪操作或宏指令的助记符。 操作数项由一个或多个表达式组成,多个操作数项之操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。间一般用逗号分开。 注释项用来说明一段程序或一条或几条指令的功能,注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。它是可有可无的。

11、分段结构分段结构 汇编语言源程序的程序基本结构是汇编语言源程序的程序基本结构是段段,一个汇编语言,一个汇编语言源程序由若干个源程序由若干个代码段代码段、数据段数据段、附加段附加段和和堆栈段堆栈段组组成。段之间的顺序可以随意安排,通常数据段在前,成。段之间的顺序可以随意安排,通常数据段在前,代码段在后。任何可执行汇编语言程序代码段在后。任何可执行汇编语言程序至少要有一个至少要有一个代码段代码段,通常还可能有数据段和堆栈段。每个段都有,通常还可能有数据段和堆栈段。每个段都有段首指令段首指令和和段结束指令段结束指令,段的内容介于这两条指令之,段的内容介于这两条指令之间。间。 通常,一个汇编源程序一般

12、应该由通常,一个汇编源程序一般应该由3 3个逻辑段组成,个逻辑段组成,即数据段、堆栈段和代码段。每个逻辑段以即数据段、堆栈段和代码段。每个逻辑段以SEGMENTSEGMENT语句开始,以语句开始,以ENDSENDS语句结束。整个源程序以语句结束。整个源程序以ENDEND语句语句结束。结束。 数据段用来在内存中建立一个适当容量的工作区,数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等操作数据。以存放常数、变量等操作数据。 堆栈段用来在内存中建立一个适当的堆栈区,以堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用。便在中断、子程序调用时使用。 代码段包括了许多以符

13、号表示的指令,其内容就代码段包括了许多以符号表示的指令,其内容就是程序要执行的指令。是程序要执行的指令。 段定义伪操作段定义伪操作SEGMENT/ENDSSEGMENT/ENDS格式如下:格式如下:segment-name SEGMENTsegment-name SEGMENT segment-name ENDS segment-name ENDS其中删节号部分,对于其中删节号部分,对于DSDS、ESES和和SSSS来说,一般是存贮来说,一般是存贮单元的定义、分配等伪操作;对于代码段则是指令单元的定义、分配等伪操作;对于代码段则是指令及伪操作。及伪操作。 ASSUMEASSUME伪操作可用来明

14、确段和段寄存器的关系伪操作可用来明确段和段寄存器的关系 格式:格式:ASSUME ASSUME 段寄存器名段寄存器名: :段名段名, , 段寄存器名:段寄存器名:段名段名, , 其中段寄存器名必须是其中段寄存器名必须是CSCS、DSDS、ESES和和SSSS中的一个,而中的一个,而段名则必须是由段名则必须是由SEGMENTSEGMENT定义的段中的段名。定义的段中的段名。 指令指令 mov blmov bl,xdxd mov xe mov xe,blbl 被汇编为被汇编为 mov blmov bl,byte ptr0000hbyte ptr0000h mov byte ptr es:0000h

15、 mov byte ptr es:0000h,blbl 其中,在变量其中,在变量xexe前增加了段超越前缀前增加了段超越前缀ESES:,这就是:,这就是ASSASSUMEUME的作用,也仅此而已。的作用,也仅此而已。设置段寄存器的初值设置段寄存器的初值 CSCS与与IPIP CSCS与与IPIP的初值不能在程序中显示设置,由系统自动的初值不能在程序中显示设置,由系统自动设置为设置为ENDEND后指定的起始地址。后指定的起始地址。 DSDS和和ESES 设置方法如下:设置方法如下: MOV AXMOV AX,SEG NAME SEG NAME MOV DSMOV DS,AXAX SSSS与与SP

16、SP 在程序中显示设置,类似于在程序中显示设置,类似于DSDS,例如:,例如:MOV AXMOV AX,SSEGSSEGMOV SSMOV SS,AXAXMOV SPMOV SP,ST_TOPST_TOP 若堆栈段定义时给出了参数若堆栈段定义时给出了参数STACKSTACK,则连接器,则连接器LINKLINK自动自动将将SSSS:SPSP指向栈底;指向栈底; 若未定义堆栈段,则由系统指定堆栈,若未定义堆栈段,则由系统指定堆栈,SSSS:SPSP也由系也由系统自动设置。统自动设置。 程序开始和结束操作程序开始和结束操作 开始开始: :在程序的开始可以用在程序的开始可以用NAMENAME或或TIT

17、LETITLE为模块取名字为模块取名字NAME module-nameNAME module-name 汇编程序将给出的汇编程序将给出的module-namemodule-name作为模块的名字。作为模块的名字。 如果没有如果没有NAMENAME伪操作,则也可以使用伪操作,则也可以使用TITLETITLE伪操作,其格式为:伪操作,其格式为:TITLE textTITLE textTITLETITLE伪操作可指定每一页上打印的标题。同时,如果程序中没伪操作可指定每一页上打印的标题。同时,如果程序中没有有NAMENAME伪操作,则汇编程序将用伪操作,则汇编程序将用texttext中的前中的前6 6

18、个字符作为模块名。个字符作为模块名。如果程序中既没有如果程序中既没有NAMENAME伪操作也没有伪操作也没有TITLETITLE伪操作,则将用源文伪操作,则将用源文件名作为模块名。所以件名作为模块名。所以NAMENAME及及TITLETITLE伪操作并不是必要的,但一伪操作并不是必要的,但一般经常使用般经常使用TITLETITLE,以便在列表文件中能打印出标题来。,以便在列表文件中能打印出标题来。结束结束 END labelEND label 其中标号指示程序开始执行的地址。如果多个程序模其中标号指示程序开始执行的地址。如果多个程序模块相连接,则只有主程序要使用标号,其它子程序模块相连接,则只

19、有主程序要使用标号,其它子程序模块则只用块则只用ENDEND而不必指定标号。汇编程序将在遇到而不必指定标号。汇编程序将在遇到ENDEND时结束汇编,而程序将从时结束汇编,而程序将从labellabel处开始执行。处开始执行。过程定义操作过程定义操作 过程名过程名 PROC NEAR/FARPROC NEAR/FAR RET RET过程名过程名 ENDPENDP 过程属性的定义原则:过程属性的定义原则: 调用程序和过程在同一个代码段内则使用调用程序和过程在同一个代码段内则使用NEARNEAR属性属性 调用程序和过程不在同一代码段内则使用调用程序和过程不在同一代码段内则使用FARFAR属性属性微机

20、原理微机原理-汇编语言程序设计(汇编语言程序设计(2 2)伪指令、表达式及运算符伪指令、表达式及运算符主要内容主要内容 伪指令伪指令 数据定义伪指令数据定义伪指令DBDB、DWDW、DDDD、DQDQ、DTDT 符号定义伪指令符号定义伪指令EQUEQU和和= = 对准伪操作对准伪操作EVENEVEN和和ORGORG 程序计数器程序计数器$ $ 标号定义伪指令标号定义伪指令LABELLABEL 汇编语言的表达式和运算符汇编语言的表达式和运算符 算术运算符算术运算符+ +、- -、* *、/ /、M MODOD、SHLSHL、SHRSHR 逻辑运算符逻辑运算符ANDAND、OROR、XORXOR、

21、NOTNOT 关系运算符关系运算符EQEQ、NENE、LTLT、G GT T、LELE、GEGE 分析运算符分析运算符TYPETYPE、LENGTHLENGTH、SIZESIZE、OFFSETOFFSET、SEGSEG 综合运算符综合运算符PTRPTR、段操作符、段操作符、SHORTSHORT、THISTHIS、变量定义伪指令 变量定义伪指令用来为数据分配内存空间,并设置相应内存单元变量定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值的初始值 变量名变量名 变量定义符变量定义符 操作数操作数 ,操作数,操作数 变量名变量名是一个符号地址,表示其后操作数的首地址,多个操是一个符号地址

22、,表示其后操作数的首地址,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。项,给出变量名只是为了按名存取其对应的内存单元。 在数据定义伪操作前面的值是该伪操作的第一个字节的偏移在数据定义伪操作前面的值是该伪操作的第一个字节的偏移地址。此外,它还有一个类型属性用来表示该语句中的任一地址。此外,它还有一个类型属性用来表示该语句中的任一个数据项的长度。汇编程序可以用这种隐含的类型属性来确个数据项的长度。汇编程序可以用这种隐含的类型属性来确定某些指令是字节指令还是字指令。定某些指令是字节指令还

23、是字指令。 主要包括下列几种:主要包括下列几种: DBDB(Define ByteDefine Byte):定义字节,后面的每个操作数占):定义字节,后面的每个操作数占1 1个字节。个字节。 DWDW(Define WordDefine Word):定义字,后面的每个操作数占):定义字,后面的每个操作数占1 1个个字。字。 DDDD(Define DWordDefine DWord):定义双字,后面的每个操作数占):定义双字,后面的每个操作数占2 2个字。个字。 DQDQ(Define QWordDefine QWord):定义四字,后面的每个操作数占):定义四字,后面的每个操作数占4 4个字

24、。个字。 DTDT(Define TbyteDefine Tbyte):定义十字节,后面的每个操作数):定义十字节,后面的每个操作数占占1010个字节。个字节。变量定义符变量定义符操作数操作数 数值表达式;数值表达式; ASCASC码字符串;码字符串; 地址表达式;地址表达式; ?(只保存内存空间,未定义初始值);?(只保存内存空间,未定义初始值); DUP DUP 子句,其格式为:子句,其格式为: 重复次数重复次数 DUP DUP (操作(操作数,数,操作数),操作数),DUPDUP子句可以嵌套。子句可以嵌套。字节量数据(Byte-sizedByte-sized) DBDB定义定义8 8位、

25、字节量变量数据位、字节量变量数据 无符号整数无符号整数0 0255255 补码表示的有符号整数:补码表示的有符号整数:-128-128+127+127 一个字符(一个字符(ASCIIASCII码值)码值) 压缩压缩BCDBCD码:码:0 09999 非压缩非压缩BCDBCD码:码:0 09 9 字符串定义使用字节变量定义字符串定义使用字节变量定义DB字变量数据字变量数据 DWDW定义定义1616位、字量变量数据位、字量变量数据 包含高低两个字节,包含高低两个字节,1616位无符号和有符号整数位无符号和有符号整数 1616位段地址,位段地址,1616位偏移地址位偏移地址 占用占用2 2个连续的字

26、节存储单元个连续的字节存储单元双字量数据(Doubleword-sizedDoubleword-sized) DDDD定义定义3232位、双字量变量数据位、双字量变量数据 “高对高、低对低高对高、低对低”占用占用4 4个连续字节空间个连续字节空间操作数可以是常数,或者是表达操作数可以是常数,或者是表达式(根据该表达式可以求得一个式(根据该表达式可以求得一个常数)。常数)。 DATA1 DB 10,4,10HDATA1 DB 10,4,10H DATA2 DW 100,100H,-5 DATA2 DW 100,100H,-5 DATA3 DD 3 DATA3 DD 3* *20, 0FFFFDH

27、20, 0FFFFDH其存储示意图如右所示其存储示意图如右所示: :DATA10A 1004 410 10HDATA264 1000000100H01FB-5FFDATA33C60000000FD0FFFDHFF0000 操作数也可以是字符串操作数也可以是字符串MESG DB HELLOMESG DB HELLO DB AB DB AB DW AB DW ABMESG43H45E4CL4CLODB AB41A42BDW AB42B41A 操作数操作数? ?可以保留存储空间但可以保留存储空间但不存入数据不存入数据. .ABC DB 0,?,?,?,0ABC DB 0,?,?,?,0DFF DW

28、?,52,?DFF DW ?,52,? 经汇编后存储情况如图所示经汇编后存储情况如图所示. .ABC0000DFF345200 操作数字段还可以使用复制操作符操作数字段还可以使用复制操作符(duplication operator)(duplication operator)来复制某来复制某个个( (某些某些) )操作数操作数. . ARRAY1 DB 2 DUP (0,1,2,?)ARRAY1 DB 2 DUP (0,1,2,?)ARRAY2 DB 100 DUP (?)ARRAY2 DB 100 DUP (?)ARRAY1000102000102ARRAY2100个字节 DUPDUP可以嵌

29、套可以嵌套 ARRAY3 DB 100 DUP ARRAY3 DB 100 DUP (0 0,2 DUP2 DUP(1 1,2 2),),0 0,3 3) ARRAY300重复100次,共700个字节01020102000300010201020003可以用可以用DW DW 或或DDDD把变量或标号把变量或标号的偏移地址(的偏移地址(DWDW)或整个地址)或整个地址(DDDD)存入存储器。用)存入存储器。用DDDD伪操伪操作存入地址时,第一个字为偏作存入地址时,第一个字为偏移地址,第二个字为段地址。移地址,第二个字为段地址。PTAB DW PAR1,PAR2,PAR3PTAB DW PAR1,

30、PAR2,PAR3ITAB DD DATA1, DATA2ITAB DD DATA1, DATA2PTABPAR1的的偏移地址偏移地址PAR2的的偏移地址偏移地址PAR3的的偏移地址偏移地址ITABDATA1的的偏移地址偏移地址DATA1的的段地址段地址DATA2的的偏移地址偏移地址DATA2的的段地址段地址符号定义伪指令符号定义伪指令 基本格式基本格式 符号名符号名 EQU EQU 表达式表达式 符号名符号名 = = 常数表达式常数表达式 功能:给表达式指定一个等价的符号名。功能:给表达式指定一个等价的符号名。 关于符号定义伪指令的说明关于符号定义伪指令的说明 说明:说明: = =后的表达式

31、只能是常数,对于字符或字符串,在后的表达式只能是常数,对于字符或字符串,在汇编时按整数处理。汇编时按整数处理。 EQUEQU后的表达式可以是数值、字符串,甚至可以是后的表达式可以是数值、字符串,甚至可以是寄存器名、指令的助记符等。寄存器名、指令的助记符等。 表达式中如果有变量或标号的表达式,则在该语表达式中如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。句前应该先给出它们的定义。 EQUEQU不能重复定义,而不能重复定义,而“=”=”伪指令可以重复定义,伪指令可以重复定义,其作用域从定义点到重新定义之前。其作用域从定义点到重新定义之前。 实例:实例: CONSTANT EQU256

32、数赋以符号名数赋以符号名DATAEQUHEIGHT+12地址表达式赋以符号名地址表达式赋以符号名ALPHAEQU7这是一组赋值伪操作,把这是一组赋值伪操作,把7-2=5赋以符号名赋以符号名BETA,VAR+5赋以符号名赋以符号名ADDRBETAEQUALPHA-2ADDREQUVAR+BETABEQUBP+8变址引用赋以符号名变址引用赋以符号名BP8EQUDS:BP+8加段前缀的变址引用赋以符号名加段前缀的变址引用赋以符号名P8对准伪操作对准伪操作 EVENEVEN EVENEVEN伪操作使下一个字节地址成为偶数。一个字的地址最伪操作使下一个字节地址成为偶数。一个字的地址最好从偶地址开始,所以

33、对于字数组为保证其从偶地址开始,好从偶地址开始,所以对于字数组为保证其从偶地址开始,可以在它前面用可以在它前面用EVENEVEN伪操作来达到此目的。例如:伪操作来达到此目的。例如:DATA_SEG SEGMENTDATA_SEG SEGMENT A DB 1,2,3 A DB 1,2,3EVEN EVEN WORD_ARRAY DW 100 DUP(?)WORD_ARRAY DW 100 DUP(?) DATA_SEG ENDSDATA_SEG ENDS ORG ORG 表达式表达式 如常数表达式的值为如常数表达式的值为n n,则,则ORGORG伪操作可以使伪操作可以使下一个字节的地址成为常数

34、表达式的值下一个字节的地址成为常数表达式的值n n。其。其中表达式必须是一个可计算得到正整数的,中表达式必须是一个可计算得到正整数的,数值范围在数值范围在0 06553565535的表达式。的表达式。程序计数器程序计数器$ $ 字符字符“$”$”在在80868086宏汇编中具有一种特殊的意义,把它宏汇编中具有一种特殊的意义,把它称为程序计数器。表示位置计数器的当前值,它可以称为程序计数器。表示位置计数器的当前值,它可以在数值表达式中使用。在数值表达式中使用。 在程序中,在程序中,“$”$”出现在表达式里,它的值为程序下一出现在表达式里,它的值为程序下一个所能分配的存储单元的偏移地址。个所能分配

35、的存储单元的偏移地址。 例:例: ARRAY DW 1ARRAY DW 1,2 2,$+4, 3,4,$+4$+4, 3,4,$+4 如汇编时,如汇编时,ARRAYARRAY分配的偏移地址是分配的偏移地址是00740074,则汇编后的,则汇编后的存储区如右图所示。存储区如右图所示。 ARRAY0100740000750200760000777C007800007903007A00007B04007C00007D82007E00007F标号定义伪指令标号定义伪指令LABELLABEL 变量名或标号名变量名或标号名 LABEL LABEL 类型类型 说明:说明: 变量的类型可用变量的类型可用 BY

36、TEBYTE,WORDWORD,DWORDDWORD 标号的类型可用标号的类型可用NEARNEAR和和FARFAR 功能:在某一变量或标号的基础上定义一个新的类功能:在某一变量或标号的基础上定义一个新的类型不同的变量或标号型不同的变量或标号汇编语言的表达式和运算符汇编语言的表达式和运算符 表达式表达式 表达式是常数、寄存器、标号、变量与一表达式是常数、寄存器、标号、变量与一些运算符相组合的序列,可以有数字表达些运算符相组合的序列,可以有数字表达式和地址表达式两种。式和地址表达式两种。 主要包括加(主要包括加(+ +)、减()、乘()、减()、乘(* *)、除()、除(/ /)和求)和求余(余(

37、MODMOD)、左移()、左移(SHLSHL)、右移()、右移(SHRSHR)。其中)。其中MODMOD是指是指除法运算后得到的余数。除法运算后得到的余数。 算术运算符可以用于数字表达式或地址表达式中,但当算术运算符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义它用于地址表达式时,只有当其结果有明确的物理意义时其结果才是有效的。例如两个地址相乘或相除是无意时其结果才是有效的。例如两个地址相乘或相除是无意义的。义的。 在地址表达式中,可以使用在地址表达式中,可以使用+ +或者或者- -,但也必须注意其物,但也必须注意其物理意义。例如把两个不同段的地址相加也

38、是无意义的。理意义。例如把两个不同段的地址相加也是无意义的。经常使用的是地址经常使用的是地址+ +数字量,它是有意义的。例如数字量,它是有意义的。例如SUM+1SUM+1是指是指SUM SUM 字节单元的下一个字节单元的地址。字节单元的下一个字节单元的地址。算术运算符算术运算符 主要包括与(主要包括与(ANDAND)、或()、或(OROR)、异或()、异或(XORXOR)、)、非(非(NOTNOT) 逻辑运算符是按位操作的,它只能用于数字表达逻辑运算符是按位操作的,它只能用于数字表达式中。式中。逻辑运算符逻辑运算符 主要包括主要包括EQEQ(相等时为真)、(相等时为真)、NENE(不相等时为真

39、)、(不相等时为真)、LTLT(小于时为真)、(小于时为真)、GTGT(大于时为真)、(大于时为真)、LELE(小于(小于或等于时为真)、或等于时为真)、GEGE(大于或等于时为真)等(大于或等于时为真)等6 6种。种。 关系运算符的两个操作数必须都不能是数字或是同关系运算符的两个操作数必须都不能是数字或是同一段内的两个存储器地址。一段内的两个存储器地址。 其计算的结果为逻辑值,为真,则为全其计算的结果为逻辑值,为真,则为全1 1,为假,为假,则为全则为全0 0关系运算符关系运算符 也称数据送回(也称数据送回(Value returningValue returning)运算符,包)运算符,包

40、括括TYPETYPE、LENGTHLENGTH、SIZESIZE、OFFSETOFFSET、SEGSEG五种,这五种,这些运算符把一些特征或存储器地址的一部分作为些运算符把一些特征或存储器地址的一部分作为数值回送。数值回送。分析运算符 TYPETYPE 格式:格式:TYPE VariableTYPE Variable或或labellabel 如果是变量,则汇编程序将回送该变量的以字如果是变量,则汇编程序将回送该变量的以字节数表示的类型,节数表示的类型,DBDB为为1 1,DWDW为为2 2,DDDD为为4 4,DQDQ为为8 8,DTDT为为1010。 如果是标号,则汇编程序将回送代表该标号类

41、如果是标号,则汇编程序将回送代表该标号类型的数值:型的数值:NEARNEAR为为1 1,FARFAR为为2 2。 LENGTHLENGTH 格式为:格式为:LENGTH LENGTH 变量变量 对于变量中使用对于变量中使用DUPDUP的情况,汇编程序将回送的情况,汇编程序将回送分配给该变量的单元个数。而对于其他情况分配给该变量的单元个数。而对于其他情况则回送则回送1 1。 SIZESIZE 格式为:格式为:SIZE SIZE 变量变量 其汇编的值为其汇编的值为LENGTH LENGTH 变量变量 * * TYPE TYPE 变变量,即回送直接分配给该变量的总的量,即回送直接分配给该变量的总的字

42、节数。字节数。 OFFSETOFFSET 格式为:格式为:OFFSET OFFSET 变量或标号变量或标号 汇编程序将回送变量或标号的偏移地址值。汇编程序将回送变量或标号的偏移地址值。 SEGSEG 格式为:格式为:SEG SEG 变量或标号变量或标号 汇编程序将回送变量或标号的段地址值。汇编程序将回送变量或标号的段地址值。汇编语言的运算符汇编语言的运算符综合运算符综合运算符 也称属性运算符,主要包括也称属性运算符,主要包括PTRPTR、段操作符、段操作符、SHORSHORT T、THISTHIS、HIGHHIGH和和LOW 6LOW 6种。种。 段操作符:段操作符: 用来表示一个标量、变量或

43、地址表达式的段用来表示一个标量、变量或地址表达式的段属性。例如,用段前缀指定某段的地址操作属性。例如,用段前缀指定某段的地址操作数数MOV AXMOV AX,ESES:BX+SIBX+SI。可见它是用段寄。可见它是用段寄存器地址表达式来表示的。存器地址表达式来表示的。 PTRPTR 格式为:类型格式为:类型 PTR PTR 地址表达式地址表达式 PTRPTR用来建立一个符号地址,但它本身并不分配存储用来建立一个符号地址,但它本身并不分配存储器,只是用来给已分配的存储地址赋予另一种属性,器,只是用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型。使该地址具有另一种类型。 格式中的类型字

44、段表示所赋予的新的类型属性,而格式中的类型字段表示所赋予的新的类型属性,而表达式字段则是被取代类型的符号地址。表达式字段则是被取代类型的符号地址。 如果是变量,类型可取如果是变量,类型可取BYTEBYTE,WORDWORD,DWORDDWORD。 如果是标号,类型可取如果是标号,类型可取NEARNEAR和和FARFAR。 SHORTSHORT 用来修饰用来修饰JMPJMP指令中转向地址的属性,指令中转向地址的属性,指出转向地址是在下一条指令地址指出转向地址是在下一条指令地址1 12727个字节范围之内。个字节范围之内。 THISTHIS 格式为:格式为:THIS THIS 类型类型 与与PTR

45、PTR类似,由它所生成的新的存储器操作数的段类似,由它所生成的新的存储器操作数的段和偏移量部分与目前所能分配的下一个存储单元的和偏移量部分与目前所能分配的下一个存储单元的段和偏移量相同。但类型由段和偏移量相同。但类型由THISTHIS指定指定 如果是变量,类型可取如果是变量,类型可取BYTEBYTE,WORDWORD,DWORDDWORD。 如果是标号,类型可取如果是标号,类型可取NEARNEAR和和FARFAR。微机原理微机原理汇编语言程序设计(汇编语言程序设计(3 3)80X8680X86指令格式及寻址方式指令格式及寻址方式80X8680X86指令系统指令系统 指令的基本格式指令的基本格式

46、 寻址方式寻址方式 指令执行时间指令执行时间 8086/80888086/8088指令系统指令系统 中断及中断及PC DOSPC DOS系统功能调用系统功能调用 8028680286扩充的指令扩充的指令 8038680386扩充的指令扩充的指令 8048680486扩充的指令扩充的指令 Pentium CPUPentium CPU扩充的指令扩充的指令学习指导学习指导 学习每一条指令时学习每一条指令时, ,应从以下几个方面着手应从以下几个方面着手: : 指令的格式指令的格式 指令的功能指令的功能: :该指令能够实现何种操作。通常指令助记符就该指令能够实现何种操作。通常指令助记符就是指令功能的英文

47、单词或其缩写形式是指令功能的英文单词或其缩写形式 指令的寻址方式指令的寻址方式: :该指令中的操作数可以采用何种寻址方式该指令中的操作数可以采用何种寻址方式 该指令对状态标志位的影响该指令对状态标志位的影响 学习指令时学习指令时, ,可多看实例可多看实例, ,并自己编写源程序。并自己编写源程序。指令的基本格式指令的基本格式 格式:操作码格式:操作码 操作数或操作数地址操作数或操作数地址 格式说明:格式说明: 操作码:指示计算机要执行的操作,对每一种操作操作码:指示计算机要执行的操作,对每一种操作指定确定的二进制代码。指定确定的二进制代码。 操作数:指令所需操作数或操作数的地址;操作数操作数:指

48、令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数可以有一个,也可以有两个,一个源操作数(src)(src),一个目的操作数一个目的操作数(dst)(dst)。寻址方式寻址方式 指令中操作数字段实质上是指出操作数存放于何处。指令中操作数字段实质上是指出操作数存放于何处。一般来说,操作数可以跟随在指令操作码之后,称为一般来说,操作数可以跟随在指令操作码之后,称为立即数立即数;操作数也可以存放在;操作数也可以存放在CPUCPU内部的寄存器中,称内部的寄存器中,称为为寄存器操作数寄存器操作数。绝大多数的操作数存放在内存储器。绝大多数的操作数存放在内存储器中,称为中,称为存储器操

49、作数存储器操作数。指令指定操作数的位置,即。指令指定操作数的位置,即给出地址信息,在执行时需要根据这个地址信息找到给出地址信息,在执行时需要根据这个地址信息找到需要的操作数。这种寻找操作数的过程称为寻址,而需要的操作数。这种寻找操作数的过程称为寻址,而寻找操作数的方法称为寻找操作数的方法称为寻址方式寻址方式。寻址方式寻址方式 固定寻址固定寻址 操作数在某个固定的寄存器或固定的操作地址中。操作数在某个固定的寄存器或固定的操作地址中。立即数寻址 指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和16位。 立即数寻址方式用来表示常数,它经常用于给寄存器赋初值,并且只能

50、用于源操作数字段只能用于源操作数字段,不能用于不能用于目的操作数字段目的操作数字段。 实例指令指令操作数操作数 操作数在寄存器中,指令指定寄存器号。操作数在寄存器中,指令指定寄存器号。 对于对于1616位操作数,寄存器可以是位操作数,寄存器可以是AXAX、BXBX、CXCX、DXDX、SISI、DIDI、SPSP和和BPBP等。等。 对于对于8 8位操作数,寄存器可以是位操作数,寄存器可以是ALAL、AHAH、BLBL、BHBH、CLCL、C CH H、DLDL和和DHDH。 这种寻址方式由于操作数就在寄存器中,不需要访问存这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而

51、可以取得较高的运算速度。储器来取得操作数,因而可以取得较高的运算速度。指令指令寄存器号寄存器号寄存器寄存器操作数操作数寄存器寻址方式寄存器寻址方式 在在IBM PCIBM PC机中,把操作数的偏移地址称为机中,把操作数的偏移地址称为有效地址有效地址EAEA 在存储器寻址方式中,操作数是某个内存单元的内容在存储器寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址(值),指令中给出的是内存单元的有效地址EAEA,段地址,段地址通常在隐含的某个段寄存器中。由通常在隐含的某个段寄存器中。由EUEU计算出计算出EAEA,再由,再由BIUBIU根据根据PA=16PA=16* *

52、段首址段首址+EA+EA计算出实际地址,执行总线周期访计算出实际地址,执行总线周期访问存储器,取得操作数,最后再执行指令规定的基本操作。问存储器,取得操作数,最后再执行指令规定的基本操作。 一条指令中,只能有一个存储器操作数(源操作数或目的一条指令中,只能有一个存储器操作数(源操作数或目的操作数)操作数)存储器寻址存储器寻址 根据根据EAEA的计算方法,存储器寻址可分为以下几类:的计算方法,存储器寻址可分为以下几类: 直接寻址方式直接寻址方式 寄存器间接寻址寄存器间接寻址 寄存器相对寻址寄存器相对寻址 基址变址寻址基址变址寻址 相对基址加变址寻址相对基址加变址寻址 操作数的偏移地址操作数的偏移

53、地址( (有效地址有效地址EA)EA)直接用指令加以指定直接用指令加以指定( (有有直接地址值和标号两种形式直接地址值和标号两种形式) ),它存放在代码段中指定操,它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。得操作数。 段地址隐含的由段地址隐含的由DS DS 指定,也可以指定,也可以ESES指定,但需在指令中指定,但需在指令中指明。最后存储器地址为:指明。最后存储器地址为:DS:DS:偏移地址偏移地址 或或

54、ES:ES:偏移地址。偏移地址。 图示图示 实例实例指令指令EA存储器存储器操作数操作数+段寄存器段寄存器段地址段地址*16直接寻址方式直接寻址方式 寄存器间接寻址方式的操作数形式为:寄存器间接寻址方式的操作数形式为:regreg 操作数的有效地址包含在基址寄存器操作数的有效地址包含在基址寄存器BXBX,基址指针,基址指针BPBP或一个或一个变址寄存器(变址寄存器(SISI或或DIDI)中。寄存器间接寻址要用方括号括起)中。寄存器间接寻址要用方括号括起来,以便与寄存器操作数相区别。来,以便与寄存器操作数相区别。 PA=16PA=16* *(DS)+ (DS)+ 或或PA=16PA=16* *(

55、SS)+BP (SS)+BP 也可以使用段前缀来取得其它段当中的操作数也可以使用段前缀来取得其它段当中的操作数 实例实例(BX)(BX)(SI)(SI)(DI)(DI)指令指令寄存器寄存器存储器存储器操作数操作数+段寄存器段寄存器段地址段地址寄存器寄存器EA*16寄存器间接寻址寄存器间接寻址 操作数在存储器内,指令中寄存器内容与指令指定的位移操作数在存储器内,指令中寄存器内容与指令指定的位移量(量(DISPDISP)之和作为操作数所在单元的有效地址。)之和作为操作数所在单元的有效地址。 有效地址的计算方法有效地址的计算方法 (BXBX) DISP8DISP8 PA=16 PA=16* *(DS

56、DS) + + (SISI) + + (DIDI) DISP16DISP16 PA=16PA=16* *(SSSS)+ +(BPBP)+ +指指令令寄存器寄存器存储器存储器操作数操作数+段寄存器段寄存器段地址段地址寄存器寄存器地址地址位移量位移量+EA*16寄存器相对寻址寄存器相对寻址实例:实例: 设执行前:设执行前: (AXAX)=0040H=0040H,(,(BXBX)=0030H=0030H,(,(DSDS)=2000H=2000H,(20036H20036H)=0050H =0050H 执行指执行指令:令:ADD 6BXADD 6BX,AXAX执行后:执行后:(AXAX)=?=?,(B

57、XBX)=?=?,(DSDS)=?=?,(20036H20036H)=?=?图示图示 执行:(执行:(20036H20036H)+ +(AXAX) (20036H20036H) 执行后:(执行后:(AXAX)=0040H=0040H,(,(BXBX)=0030H=0030H,(,(DSDS)= =2000H2000H,(,(20036H20036H)=0090H=0090H。段寄存器段寄存器指指令令寄存器寄存器20036H0050H+2000HBX0030H6+0036*16基址变址寻址方式是在指令中给出一个基址寄存器名和一个变址寄存基址变址寻址方式是在指令中给出一个基址寄存器名和一个变址寄存

58、器名,两者内容之和作为操作数的有效地址。器名,两者内容之和作为操作数的有效地址。基址寄存器为基址寄存器为BXBX或或BPBP,变址寄存器为,变址寄存器为SISI或或DIDI,但指令中不能同时出现,但指令中不能同时出现两个基址寄存器或两个变址寄存器。两个基址寄存器或两个变址寄存器。如果基址寄存器为如果基址寄存器为BXBX,则段寄存器使用,则段寄存器使用DSDS;如果基址寄存器用;如果基址寄存器用BPBP,则,则段寄存器用段寄存器用SSSS。有效地址的计算方法有效地址的计算方法 PA=16PA=16* *(DSDS)+ +(BXBX)+ + PA=16 PA=16* *(SSSS)+ +(BPBP

59、)+ +指指令令基址寄存器基址寄存器存储器存储器操作数操作数+段寄存器段寄存器段地址段地址基址寄存器基址寄存器基地址基地址变址寄存器变址寄存器+EA变址寄存器变址寄存器变址值变址值*16基址变址寻址基址变址寻址 如果如果 (DS)=2100H, (BX)= 0158H, (DI)=10A5H, EA=11(DS)=2100H, (BX)= 0158H, (DI)=10A5H, EA=11FDH, FDH, 则执行指令则执行指令 MOV ALMOV AL,BXDIBXDI 有效地址:有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH EA=(BX)+(DI)=0158H+10

60、A5H=11FDH 物理地址:物理地址:(DS) (DS) * * 16 + 16 + 有效地址有效地址 =21000H+11FDH=221FDH=21000H+11FDH=221FDH 执行结果:将执行结果:将221FDH221FDH单元内容送入寄存器单元内容送入寄存器ALAL中。中。基址变址寻址实例基址变址寻址实例 操作数在存储器内,指令将基址寄存器(操作数在存储器内,指令将基址寄存器(BXBX或或BPBP)与变址寄存器)与变址寄存器(SISI或或DIDI)的内容之和再加上位移量()的内容之和再加上位移量(8 8位或位或1616位),得到操作位),得到操作数所在单元的有效地址。数所在单元的

温馨提示

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

评论

0/150

提交评论