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

下载本文档

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

文档简介

1、微机原理-汇编语言程序设计(1),汇编语言程序设计基础知识(1),微机原理 汇编语言程序设计基础知识1(2),本次课学习内容,汇编语言的基本知识和特点。 汇编语言的程序结构、段定义以及语句的格式。 汇编语言常用伪指令的使用方法。,微机原理 汇编语言程序设计基础知识1(3),本次课学习目标,能正确区分汇编语言和汇编程序的概念 能用图表示汇编程序的建立及汇编过程 了解MASM汇编语言程序设计的规范 能正确使用数据定义及存储器分配伪指令(DB、DW、DD、DQ和DT)、段定义伪指令SEGMENT/ENDS、段寻址伪指令ASSUME,过程定义伪指令PROC/ENDP,微机原理 汇编语言程序设计基础知识

2、1(4),汇编语言,汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。 用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O端口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快 。,微机原理 汇编语言程序设计基础知识1(5),汇编语言和高级语言的比较,微机原理 汇编语言程序设计基础知识1(6),汇编程序,汇编是把汇编语言程序翻译成机器语言描述的目标程序的过程。 汇

3、编程序是完成汇编任务的程序。 基本汇编ASM(Assembler)和宏汇编MASM(MacroAssembler)两种。 汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。 目标程序文件经连接定位后由计算机执行; 源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。,微机原理 汇编语言程序设计基础知识1(7),汇编语言程序的建立及汇编过程,编辑程序,汇编程序,PROGR1.ASM 文件,PROGR1.OBJ 文件,连接程序,编辑程序,汇编程序,PROGR2.ASM 文件,PROGR2.OBJ 文件,库文件,EXE文件,ASM,ASM,LINK,

4、微机原理 汇编语言程序设计基础知识1(8),一个简单的汇编程序,在数据段定义首地址为A的10个字符,将这10个字符以相反次序传送到附加段首地址为B的内存单元中。,LEA SI,A LEA DI,B ADD DI,9 MOV CX,10 MOVE:CLD LODSB STD STOSB LOOP MOVE MOV AH,4CH INT 21H START ENDP CSEG ENDS ;- END START,TITLE TRANS DSEG SEGMENT A DB 1234567890 DSEG ENDS ;- ESEG SEGMENT B DB 10 DUP(?) ESEG ENDS ;-

5、 CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,ES:ESEG START PROC FAR MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX ;-,指令语句:以8086指令系统的助记符指令为基础构成。经汇编后产生相对应的机器代码而构成目标程序,供机器执行,伪指令语句:为汇编程序提供一些必要的控制信息的、由伪指令构成的管理性语句,其对应的伪操作是在汇编过程中完成的,汇编后不产生机器代码。,微机原理 汇编语言程序设计基础知识1(9),汇编语言的语句格式,汇编语言源程序中的每个语句可以由4项组成,格式如下 名字项 操作项操作数项 ;注

6、释项 AGAIN: MOV AL, SI ;取加数 A DB ABCDEFG,微机原理 汇编语言程序设计基础知识1(10),名字项,源程序中用下列字符表示名字: 字母:AZ或az; 数字:09; 专用字符号:?、 、$; 名字项可以是标号或变量。,微机原理 汇编语言程序设计基础知识1(11),标号,在代码段定义,后面跟冒号,表示处理器指令在主存中的逻辑地址分支、循环等程序的目的地址 标号有三种属性:段、偏移及类型。 段属性:定义标号的段起始地址,在CS寄存器中。 偏移属性:16位无符号数。 类型属性:用来指出该标号是在本段内引用还是在其他段内引用的。 例: AGAIN: MOV AL, SI,

7、微机原理 汇编语言程序设计基础知识1(12),变量,变量在除代码以外的其他段中定义,后面不跟冒号。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。 段属性定义变量的段起始地址,此值必须在一个段寄存器中。 偏移属性变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用 $ 来表示。 类型属性变量的类型属性定义该变量所保留的字节数。 例: A DB ABCDEFG,微机原理 汇编语言程序设计基础知识1(13),操作项可以是指令、伪操作或宏指令的助记符。 操作数项由一个或多个表达式组成,多个

8、操作数项之间一般用逗号分开。 注释项用来说明一段程序或一条或几条指令的功能,它是可有可无的。,微机原理 汇编语言程序设计基础知识1(14),分段结构,汇编语言源程序的程序基本结构是段,一个汇编语言源程序由若干个代码段、数据段、附加段和堆栈段组成。段之间的顺序可以随意安排,通常数据段在前,代码段在后。任何可执行汇编语言程序至少要有一个代码段,通常还可能有数据段和堆栈段。每个段都有段首指令和段结束指令,段的内容介于这两条指令之间。,微机原理 汇编语言程序设计基础知识1(15),通常,一个汇编源程序一般应该由3个逻辑段组成,即数据段、堆栈段和代码段。每个逻辑段以SEGMENT语句开始,以ENDS语句

9、结束。整个源程序以END语句结束。 数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等操作数据。 堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用。 代码段包括了许多以符号表示的指令,其内容就是程序要执行的指令。,微机原理 汇编语言程序设计基础知识1(16),段定义伪操作SEGMENT/ENDS 格式如下: segment-name SEGMENT segment-name ENDS 其中删节号部分,对于DS、ES和SS来说,一般是存贮单元的定义、分配等伪操作;对于代码段则是指令及伪操作。,微机原理 汇编语言程序设计基础知识1(17),ASSUME伪操作可用来明

10、确段和段寄存器的关系 格式: ASSUME 段寄存器名:段名, 段寄存器名:段名, 其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由SEGMENT定义的段中的段名。,微机原理 汇编语言程序设计基础知识1(18),指令 mov bl,xd mov xe,bl 被汇编为 mov bl,byte ptr0000h mov byte ptr es:0000h,bl 其中,在变量xe前增加了段超越前缀ES:,这就是ASSUME的作用,也仅此而已。,微机原理 汇编语言程序设计基础知识1(19),设置段寄存器的初值,CS与IP CS与IP的初值不能在程序中显示设置,由系统自动设置为END

11、后指定的起始地址。 DS和ES 设置方法如下: MOV AX,SEG NAME MOV DS,AX,微机原理 汇编语言程序设计基础知识1(20),SS与SP 在程序中显示设置,类似于DS,例如: MOV AX,SSEG MOV SS,AX MOV SP,ST_TOP 若堆栈段定义时给出了参数STACK,则连接器LINK自动将SS:SP指向栈底; 若未定义堆栈段,则由系统指定堆栈,SS:SP也由系统自动设置。,微机原理 汇编语言程序设计基础知识1(21),程序开始和结束操作,开始:在程序的开始可以用NAME或TITLE为模块取名字 NAME module-name 汇编程序将给出的module-

12、name作为模块的名字。 如果没有NAME伪操作,则也可以使用TITLE伪操作,其格式为: TITLE text TITLE伪操作可指定每一页上打印的标题。同时,如果程序中没有NAME伪操作,则汇编程序将用text中的前6个字符作为模块名。如果程序中既没有NAME伪操作也没有TITLE伪操作,则将用源文件名作为模块名。所以NAME及TITLE伪操作并不是必要的,但一般经常使用TITLE,以便在列表文件中能打印出标题来。,微机原理 汇编语言程序设计基础知识1(22),结束,END label 其中标号指示程序开始执行的地址。如果多个程序模块相连接,则只有主程序要使用标号,其它子程序模块则只用EN

13、D而不必指定标号。汇编程序将在遇到END时结束汇编,而程序将从label处开始执行。,微机原理 汇编语言程序设计基础知识1(23),过程定义操作,过程名 PROC NEAR/FAR RET 过程名 ENDP 过程属性的定义原则: 调用程序和过程在同一个代码段内则使用NEAR属性 调用程序和过程不在同一代码段内则使用FAR属性,微机原理-汇编语言程序设计(2),伪指令、表达式及运算符,微机原理 汇编语言程序设计基础知识1(25),主要内容,伪指令 数据定义伪指令DB、DW、DD、DQ、DT 符号定义伪指令EQU和= 对准伪操作EVEN和ORG 程序计数器$ 标号定义伪指令LABEL,汇编语言的表

14、达式和运算符 算术运算符+、-、*、/、MOD、SHL、SHR 逻辑运算符AND、OR、XOR、NOT 关系运算符EQ、NE、LT、GT、LE、GE 分析运算符TYPE、LENGTH、SIZE、OFFSET、SEG 综合运算符PTR、段操作符、SHORT、THIS、,微机原理 汇编语言程序设计基础知识1(26),变量定义伪指令,变量定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值 变量名 变量定义符 操作数,操作数 变量名是一个符号地址,表示其后操作数的首地址,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。 在数据定义伪操

15、作前面的值是该伪操作的第一个字节的偏移地址。此外,它还有一个类型属性用来表示该语句中的任一个数据项的长度。汇编程序可以用这种隐含的类型属性来确定某些指令是字节指令还是字指令。,微机原理 汇编语言程序设计基础知识1(27),主要包括下列几种: DB(Define Byte):定义字节,后面的每个操作数占1个字节。 DW(Define Word):定义字,后面的每个操作数占1个字。 DD(Define DWord):定义双字,后面的每个操作数占2个字。 DQ(Define QWord):定义四字,后面的每个操作数占4个字。 DT(Define Tbyte):定义十字节,后面的每个操作数占10个字节

16、。,变量定义符,微机原理 汇编语言程序设计基础知识1(28),操作数,数值表达式; ASC码字符串; 地址表达式; ?(只保存内存空间,未定义初始值); DUP 子句,其格式为: 重复次数 DUP (操作数,操作数),DUP子句可以嵌套。,微机原理 汇编语言程序设计基础知识1(29),字节量数据(Byte-sized),DB定义8位、字节量变量数据 无符号整数0255 补码表示的有符号整数:-128+127 一个字符(ASCII码值) 压缩BCD码:099 非压缩BCD码:09 ,字符串定义使用字节变量定义DB,微机原理 汇编语言程序设计基础知识1(30),字变量数据,DW定义16位、字量变量

17、数据 包含高低两个字节,16位无符号和有符号整数 16位段地址,16位偏移地址 占用2个连续的字节存储单元,微机原理 汇编语言程序设计基础知识1(31),双字量数据(Doubleword-sized),DD定义32位、双字量变量数据 “高对高、低对低”占用4个连续字节空间,微机原理 汇编语言程序设计基础知识1(32),操作数可以是常数,或者是表达式(根据该表达式可以求得一个常数)。 DATA1 DB 10,4,10H DATA2 DW 100,100H,-5 DATA3 DD 3*20, 0FFFFDH 其存储示意图如右所示:,微机原理 汇编语言程序设计基础知识1(33),操作数也可以是字符串

18、 MESG DB HELLO DB AB DW AB,微机原理 汇编语言程序设计基础知识1(34),操作数?可以保留存储空间但不存入数据. ABC DB 0,?,?,?,0 DFF DW ?,52,? 经汇编后存储情况如图所示.,微机原理 汇编语言程序设计基础知识1(35),操作数字段还可以使用复制操作符(duplication operator)来复制某个(某些)操作数. ARRAY1 DB 2 DUP (0,1,2,?) ARRAY2 DB 100 DUP (?),微机原理 汇编语言程序设计基础知识1(36),DUP可以嵌套 ARRAY3 DB 100 DUP (0,2 DUP(1,2),

19、0,3),微机原理 汇编语言程序设计基础知识1(37),可以用DW 或DD把变量或标号的偏移地址(DW)或整个地址(DD)存入存储器。用DD伪操作存入地址时,第一个字为偏移地址,第二个字为段地址。 PTAB DW PAR1,PAR2,PAR3 ITAB DD DATA1, DATA2,微机原理 汇编语言程序设计基础知识1(38),符号定义伪指令,基本格式 符号名 EQU 表达式 符号名 = 常数表达式 功能:给表达式指定一个等价的符号名。,微机原理 汇编语言程序设计基础知识1(39),关于符号定义伪指令的说明,说明: =后的表达式只能是常数,对于字符或字符串,在汇编时按整数处理。 EQU后的表

20、达式可以是数值、字符串,甚至可以是寄存器名、指令的助记符等。 表达式中如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。 EQU不能重复定义,而“=”伪指令可以重复定义,其作用域从定义点到重新定义之前。,微机原理 汇编语言程序设计基础知识1(40),实例:,微机原理 汇编语言程序设计基础知识1(41),对准伪操作,EVEN EVEN伪操作使下一个字节地址成为偶数。一个字的地址最好从偶地址开始,所以对于字数组为保证其从偶地址开始,可以在它前面用EVEN伪操作来达到此目的。例如: DATA_SEG SEGMENT A DB 1,2,3 EVEN WORD_ARRAY DW 100 DUP

21、(?) DATA_SEG ENDS,微机原理 汇编语言程序设计基础知识1(42),ORG 表达式 如常数表达式的值为n,则ORG伪操作可以使下一个字节的地址成为常数表达式的值n。其中表达式必须是一个可计算得到正整数的,数值范围在065535的表达式。,微机原理 汇编语言程序设计基础知识1(43),程序计数器$,字符“$”在8086宏汇编中具有一种特殊的意义,把它称为程序计数器。表示位置计数器的当前值,它可以在数值表达式中使用。 在程序中,“$”出现在表达式里,它的值为程序下一个所能分配的存储单元的偏移地址。,微机原理 汇编语言程序设计基础知识1(44),例: ARRAY DW 1,2,$+4,

22、 3,4,$+4 如汇编时,ARRAY分配的偏移地址是0074,则汇编后的存储区如右图所示。,微机原理 汇编语言程序设计基础知识1(45),标号定义伪指令LABEL,变量名或标号名 LABEL 类型 说明: 变量的类型可用 BYTE,WORD,DWORD 标号的类型可用NEAR和FAR 功能:在某一变量或标号的基础上定义一个新的类型不同的变量或标号,微机原理 汇编语言程序设计基础知识1(46),汇编语言的表达式和运算符,表达式 表达式是常数、寄存器、标号、变量与一些运算符相组合的序列,可以有数字表达式和地址表达式两种。,微机原理 汇编语言程序设计基础知识1(47),主要包括加(+)、减()、乘

23、(*)、除(/)和求余(MOD)、左移(SHL)、右移(SHR)。其中MOD是指除法运算后得到的余数。 算术运算符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义时其结果才是有效的。例如两个地址相乘或相除是无意义的。 在地址表达式中,可以使用+或者-,但也必须注意其物理意义。例如把两个不同段的地址相加也是无意义的。经常使用的是地址+数字量,它是有意义的。例如SUM+1是指SUM 字节单元的下一个字节单元的地址。,算术运算符,微机原理 汇编语言程序设计基础知识1(48),主要包括与(AND)、或(OR)、异或(XOR)、非(NOT) 逻辑运算符是按位操作的,

24、它只能用于数字表达式中。,逻辑运算符,微机原理 汇编语言程序设计基础知识1(49),主要包括EQ(相等时为真)、NE(不相等时为真)、LT(小于时为真)、GT(大于时为真)、LE(小于或等于时为真)、GE(大于或等于时为真)等6种。 关系运算符的两个操作数必须都不能是数字或是同一段内的两个存储器地址。 其计算的结果为逻辑值,为真,则为全1,为假,则为全0,关系运算符,微机原理 汇编语言程序设计基础知识1(50),也称数据送回(Value returning)运算符,包括TYPE、LENGTH、SIZE、OFFSET、SEG五种,这些运算符把一些特征或存储器地址的一部分作为数值回送。,分析运算符

25、,微机原理 汇编语言程序设计基础知识1(51),TYPE 格式:TYPE Variable或label 如果是变量,则汇编程序将回送该变量的以字节数表示的类型,DB为1,DW为2,DD为4,DQ为8,DT为10。 如果是标号,则汇编程序将回送代表该标号类型的数值:NEAR为1,FAR为2。,微机原理 汇编语言程序设计基础知识1(52),LENGTH 格式为:LENGTH 变量 对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元个数。而对于其他情况则回送1。,微机原理 汇编语言程序设计基础知识1(53),SIZE 格式为:SIZE 变量 其汇编的值为LENGTH 变量 * TYPE 变

26、量,即回送直接分配给该变量的总的字节数。,微机原理 汇编语言程序设计基础知识1(54),OFFSET 格式为:OFFSET 变量或标号 汇编程序将回送变量或标号的偏移地址值。 SEG 格式为:SEG 变量或标号 汇编程序将回送变量或标号的段地址值。,微机原理 汇编语言程序设计基础知识1(55),汇编语言的运算符综合运算符,也称属性运算符,主要包括PTR、段操作符、SHORT、THIS、HIGH和LOW 6种。 段操作符: 用来表示一个标量、变量或地址表达式的段属性。例如,用段前缀指定某段的地址操作数MOV AX,ES:BX+SI。可见它是用段寄存器地址表达式来表示的。,微机原理 汇编语言程序设

27、计基础知识1(56),PTR 格式为:类型 PTR 地址表达式 PTR用来建立一个符号地址,但它本身并不分配存储器,只是用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型。 格式中的类型字段表示所赋予的新的类型属性,而表达式字段则是被取代类型的符号地址。 如果是变量,类型可取BYTE,WORD,DWORD。 如果是标号,类型可取NEAR和FAR。,微机原理 汇编语言程序设计基础知识1(57),SHORT 用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址127个字节范围之内。,微机原理 汇编语言程序设计基础知识1(58),THIS 格式为:THIS 类型 与PTR类似

28、,由它所生成的新的存储器操作数的段和偏移量部分与目前所能分配的下一个存储单元的段和偏移量相同。但类型由THIS指定 如果是变量,类型可取BYTE,WORD,DWORD。 如果是标号,类型可取NEAR和FAR。,微机原理汇编语言程序设计(3),80X86指令格式及寻址方式,微机原理 汇编语言程序设计基础知识1(60),80X86指令系统,指令的基本格式 寻址方式 指令执行时间 8086/8088指令系统 中断及PC DOS系统功能调用 80286扩充的指令 80386扩充的指令 80486扩充的指令 Pentium CPU扩充的指令,微机原理 汇编语言程序设计基础知识1(61),学习指导,学习每

29、一条指令时,应从以下几个方面着手: 指令的格式 指令的功能:该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式 指令的寻址方式:该指令中的操作数可以采用何种寻址方式 该指令对状态标志位的影响 学习指令时,可多看实例,并自己编写源程序。,微机原理 汇编语言程序设计基础知识1(62),指令的基本格式,格式:操作码 操作数或操作数地址 格式说明: 操作码:指示计算机要执行的操作,对每一种操作指定确定的二进制代码。 操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数(src),一个目的操作数(dst)。,微机原理 汇编语言程序设计基础知识1(63)

30、,寻址方式,指令中操作数字段实质上是指出操作数存放于何处。一般来说,操作数可以跟随在指令操作码之后,称为立即数;操作数也可以存放在CPU内部的寄存器中,称为寄存器操作数。绝大多数的操作数存放在内存储器中,称为存储器操作数。指令指定操作数的位置,即给出地址信息,在执行时需要根据这个地址信息找到需要的操作数。这种寻找操作数的过程称为寻址,而寻找操作数的方法称为寻址方式。,微机原理 汇编语言程序设计基础知识1(64),寻址方式,固定寻址 操作数在某个固定的寄存器或固定的操作地址中。,微机原理 汇编语言程序设计基础知识1(65),立即数寻址,指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代

31、码段中。立即数有8位和16位。 立即数寻址方式用来表示常数,它经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段。 实例,指令,操作数,微机原理 汇编语言程序设计基础知识1(66),操作数在寄存器中,指令指定寄存器号。 对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等。 对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。 这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运算速度。,寄存器寻址方式,微机原理 汇编语言程序设计基础知识1(67),在IBM PC机中,把操作数的偏移地址称

32、为有效地址EA 在存储器寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址EA,段地址通常在隐含的某个段寄存器中。由EU计算出EA,再由BIU根据PA=16*段首址+EA计算出实际地址,执行总线周期访问存储器,取得操作数,最后再执行指令规定的基本操作。 一条指令中,只能有一个存储器操作数(源操作数或目的操作数),存储器寻址,微机原理 汇编语言程序设计基础知识1(68),根据EA的计算方法,存储器寻址可分为以下几类: 直接寻址方式 寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址加变址寻址,微机原理 汇编语言程序设计基础知识1(69),操作数的偏移地址(有效地址

33、EA)直接用指令加以指定(有直接地址值和标号两种形式),它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。 段地址隐含的由DS 指定,也可以ES指定,但需在指令中指明。最后存储器地址为:DS:偏移地址 或 ES:偏移地址。 图示 实例,指令,EA,存储器,操作数,+,段寄存器,段地址,*16,直接寻址方式,微机原理 汇编语言程序设计基础知识1(70),寄存器间接寻址方式的操作数形式为:reg 操作数的有效地址包含在基址寄存器BX,基址指针BP或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来,以便与

34、寄存器操作数相区别。 PA=16*(DS)+ 或PA=16*(SS)+BP 也可以使用段前缀来取得其它段当中的操作数 实例,(BX) (SI) (DI),指令,寄存器,存储器,操作数,+,段寄存器,段地址,寄存器,EA,*16,寄存器间接寻址,微机原理 汇编语言程序设计基础知识1(71),操作数在存储器内,指令中寄存器内容与指令指定的位移量(DISP)之和作为操作数所在单元的有效地址。 有效地址的计算方法 (BX) DISP8 PA=16*(DS) + (SI) + (DI) DISP16 PA=16*(SS)+(BP)+,DISP8 DISP16,指 令,寄存器,存储器,操作数,+,段寄存器

35、,段地址,寄存器,地址,位移量,+,EA,*16,寄存器相对寻址,微机原理 汇编语言程序设计基础知识1(72),实例: 设执行前: (AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H 执行指令:ADD 6BX,AX 执行后:(AX)=?,(BX)=?,(DS)=?,(20036H)=? 图示 执行:(20036H)+(AX) (20036H) 执行后:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0090H。,微机原理 汇编语言程序设计基础知识1(73),基址变址寻址方式是在指令中给出一个基址寄存器名和一个变址寄

36、存器名,两者内容之和作为操作数的有效地址。 基址寄存器为BX或BP,变址寄存器为SI或DI,但指令中不能同时出现两个基址寄存器或两个变址寄存器。 如果基址寄存器为BX,则段寄存器使用DS;如果基址寄存器用BP,则段寄存器用SS。 有效地址的计算方法 PA=16*(DS)+(BX)+ PA=16*(SS)+(BP)+,(SI)(DI),指 令,基址寄存器,存储器,操作数,+,段寄存器,段地址,基址寄存器,基地址,变址寄存器,+,EA,(SI)(DI),变址寄存器,变址值,*16,基址变址寻址,微机原理 汇编语言程序设计基础知识1(74),如果 (DS)=2100H, (BX)= 0158H, (

37、DI)=10A5H, EA=11FDH, 则执行指令 MOV AL,BXDI 有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH 物理地址:(DS) * 16 + 有效地址 =21000H+11FDH=221FDH 执行结果:将221FDH单元内容送入寄存器AL中。,基址变址寻址实例,微机原理 汇编语言程序设计基础知识1(75),操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容之和再加上位移量(8位或16位),得到操作数所在单元的有效地址。 PA=16*(DS)+(BX)+ + PA=16*(SS)+(BP)+ +,DISP8 DISP16,

38、(SI)(DI),(SI)(DI),DISP8 DISP16,指 令,基址寄存器,存储器,操作数,+,段寄存器,段地址,基地址,变址寄存器,+,EA,位移量,*16,变址值,相对的基址变址寻址,微机原理 汇编语言程序设计基础知识1(76),已知:(DS)=3000H,(BX)=2000H,(SI)=1000H,MK=0250H 指令: MOV AX,MKBXSI 或 MOV AX,MKBX+SI 或 MOV AX,MK+BX+SI EA:MK+(BX)+(SI)=0250H+2000H+0100H =3250H PA:(DS)*16 +EA=30000H+3250H=33250H 执行结果:将

39、33250H单元内容送AL,33251H内容送AH。,相对的基址变址实例,微机原理 汇编语言程序设计基础知识1(77),当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。 段超越前缀形式为:段寄存器名: 例如: MOV AX,ES:BP ;段地址在ES MOV AX,CS:BX SI ;段地址在CS,段超越,微机原理 汇编语言程序设计基础知识1(78),段地址的基本约定和允许超越的情况,微机原理 汇编语言程序设计基础知识1(79),在汇编后,指令中的变量名有具体的偏移地址所取代。 在寄存器相

40、对寻址与相对基址变址方式中,位移量disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。 在Microsoft宏汇编MASM中,内存操作数可以采用多种书写形式。 操作数中使用变量的地方也可以用下列形式: 变量名整数表达式。 计算出的有效地址以16位表示,若超过0FFFFH,CPU将忽略所有溢出。 记忆8086内存操作数形式的简易方法如下: BX SI disp BP DI 每列选择0项或一项,构成至少一项,即可得到有效的内存操作数形式。,对8086内存寻址方式的注解,微机原理-汇编语言程序设计(4),传送类指令,微机原理 汇编语言程序设计基础知识1(81),80X86的指令

41、系统,数据传送类指令 算术运算类指令 逻辑运算与移位类指令 串操作类指令 控制转移类指令 处理器控制类指令,微机原理 汇编语言程序设计基础知识1(82),通用传送指令 传送指令MOV 堆栈操作指令PUSH和POP 数据交换指令XCHG 标志传送指令 读取标志指令LAHF 设置标志指令SAHF 标志寄存器的入栈和出栈指令PUSHF/POPF,地址目标传送指令 有效地址送寄存器 (Load Effective Address)LEA 指针送寄存器和DS的指令LDS 指针送寄存器和ES的指令LES 累加器传送指令 输入输出指令IN/OUT 查表指令XLAT,微机原理 汇编语言程序设计基础知识1(83

42、),传送指令MOV 格式:MOV dst, src 功能:将src代表的源操作数的内容送到dst 代表的目标操作数去。源操作数的内容不变。 对标志位的影响:无,微机原理 汇编语言程序设计基础知识1(84),MOV的6种格式 从通用寄存器到通用寄存器 MOV reg1,reg2 立即数传送到通用寄存器 MOV reg ,data 通用寄存器和存储单元之间 MOV mem ,reg MOV reg,mem 立即数传送到存储单元 MOV mem, data 段寄存器与通用寄存器间的数据传送 MOV seg,reg MOV reg, seg 段寄存器与存储单元间的数据传送 MOV seg,mem MO

43、V mem, seg,微机原理 汇编语言程序设计基础知识1(85),关于MOV指令的说明: 不允许两个操作数同时为段寄存器。 不允许两个操作数同时为存储器操作数。 立即数不能传送到段寄存器中。 目的操作数不允许使用CS段寄存器和指令指针寄存器IP。 立即数不能作为目的操作数。 dst与src必须类型匹配,即同时是字节或字类型。 寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。 若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。 有时MASM不能确定内存操作数的类型,需要用BYTE PTR或WORD PTR明确指出是字节或字类型。只要其中一个操作数的类型确定即可。

44、,微机原理 汇编语言程序设计基础知识1(86),例:错误的MOV 指令如下所示: MOV AX,BL MOV DS,1000H MOV BX ,SI MOV ES,CS MOV CS,AX MOV BX, 23 MOV 1000H, AL 例:设A和B是已定义的字节变量,以下是一些错误和正确的指令。 MOV AX,B MOV A,0 MOV BX, WORD PTR A,微机原理 汇编语言程序设计基础知识1(87),堆栈操作指令 堆栈存储器的一段区域,按“先进后出”的原则进行存出操作。8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单

45、元。 作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。,微机原理-汇编语言程序设计(5),算术运算类指令,微机原理 汇编语言程序设计基础知识1(89),算术运算类指令,加法指令 ADD ADC INC AAA DAA 减法指令 SUB SBB DEC NEG CMP AAS DAS,乘法类指令 MUL IMUL 除法类指令 DIV IDIV AAD CBW CWD,微机原理 汇编语言程序设计基础知识1(90),CF表示无符号溢出,即运算结果超出了无符号数的表示范围。 OF表示带符号溢出,即运算结果超出了带符号数的表示范围。,深入认识CF和OF,微机原理 汇编语言程

46、序设计基础知识1(91),CF和OF判断方法 加法 CF的判断方法 从十进制角度来看,若无符号加的结果大于2n(n为位数),则CF=1,否则CF=0。 从二进制角度来看,若结果最高位向前有进位,则CF=1,否则CF=0。 OF的判断方法 从十进制角度来看,若带符号加的结果不在范围n 1n-11(n为位数)内,则OF=1,否则OF=0。 从二进制角度来看,若两个数同号,而相加结果与之异号,说明溢出,则OF=1,否则OF=0。,微机原理 汇编语言程序设计基础知识1(92),减法 CF的判断方法 从十进制角度来看,若无符号减数大于被减数,则CF=1,否则CF=0。 从二进制角度来看,若结果最高位向前

47、有借位,则CF=1,否则CF=0。 OF的判断方法 从十进制角度来看,若带符号减的结果不在范围 n-1n-11(n为位数)内,则OF=1,否则OF=0。 从二进制角度来看,若两个数异号,而结果与被减数符号相反,说明溢出,则OF=1,否则OF=0。,微机原理 汇编语言程序设计基础知识1(93),加法指令,ADD ADC INC AAA DAA,微机原理 汇编语言程序设计基础知识1(94),不带进位加法 ADD dst, src ;(dst)(src)+(dst) 带进位加法 ADC dst,src ;(dst)(src)+(dst)+CF 说明: 这两条指令对OF,SF,CF,ZF,PF和AF均

48、产生影响。 ADC指令中加的CF为该指令执行前的CF值。 ADC指令常用于两个多倍精度字的非最低字或非最低字节的相加。 除src为立即数的情况外,必须有一个操作数在寄存器中。,微机原理 汇编语言程序设计基础知识1(95),加1指令 INC 格式: INC opr 功能: 将opr中的内容加1。 说明: INC指令只影响OF,SF,ZF和PF,对CF没有影响。 opr可为寄存器或存储器操作数,当其为存储器操作数时,须指明操作数类型。 该指令常用于在循环结构程序中用来修改指针或循环计数。,微机原理 汇编语言程序设计基础知识1(96),计算机中十进制数的表示:BCD(Binary Coded Dec

49、imal)码 BCD是一种用二进制编码的十进制数,又称二十进制数。它是用4位二进制数表示一个十进制数码的,由于这4位二进制数的权为8421,所以BCD码又称为8421码。 在IBM PC机里,表示十进制数的BCD码可以用组合的BCD码和非组合的BCD码两种格式表示。 组合的BCD码(packed BCD format)用4位二进制数表示一个十进制数位,整个十进制数形式为一个顺序的以4位为一组的数串。例如:9502d应表示为:1001 0101 0000 0010。 非组合的BCD码(unpacked BCD format)则以8位为一组表示一个十进制数位,8位中的低4位表示8421的BCD码,

50、而高4位则没有意义。例如:9502d应表示为:uuuu1001 uuuu0101 uuuu0000 uuuu0010。,微机原理 汇编语言程序设计基础知识1(97),组合十进制加法调整指令 语句格式:DAA 功能:如果AL寄存器中低4位大于9或辅助进位(AF)=1,则(AL)=(AL)+6且(AF)=1;如果(AL)=0A0H或(CF)=1,则(AL)=(AL)+60H且(CF)=1。同时,SF、ZF、PF均有影响。 说明: 该指令应跟在ADD或ADC指令之后,且加法指令的运算结果必须放在AL中。,微机原理 汇编语言程序设计基础知识1(98),例: 组合BCD码的加法运算。 MOV AL,68

51、H;(AL)=68H,表示压缩BCD码68 MOV BL,28H;(BL)=28H,表示压缩BCD码28 ADD AL,BL;二进制加法:(AL)=68H+28H=90H DAA ;十进制调整:(AL)=96H ;实现压缩BCD码加法:68+28=96,微机原理 汇编语言程序设计基础知识1(99),加法的非压缩BCD码调整指令AAA 语句格式:AAA 功能:如果AL的低4位大于9或(AF)=1,则: (AL)=(AL)+6 (AH)=(AH)+1 (AF)=(CF)=1 否则:(CF)=(AF)=0 AL高4位清零。 说明:该指令应跟在ADD或ADC指令之后,且加法指令的运算结果必须放在AL中

52、。,微机原理 汇编语言程序设计基础知识1(100),减法运算指令 不带借位减法指令SUB 带借位减指令 SBB 减1指令DEC 求补指令NEG 比较指令 CMP 组合十进制数减法调整指令DAS 非组合十进制数减法调整指令AAS,微机原理 汇编语言程序设计基础知识1(101),不带借位减法指令SUB 语句格式:SUB dst,src 功能:目的操作数减源操作数,结果存于目的地址,源地址内容不变。即(dst)(src)(dst) 对标志位的影响:影响AF,CF,OF,PF,ZF,SF,微机原理 汇编语言程序设计基础知识1(102),带借位减指令 SBB 语句格式:SBB dst ,src 功能:目

53、的操作数减源操作数再减低位借位CF,结果送目的地址。即(dst)(src)CF ( dst),微机原理 汇编语言程序设计基础知识1(103),减1指令DEC 语句格式:DEC opr 功能:将目的操作数减1,结果送目的地址。即(opr)1(opr)。 说明: DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。 减1指令DEC也一般用于对计数器和地址指针的调整。,微机原理 汇编语言程序设计基础知识1(104),求补指令NEG 语句格式:NEG opr 功能:将操作数按位求反(包括符号位)后末位加1,结果送目的地址。即(opr)(opr) 说明: 只有当操作数为0时CF=0,其它情况

54、则为使得CF=1。 当字节运算时对-128(即80H)求补以及字运算时对-32768( 即8000H)求补的情况下,结果仍为80H或8000H,此时OF=1,其余情况为0。,微机原理 汇编语言程序设计基础知识1(105),比较指令 CMP 语句格式:CMP dst,src 功能:目的操作数减源操作数,但不保存运算结果,只是根据结果影响标志位。即(dst)(src)。 说明:该指令后往往跟着一条条件转移指令,根据比较结果产生不同的程序分支。,微机原理 汇编语言程序设计基础知识1(106),语句格式:DAS 功能: 如果(AF)=1或AL寄存器中低4位大于9,则(AL)=(AL)6且(AF)=1;

55、 如果(AL)=0A0H或(CF)=1,则(AL)=(AL)60H且(CF)=1。 同时SF、ZF、PF均受影响。,微机原理 汇编语言程序设计基础知识1(107),例:压缩BCD码的减法运算。 MOVAL,68H ;(AL)=68H MOVBL,28H ;(BL)=28H SUBAL,BL ;二进制减法:(AL)=68H28H=40H DAS ;十进制调整:(AL)=40H ;实现压缩BCD码减法:6828=40,微机原理 汇编语言程序设计基础知识1(108),减法的非压缩BCD码调整指令AAS 语句格式:AAS 功能: 如果AL的低4位大于9或(AF)=1,则: (AL)=(AL)6 (AH

56、)=(AH)1 (AF)=(CF)=1 否则:(CF)=(AF)=0 AL高4位清零。 其他标志位OF、PF、SF、ZF不确定。,微机原理 汇编语言程序设计基础知识1(109),乘法运算指令 无符号数乘法指令MUL 有符号乘指令IMUL,微机原理 汇编语言程序设计基础知识1(110),无符号数乘法指令MUL src为字节数:AX (AL)* (src) src为字,(DX,AX ) (AX) * (src),微机原理 汇编语言程序设计基础知识1(111),说明: src可用除立即数方式以外的任一种寻址方式。但src应有明确的操作数类型。 乘法指令对除CF和OF以外的状态标志位无定义。 两字节数

57、相乘,若乘积的高字节不为0(即(AH)0),则CF=OF=0,否则,CF=OF=1。 两字数相乘,若乘积的高位字不为0(即(DX)0),则CF=OF=0,否则,CF=OF=1。,微机原理 汇编语言程序设计基础知识1(112),带符号数乘法指令IMUL 语句格式: IMUL src 功能: src为字节数:AX (AL)* (src) , src为字,(DX,AX ) (AX) * (src),微机原理 汇编语言程序设计基础知识1(113),说明: src可用除立即数方式以外的任一种寻址方式。但src应有明确的操作数类型。 乘法指令对除CF和OF以外的状态标志位无定义。 两字节数相乘,若乘积的高

58、字节是低字节的符号扩展,则CF=OF=0,否则,CF=OF=1。 两字数相乘,若乘积的高位字是低位字的符号扩展,则CF=OF=0,否则,CF=OF=1。,微机原理 汇编语言程序设计基础知识1(114),非组合十进制数乘法调整指令AAM 格式:AAM 功能: 将AX中的被除数调整成二进制数,并放在寄存器AL中。该指令执行的操作是: (AL)10*(AH)+(AL) (AH) 0 说明: 该指令对PF,SF,ZF产生影响,对OF,AF和CF无定义。,微机原理 汇编语言程序设计基础知识1(115),无符号数除法指令DIV 格式:DIV src 功能: src为字节数:AL (AX)(src)的商 AH (AX)(src)的余数 src为字:(AX) (DX,AX ) (src) 的商 (AX) (DX,AX ) (src) 余数,微机原理 汇编语言程序设计基础知识1(116),说明: src可用除立即数方式以外的任一种寻址方式。但src应有明确的操作数类型。 乘法指令对所有状态标志位无定义。,微机原理 汇编语言程序设计基础知识1(

温馨提示

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

评论

0/150

提交评论