汇编语言与汇编程序_第1页
汇编语言与汇编程序_第2页
汇编语言与汇编程序_第3页
汇编语言与汇编程序_第4页
汇编语言与汇编程序_第5页
已阅读5页,还剩227页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言与汇编程序,第二章,主讲:王晓影,计算机的指令是由一个或多个字节的二进制数组成的,这种指令称为机器指令。,机器指令: 在计算机中,能够被计算机识别,并能直接加以执行的语句,我们称之为指令。,简单说,指令就是指挥计算机进行某一基本操作的命令。,机器指令也叫做硬指令,不同类型的CPU都有自己特有的、一定数量的基本指令。,机器语言:由指令构成的集合。,由于使用起来不方便,所以不直接使用机器指令,而是使用助记符、符号等组成的符号指令。 用符号指令书写程序的语言称为汇编语言。,汇编语言:,从本质上看,汇编语言是一种符号化的机器语言。它用助记符表示机器指令的操作码,用变量代替操作数的存放地址,在语

2、句前加一个标号,用来代表该指令的存放地址。因此,汇编语言就是一种用符号书写的、其主要操作与机器指令一一对应,并遵循一定语法规则的计算机语言。,例如:,MOV AX,7FH MOV BX,1234H ADD AX,BX,注意: 汇编语言是为了方便用户而设计的一种符号语言,并不能直接被计算机识别,必须将汇编语言程序翻译成机器语言程序(也叫目标程序),才能由计算机所执行。,翻译程序: 把汇编源程序翻译成目标代码的程序。 目标代码: 就是机器语言程序。,把用汇编语言编写的源程序翻译成机器指令(目标程序)的过程叫汇编。 完成汇编任务的程序叫汇编程序,翻译过程的图形表示:,注意: 其它高级语言编写的程序,

3、也必须经过编译成目标代码,再经过连接,生成可执行文件才能执行。,翻译程序又称为: 编译/解释/汇编。,汇编程序: 把汇编源程序翻译成目标代码程序的语言加工程序。,汇编程序的功能: (1)将汇编语言源程序翻译成机器语言程序; (2)根据用户指定自动分配存贮区域(包括程序区、数据区、 暂存区等); (3)自动地把各种进制数转换成二进制数,把字符转换成 ASC码,计算表达式的值等。 (4)自动对源程序进行检查,给出错误信息。,注意:汇编程序不同于汇编语言程序。,汇编程序的分类: ASM 小汇编程序,占有较小的存贮区,但 功能较弱。 MASM 宏汇编程序,需要较大的存贮区, 但功能强大,具有宏汇编能力

4、。,宏汇编能力: 允许用一个宏指令名字代替程序中重复出现的一组语句,在其它的地方,可以用宏指令名字及不同的参数来调用。,使用宏调用的目的: 使程序清晰、简洁,便于阅读修改。,为了MASM.EXE能很好地工作,源程序必须有一定的格式指出: 程序从什么地方开始、什么时候结束、数据放在哪里、数据类型是什么、临时存贮区,这需要一组指令指示MASM工作,这种指令叫做 伪指令。,2.1 符号指令中的表达式 使用符号指令编写程序,除了正确使用助记符和定义符号外,其主要问题是正确地表示操作数的地址,即正确地使用寻址方式。而寻址方式的使用又可归结为地址表达式的使用。,1常量 常量 指那些在将汇编源程序翻译成目标

5、程序期间已经确定数值的量。 常量主要用于: 伪指令语句中给变量赋初值,或者用作机器指令语句中的立即操作数、变址寻址和基址加变址中的位移量。 常量一般可以直接以数值形式出现在汇编语言中,这种常量称数值常量。 对经常引用的数值常量,可以事先定义一个名字,然后在语句中用名字来表示该常量,这种常量称为符号常量。 伪指令EQU和等号“=”可用来实现将数值常量定义成符号常量的功能。,2.1.1 常量和数值表达式,例: A EQU 10 B=100 MOV AX,A ADD AX,B 1) 数字常数 IBM宏汇编中,允许以下几种常数: 二进制常数 以字母B结尾的由若干个“0”和“1”组成的序列 例:0 0

6、1 0 1 1 0 0 B 十进制常数: 由若干个0到9的数字组成的序列,可以以字母D结尾,或省略字母D。 例:1 2 3 4 D或1 2 3 4,十六进制常数: 以字母H结尾,由若干个09的数字或字母AF所组成的序列。为了避免与标识符相混淆,十六进制数必须以数字打头。所以凡以字母AF开始的十六进制数,必须在前面加上0。 例:0AFH,0BDH,456H等 八进制常数: 以字母Q结尾的,由若干个07的数字组成的序列。 例:1 2 3 4 Q等 十进制科学表示法:即十进制浮点表示法 例:1.5E-2,2.5E+2等,十六进制实数 由若干位十六进制数码(09)和(AF)组成,以字母H结尾,第一位必

7、须是09之间的数码,一个十六进制实数的总的数字位数必须是8、16或20,而由字母打头的数前面必须加0,这时数字位数多一位。 例如:356C H,0ABH 主要原因是:可以和标号中或变量名相区别,因为变量名 和标号名不能以数字开头,可以以其它字符 开头。 F6可以是变量名和标号名,而不能作为操作项中常数(十六进制数)。要作为十六进制数,必须写成0F6H。 例如:常数 MOV AL,0BCH;将十六进制数0BC送入AL 变量 MOV AL,BCH;将符号地址为BCH数据段 中的字节单元的内容送入 AL中。,1) 字符串常数 字符串常数 是由包含在同一种单引号“,”内的1至2个以上ASC字符构成的,

8、汇编程序把它们表示成一个字符序列,一个字节对应一个字符,把引号中的字符翻译成它的ASC的值。 例如:A41H,AB4142H。 在可以使用单字节立即数的地方,就可以使用单个字符组成的字符串常数。 在可以使用立即数的地方,就可以使用两个字符组成的字符串常数。 在初始化存储器时才可以使用多于两个字符的字符串常数。 2) 符号常数 符号常数 常数也可以用符号名代替 例如:MOV CX,COUNT,它必须用伪指令EQU定义,2、数值表达式 表达式是常数、寄存器、标号、变量与一些运算符和操作符相结合的序列。 表达式可以分为两类: 数字表达式 它的运算结果是一数值常量,它只有大小没有属 性。 地址表达式

9、它的值一般都是段内偏移地址,因此它具有段、偏 移地址及类型三个属性。 在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后得到一个数值或一个地址。,数字表达式: 下面介绍五类运算和操作符: 1.算术运算符 算术运算符包括: 加(+)、减()、乘(*)、除(/)、 模除(MOD)、右移(SHR)、左移(SHL) 模除(MOD) 表示两整数相除后取余数。 移位运算 表示将二进制常量右移或左移,运算符右边所规定的 次数,所空出的位数均补0。,例如:SHL AL,1 算术(或逻辑)左移次数=m,即m=1,左移1位 算术运算可以用于数字表达式或地址表达式中。 当它用于地址表达式时,只有当其结果有明确

10、的物理意义时,其结果才是有效的。 例如:两个地址相乘或相除是无意义的。 两个不同段地址相加也是无意义的。 在地址表达式中,可以使用+或-,但也必须注意其物理意义。 例如:SUM+1 指SUM字节单元的下一个字节单元的地址 (注意,不是指SUM单元的内容加1) 例如:要求把首地址为AA的字数组的第3个字传送到DX寄存器, 可用如下指令表示:MOV DX,AA+(3-1)*2,2.1.2 变量和地址表达式 变量 是一个数据存储单元的名字,即数据存放地址的符号表示。 它可以用EQU伪指令定义。 由于主存是分段使用的,因而对源程序中所定义的变量体现出以下三个方面的属性: 1) 变量的段地址 即指定义变

11、量所在段的段首址除以10H之商,当需要访问该变量时,该段首址一定要在某一段寄存器中。 2) 变量的偏移地址 是指变量所在段的段首址到该变量定义语句的字节距离。 3) 变量的类型 是指存取该变量中的数据所需要的字节数。,字节类型 (一个数据存储单元占1个字节) DB 字类型 (一个数据存储单元占2个字节) DW 双字类型 (一个数据存储单元占4个字节) DD 4字类型 (一个数据存储单元占8个字节) DQ 10字节类型(一个数据存储单元占10个字节) DT 在程序中,标号名或变量名只能在一处定义,不能在不同的位置用同一标号名或变量名,否则汇编程序会指示出错。 变量的定义 变量一般都在数据段或附加

12、数据段中使用数据定义伪指令DB、DW、DD、DQ、DT来定义。,变量定义格式: 变量名 数据定义伪指令 表达式, 其中表达式可以是以下几种形式: 数值表达式 ; ASC字符串(只有用DB定义变量时,才允 许单字符串长度超过2个字符); 地址表达式(只适用DW和DD两个伪指令),如果该地址表达式为一变量或标号时,用DW定义,则是取偏移地址来初始化变量,若用DD定义,则是取其段地址和偏移地址来初始化变量。,取偏地址初始化变量,取段首址和偏移地址来初始化变量,(4)?(表示所定义的变量无确定的初值),一般用来预留若干字节(字或双字)存储单元,以存放程序的运行结果; (5)重复子句。 格式:n DUP

13、(表达式) 其中:n是重复因子,只能取正整数,它表示定义了n个数据存储单元其类型由它前面的数据定义伪指令确定。 而每个数据存储单元中的初值由DUP后面的圆括号中的表达式给定,如果是问号,则表示无确定的初值。 例1:BUF1 DB 40 DUP( ) 定义了一个40个字符的缓冲区BUF1,其初值均设为空格字符。,例2:BUF2 DB 50 DUP(4 DUP(3),9) BUF2中有50(4+1)=250个字节,初始内容为50个连续的(3,3,3,3,9) n DUP(M DUP(表达式1),表达式2) 这里共有n(m+1)个定义类型的数据,初值由表达式确定。 综合举例: DATA SEGMEN

14、T A DB ABC,0DH,0AH B DW M C EQU 100H D DD A M DB 2 DUP(1),2 DUP(2,B),1,2,3 DATA ENDS,综合举例: DATA SEGMENT A DB ABC,0DH,0AH C EQU 100H M DB 2 DUP(1),2 DUP(2,B),1,2,3 DATA ENDS,定义了以变量A为首址的、大小为5个字节的数据存储区。,定义了以变量M为首址的、大小为9个字节的数据存储区。,标号是某条指令所存放单元的符号地址,也可以是过程名。 过程入口地址的符号表示,即过程的第一条指令的地址。 变量是某操作数据所存放单元的符号地址。

15、标号的定义方式有两种: (1) 用“:”定义,直接写在指令助记符前。 如定义标号YY YY: MOV AL,SI (2) 用PROC和ENDP伪指令定义过程。 标号常常在转移指令或CALL指令的操作数字段出现,用以表示转移地址。,2.1.3 标号,标号也可以用EQU或LABEL伪指令来定义。 标号常常在转移指令或CALL指令的操作数字段出现,用以表示转移地址。 标号是机器指令语句存放地址的符号表示,也可以是过程名,过程名实际上是过程的入口地址的符号表示,即过程第一条机器指令语句的存放地址。 CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DAT

16、A MOVDS,AX 定义该标号所在段的段首址,例: JMP L1 标号的偏移地址是16位无符号数 L1: 例: JMP FAR PTR L2 段间引用 L2: 标号的定义方式为: L1:MOV AL,SI ;定义近标号。 SUB1 PROC FAR;定义过程名SUB1为远标号。 SUB2 PROC ;定义过程名SUB2为近标号。 标号一般只在代码段中定义和引用,由于标号代表了指令的符号地址,因而也有3种属性: 段、偏移和类型。,1) 标号的段属性: 指定义该标号所在段的段首址,此值必须在一个段寄存器中,而标号的段则总是在CS段寄存器中。 2) 偏移属性: 标号的偏移地址是16位无符号数,指它

17、所在段的段首址到该标号定义语句之间的字节数,标号的偏移地址总是在IP寄存器中。 3) 类型属性: 用来指出标号是本段内引用还是在其它段中引用的, 如在段内引用的,则称为NEAR PTR说明。 如在段间引用的,则称为FAR PTR说明。 若没有对标号进行类型说明就假定为NEAR。 例: JMP AA 此标号的属性为NEAR,2.1.4 变量和标号的变更,在编程时往往需要临时改变原定义的变量或标号的类型,PRT算符用来明确指出某个变量、标号或地址表达式的类型属性,或者使它们临时兼有与原定义所不同的类型属性,但仍保持它们原来的段地址和偏移地址属性不变。 其格式: 类型 PTR 地址表达式 例: BY

18、TE PTR W1 临时改变字变量 W1的类型为字节变量。 例: WORD PTR B3 临时改变字节变量 B3的类型为字变量。 例: BYTE PTR BX+5 明确地址表达式BX+5的类型属性为字节。,2.2 符号指令的寻址方式,在8086微处理器中,一条指令通常由操作码加上操作数构成。 指令形式:操作码 操作数1,操作数2;注释 其中,操作码指明执行的动作,操作数指明操作的对象。 由于寄存器数量有限,操作数不可能都放在寄存器中,实际上,操作数既可以放在寄存器中,也可以放在主存贮器中,这样就涉及到操作数的寻址问题。我们将寻址操作数存放地址的方式称为寻址方式。 8086提供6种基本寻址方式。

19、,22.1 寄存器寻址 在这种寻址方式中,指令所指明的寄存器就是操作数的存放地址。 汇编格式:R(R为8或16位寄存器) 功能:寄存器R的内容就是操作数。,表示:指令指明操作数在R中。,例:INC AX 操作数在AX中。 AX 执行前:(AX)=12H 执行:(AX)+1AX。 执行后:(AX)=13H,INC指令,12H,13,例:ADD AX,BX AX为目的操作数地址,BX为源操作数地址。 执行前:(AX)=1234H,(BX)=5620H 执行:(AX)+(BX)AX。 执行后:(AX)=6854H,(BX)=5620H 此例中,目的操作数、源操作数都是用寄存器寻址。,6854H,注意

20、: 采用寄存器寻址方式,指令执行速度快。特别是加法指令,如果目的操作数为AX,指令执行快一些。 采用寄存器寻址方式,目的、源操作数类型必须一致。 如:MOV AH,BX就是错误的。,2.2.2 立即寻址 操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数。 汇编格式:n 功能:指令的下一单元的内容为操作数n,即:,n也称为立即数。,例如:MOV AX,3064H 目的操作数采用寄存器寻址,地址为AX。 源操作数采用立即寻址。即:,该功能主要用来给寄存器赋值。,注意: (1) 立即数只能作源操作数,不能作目的操作数。 如:MOV 100H,AX。 (

21、2)立即数作为源操作数时,注意溢出。 如:MOV AH,-90H;这个语句是错误的。 因为: -90H=-142-128。,2.2.3 直接寻址 直接寻址方式中,操作数的偏移地址就在指令操作码后面,而操作数则存放在数据段。 汇编格式:地址表达式或段寄存器:EA 功能:指令下一字单元的内容是操作数的偏移地址。,例如:MOV AX,2000H 执行前:(DS)=3000H,(32000H)=1234H 源操作数寻址过程:,执行:(32000H) AX 执行后:(AX)=1234H 注意:8086汇编语言中,可以用含有变量的地址表达 式代替数地址。,如:MOV AX,VALUE+6 其中VALUE定

22、义在数据段: VALUE DW 12H,13H,14H,15H,16H 此时,操作为(VALUE+6)的内容AX, 也就是将15H送到AX中。,2.2.4 寄存器间接寻址 在间接寻址方式中,操作数存放在存储器中,而操作数的偏移地址EA在指令指明的寄存器中,即寄存器的内容为操作数的偏移地址的。 能够用来间接寻址的寄存器,只能是寄存器SI、DI、BP、BX其中之一,所以,对于寄存器间接寻址方式给出的操作数,其偏移地址EA按下式计算:,操作数在当前数据段中,EA=,SI用SI作间址寄存器,DI用DI作间址寄存器,BX用BX作间址寄存器,BP用BP作间址寄存器,操作数在堆栈段中,其用寄存器BX、DI或

23、SI间接寻址,则操作数在当前数据段中,即数据段寄存器DS的内容左移四位,加上BX、DI或SI中的偏移地址EA形成操作的物理地址PA。 若用寄存器BP间接寻址,则操作数在堆栈段中,即堆栈段寄存器SS的内容左移四位,加上BP中的偏移地址,EA形成操作数的物理地址PA。 操作数的有效地址(偏移地址)在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数则在存贮器中。,汇编格式:R 功能:R的内容为操作数的偏移地址EA,即:,注意BP所指的段为堆栈段。,此种寻址方式如图所示,在寄存器间接寻址方式中,寄存器DI,SI,BP或BX作为间址寄存器使用,其内容是操作数的偏移地址,所以,通常将它们称作地址指示

24、器,用于存取存储中的数据。 若在指令中规定是段超越的,则BP也可以与其它段寄存器相加,形成操作数地址。,例:MOV AX,SI AX是目的操作数地址,采用寄存器寻址方式; SI指明源操作数采用寄存器间接寻址方式。 假定执行前:(AX)=5,(DS)=2000H, (SI)=1000H,(21000H)=50A0H。 源操作数寻址过程:,执行:(21000H) AX 执行后:(AX)=50A0H,(SI)、(DS)、(21000H)不变,例:MOV AX,BP 假定执行前:(AX)=0,(BP)=30H, (SS)=2000H,(20030H)=1234H。 源操作数寻址过程:,执行:(2003

25、0H) AX 执行后:(AX)=1234H,(BP)、(SS)、(20030H)不变。,2.2.5基址寻址 汇编格式:XR 功能: R的内容和指令中指定的8位或16位偏移量之和为操作数的偏移地址的操作数的有效地址,是一个基址寄存器的内容和指令中指定的8位或16位偏移量之和。,其中8位或16位偏移量是个带符号数,是补码。 当偏移量为8位时,计算有效地址时,符号位自动扩展成16位进行计算。 同样BX和BP用DS和SS。 这种寻址方式如图所示:,寄存器相对寻址方式示意图,例1:MOV AX,-6BX 源操作数采用变址寻址方式,X的值为-6,选用的变址寄存器为BX,所以源操作数的EA=BX-6,数据段

26、寄存器DS的内容左移4位与EA相加,形成源操作数的物理地址PA,目的操作数采用寄存器寻址方式,其操作数地址为AX。 执行前:(AX)=0,(BX)=16H,(DS)=2000H, (2000H)=3789H EA=16-6=10H PA=(DS)左移4位+EA,源操作数的寻址过程用以下示意图表示:,执行:(2000H)AX 执行后:(AX)=3789H,(BX)、(DS)、 (20010H)未变。,例2:ADD 5BP, BX 执行前:(BX)=40H,(BP)=30H, (SS)=2000H 执行:,(20035H)+(BX)20035H,执行后:(20035H)=90H,(BX)(BP)

27、(SS)未变。,请同学们填空,90,2.2.6 变址寻址,(或称直接变址寻址方式) 汇编格式:XR 功能: R的内容和指令中指定的8位或16位偏移量之和为操作数的偏移地址的操作数的有效地址,是一个变址寄存器的内容和指令中指定的8位或16位偏移量之和。,其中8位或16位偏移量是个带符号数,是补码。 当偏移量为8位时,计算有效地址时,符号位自动扩展成16位进行计算。 同样SI和DI用DS。 这种寻址方式如图所示:,寄存器相对寻址方式示意图,例:MOV AX , ES: COUNTDI 此指令的源操作数的有效地址EA=COUNT+DI 段地址为ES 物理地址PA=16ES+COUNT+DI,关于段寄

28、存器的选择同寄存器间接寻址一样,只能是BP、BX、DI、SI之一。注意BP所指的段为堆栈段。,例:MOV AX ,COUNTSI 或 MOV AX , SI+COUNT 其中COUNT为16位偏移量这是符号地址实际上 COUNT究竟是8位偏移量,还是16位偏移量,可由伪指令来定义。 如: DS=3000H,SI=2000H,COUNT=3000H, 则: EA=2000+3000=5000H PA=30000H+5000H=35000H 指令执行前:(AX)=8A45H ,(35000H)=34H (35001H)=12H,指令执行后:(AX)=1234H 这种寻址方式也可采用段超越前缀。,1

29、2,34,源操作数的寻址过程如下:,执行:(35000H) AX 执行后:(AX)=1234H,(SI)、(DS)、(35000H)内容不变。,例2:MOV AX,6SI MOV CX,6BX MOV DX,6BP 执行前:(DS)=2000H,(SS)=4000H,(SI)=10H (DI)=20H,(BX)=30H,(BP)=40H 第1条:源操作数地址EA=SI+6=16H PA=(DS)左移4位+EA=20016H 第2条:源操作数地址EA=BX+6=36H PA=(DS)左移4位+EA=20036H 第3条:源操作数地址EA=BP+6=46H PA=(SS)左移4位+EA=40046

30、H,2.2.7 基址加变址寻址 操作数的偏移地址EA是指令中指定的基址寄存器内容、变址寄存器内容及位移量X三者之和。 操作数存放在主存之中。段地址由基址寄存器确定在那一个段寄存器中,即若用BX作为基址寄存器,则操作数在数据段区域中;若用BP作为基址寄存器,则操作数在堆栈段区域中。 汇编格式:XBR + IR BR表示基址寄存器,只能选用BX,BP之一; IR表示变址寄存器,只能选用SI,DI之一。 功能:BR的内容加上IR的内容,再加上X,得到操 作数的偏移地址。也就是: EA =(BR)+(IR)+X。,物理地址(PA): PA=16DS+BX+SI PA=16DS+BX+DI PA=16S

31、S+BP+SI PA=16SS+BP+DI,这种寻址方式如图所示:,EA = BX + SI或DI + X; 数据在当前DS中 EA = BP + SI或DI + X; 数据在当前SS中 同前面一样,基址寄存器决定操作数所在的段。如果选用BX,则操作数在数据段内;如果选用BP,则操作数在堆栈段内。,例1:MOV AX,MASKBXSI,也可以写成: MOV AX,MASKBX+SI或MOV AX,MASK+BX+SI 目的操作数采用寄存器寻址,地址在AX。 源操作数采用基址加变址寻址, EA = BX+SI+MASK。 执行前:(DS)=3000H,(BX)=2000H,(SI)=1000H,

32、 MASK=250H,(33250H)=1234H,源操作数寻址过程:,执行:(33250H) AX 执行后:(AX)=1234H,(BX)、(SI)、(DS)、 (33250H)不变。,例2:ADD AX,MASKBP+DI 目的操作数采用寄存器寻址,地址在AX。 源操作数采用基址加变址寻址, EA = BP+DI+MASK。 执行前:(SS)=3000H,(BP)=2000H, (DI)=1000H,MASK=8H,(33008H)=34H, (AX)=12H。,源操作数寻址过程:,执行:(AX)+(33008H) AX 执行后:(AX)=46H,(BP)、(DI)、(SS)、 (3300

33、8H)不变。,2.2.8 跨段寻址 8086的存储器是分段使用的,通常若选用寄存器BP作间址寄存器,变址寄存器或基址寄存器,即在采用寄存器间接寻址,变址寻址或基址加变址时,只要BP出现在方括号之内,则操作数在当前堆栈段,此时,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址的EA相加形成,否则,操作数在当前数据段,此时,操作数物理地址PA由数据段寄存器DS的内容左移4位与偏移地址EA相加形成,还是8086的基本约定,即默认状态。当要否定默认状态。 到非约定段寻找操作数时,必须用跨段前缀指明操作数所在段的段寄存器名。,例如:MOV AX,DS:BP MOV BX,ES:BX MOV

34、 CX,SS:SI MOV DX,SS:DI DS、ES、SS指明了数据所在段,而原来的默认状态不起作用。 其中,DS:,ES:,SS:均为跨段前缀,此时,默认状态不起作用。所以,操作数的物理地址由,“:”前面的段寄存器内容左移4位与偏移地址相加形成。,汇编格式:段寄存器名: 功能:冒号之前的段寄存器指明了操作数所在段。,按跨段前缀的说明,上述4条指令的源操作数物理地址分别如下计算: 第(1):(DS)左移4位+(BP)源操作数在堆栈段 第(2):(ES)左移4位+(BX) 第(3):(SS)左移4位+(SI) 第(4):(SS)左移4位+(DI) 无论是段默认状态,还是跨段情况,操作数的物理

35、地址PA均由系统自动计算。,28 寻址方式综合举例 例:ADD,AX,BX 其源操作数采用寄存器间接寻址方式,目的操作数采用寄存器承担方式。 执行前:(AX)=30,(BX)=100H, DS=(100H)=16 执行过程: 目的地址为AX,从中取出目的操作的数30。源操作数地址为DS:100H,从中取出源操作数16,源目操作数相加送入目的地址为AX之中。 执行后:(AX)=46,(BX), DS:(100H)未变。,例2:ADD 2BX,AX 其源操作数采用寄存器寻址,目的操作数采用变址寻址方式。 执行前: (AX)=40,(BX)=100H,DS=(102H)=57 执行过程:目的操作数地

36、址为DS=102H,从中取出目的操作数57。 源操作数地址为AX,从中取出源操作数40,源、 目操作数相加送入目的地址之中。 即:57+40=97 DS:102H 执行后:DS:(102H)=97,(AX)(BX)未变。 例3:ADD AX ,4BX+SI 其源操作数采用基址加变址寻址方式,目的操作数采用寄存器寻址方式。 执行前:(AX)=35,(BX)=100H, (SI)=20H,(124H)=43。 执行过程:目的操作数地址是AX,从中取出目的操作数35,源操作数地址是124H,从中取出目的操作数43,源操作数相加,,运算结果送入目的地址AX之中, 即43+35=78AX 执行后:(AX

37、)=78,(BX)(SI)(124H)未变。 该指令的源操作数在当前数据段(选用了BX作基址寄存器)故(124H)表示当前数据段124H号字单元中的内容。 例4:请问如下程序执行到EXIT时,字节单元A,B,C+1,C+2,中的内容又是什么? STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT A DB 0 B DB 0 C DB 30H,40H,50H DATA ENDS,;开辟200个字节的存储屋,每个存储单元的初值均为0。,CODE SEGMENT ASSUME CS:CODE ,DS:DATA,SS:STACK START

38、:MOV AX ,DATA MOV DS ,AX MOV AL,C+1 ;直接寻址(C+1)=40AL ADD AL,C ;直接寻址(AL)+(C)=40+30AL MOV,A,AL ;寄存器寻址;(AL)=70A MOV,AL,C+1 ;直接寻址;(C+1)=40AL ADD,AL,C+2,;直接寻址;(AL)+(C+2)=40+50AL MOV,B,AL ;寄存器寻址;(AL)=90B ADD,C,10, ;立即寻址;(C)+10=40C ADD,C+1,20 ;立即寻址;(C+1)+20=60C+1 ADD,C+2,30 ;立即寻址;(C+2)+30=80C+2 EXIT:MOV,AH,

39、4CH INT,21H; ; 结束用户程序,返回DOS状态 CODEENDS END START,功能: 定义一个以变量名为首地址的字节数据存储区,所含数据存储单元的个数由其后表达式的个数决定,并为各数据存储单元提供一个由其对应表达式得出的初值。 本程序数据段中,三次利用伪指令DB定义了三个字节数据存储区它们在主存中存放的形式如图所示。,当程序从START执行到EXIT时各字节变量的内容和存放形式如图所示:,变量C与数据段首址相距2字节,即其偏移地址为2,所以以下两条语句具有相同的功能: (1)MOV AL,C (2)MOV AL,DS:2 二者的功能都是从字节变量C中取出数据送AL中。,例:

40、执行下列指令后,AX的内容是什么? TABLE DW 10H,20H,30H,40H,50H ENTRY DW 3 MOV BX,OFFSET TABLE ADD BX,ENTRY 直接寻址 MOV AX,BX 寄存器间接寻址 ,第1句:TABLE在DS段内的偏移地址 BX 第2句:TABLE偏移地址 + 3 BX 第3句:(TABLE偏移地址 + 3)单元的内容 AX 所以,执行后:(AX)=3000H,例:指出下列程序完成的功能。,STACK SEGMENT DB 200 DUP(0) STACK ENDS ;- DATA SEGMENT BUF1 DB 20,21,22,23,24,25

41、,26,27,28,29,30,31 BUF2 DB 12 DUP(0) DATA ENDS ;- CODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX,MOV SI,OFFSET BUF1 MOV DI,OFFSET BUF2 MOV CX,12 LOOPA: MOV AL,SI MOV DI,AL INC SI INC DI DEC CX JNE LOOPA EXIT: MOV AH,4CH INT 21H CODE ENDS ;- END START 分析: 循环12次,每一次将BUF1中的一个数送

42、到BUF2中。SI为BUF1的指针,DI为BUF2的指针,每次循环完成SIDI工作,同时将指针SI、DI加1,指向下一个数。,例:求一组数据中,正数、负数零的个数。 分析: 对于一个数组来说,要判断正负数和零的个数,必须将它们逐个取出来与零比较,确定它的正负,从而计算出正数、负数零的个数。,DATA SEGMENT N_NUM DW 0 P_NUM DW 0 Z_NUM DW 0 ARRAY DW 0,-2,3,4,5,10,30H DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,7

43、 ;数据个数 MOV BX,0 ;指针 MOV DI,0 ;正数个数 MOV SI,0 ;零个数 AGAIN:CMP ARRAYBX,0 JLE L1 ;小于等于0,转移 INC DI,JMP NEXT L1: JL NEXT;小于0,转移 INC SI NEXT:ADD BX,2 DEC CX JNZ AGAIN MOV AX,7 SUB AX,DI SUB AX,SI MOV N_NUM,AX MOV Z_NUM,SI MOV P_NUM,DI EXIT: MOV AH,4CH INT 21H CODE ENDS END START,1传送指令或通用数据传送指令 格式:MOV OPD,OP

44、S 功能: 将源操作数传送至目的地址中, 即(OPS)OPD MOV是操作码 源操作数可以是:累加器、寄存器、存贮器以及立即操作数; 目的操作数可以是:累加器、寄存器、存贮器数据。 传送方向的示意图.,2.3.1 数据传送指令,2.3 常用指令,数据传送方向的示意图,具体说,一条数据传送指令能实现: (1)CPU内部寄存器之间数据的任意传送结果 (除CS和IP以外) 例:Mov AL,BL Mov DL,CL Mov DS,BX (2)立即数传送至CPU内部的通用寄存器组,给这些寄存器 赋初值。,例:Mov CL, 4 Mov SI, D57BH Mov AX, 0FFB1H (3)CPU内部

45、寄存器(除CS和IP以外)与存贮器(所有寻址 方式)之间的数据传送,可以实现一个字节或一个字的 传送。 例:Mov AL, BUF Mov AX,SI Mov DI,CX Mov SI,5BP Mov指令不能实现存贮单元之间的数据传送。,图1 描述了Mov指令在传送数据时所允许的所送路径及类型,字节类型/字类型,注:Mov指令不能向代码段寄存器CS作传送操作 图1 Mov指令所允许的数据传送路径及类型。,Mov指令有如下九种形式。 (1)从累加器送到存储器 格式:MOV mem, ac ; B/W 执行的操作:(mem)ac 其中ac表示累加器AX、AH、AL。 存储器操作数(mem)可采用与

46、数据有关的寻址存储器的各种寻址方式(直接、寄存器间接、寄存器相对、基础变址和相对基础变址)。 例1:Mov AP,AX 其中AP是存储单元的符号地址。 此指令由AX除含表示是个字传送,AL的内容送AP存储单元,AH的内容送入AP+1存储单元。,如DS=2000H,AP=1234H 此存储单元的物理地址:PA=20000+1234=21234H 指令执行前:AX=2600H,(21234H)=27,(21235H)=29H 指令执行后:AX=2600H,(21234H)=00H, (21235H)=26H,指令执行情况,例2 Mov ARBXSI,AL 其中:AR是偏移量,用了符号地址,此指令是

47、将一字节的AL内容送入以BX内容加上SI内容和AR的值相加作为有效地址(偏移地址)的数据段的存储单元中。 即:EA=AR+(BX)+(SI) 假设:DS=2000H,SI=1000H, BX=3000H,AR=1020H 此物理地址:PA=20000+1000+3000+1020=24020H 指令执行后将AL中的内容A9H,送到24020H为地址的存储单元中。AL寄存器内容不变,存储单元的原始数据被A9取代。,例3 Mov ES:AT,AX 其中指令中有段超越前缀,AX的一个字的数据送入附加段中的AT为符号地址的存储单元的相继两个单元中。 假设:ES=4000H,AT=2000H 此单元的物

48、理地址: PA=40000+2000=42000H,(2)从存储器送累加器 格式:MOV ac, mem;B/W 执行的操作:ac(mem) 此指令与(1)的指令差别是传送方向相反,其余规定和要求都相同。 例:MovAX,AT MovAL,BX MovAH,APBXSI MovAX,ES:BXDI,存储器操作数mem可采用与数据有关的寻址存储器的各种寻址方式,(3)从存储器或寄存器送到段寄存器 格式:Mov segreg, mem/reg ;本指令只能是字操作 执行操作:segreg(mem/reg) 其中 segreg表示不包括cs的段寄存器SS,DS,ES reg表示寄存器操作数,可采用1

49、6位寄存器 (AX,BX,CX,DX,SP,BP,SI,DI) mem存储器操作数,寻址方式同(1)的规定。 例1:Mov ES,DX 指令执行前:ES=1000H,DX=2000H 指令执行后:ES=2000H,DX=2000H,例2:Mov SS, NWDI 假设:DS=1000H, DI=2000H, NW=3000H 存储单元的物理地址: PA=10000+2000+3000 =15000H 此指令是字操作,因此是15000H和15001H两单元的内容传送到SS。,指令执行前: SS=5040 ,(15000)=45, (15001)=67 执行后:SS=6745H,(15000)=4

50、5, (15001)=67,对mem也可指定段寄存器 如:Mov ES,SS:BX,(4)从段寄存器到寄存器或存储器 格式:Mov mem/reg,segreg;W 此指令与(3)的指令传送方向相反,其它规定相同,但segreg可以包括四个段寄存器:CS、DS、SS、ES。 例:MovBX,SS MovAA,DS MovATBXDI,ES MovAX,CS,(5)从寄存器到寄存器 格式:Mov reg1,reg2 ;B/W 执行的操作:reg1reg2 此指令可以是字操作,也可以是字节操作 字节操作:(8位寄存器) (AH,AL,BH,BL,CH,CL,DH,DL) 字操作: ( 16位寄存器

51、) (AX,BX,CX,DX,BP,SP,DI,SI) 注: 两个寄存器之间传送时,只能在相同字长的寄存器间传送,不能在不同的字长寄存器间传送。,例如:正确的传送 Mov AX,BX MovAH,CL MovDI,DX MovBX,SI 错误的传送 MovAX,CL MovDI,AH MovBL,SI,(6)从寄存器到存储器 格式:Movmem,reg ;B/W 执行操作:(mem)reg 此指令中mem和reg的规定与(1)和(5)相同 此指令中可以是字操作,也可以是字节操作 例:MovMB,DX 假设:DS=3000H,MB=2000H, 目的操作数的存储单元物理地址=30000+2000

52、=32000H 指令执行前:DX=1234H,(32000H)=20H, (32001H)=BAH 指令执行后:DX=1234H,(32000H)=34H, (32001H)=12H,例:MovSI,DI MovES:BPSI,DX 基址加变址,(7)从存储器到寄存器 格式:Movreg,mem ;B/W 此指令与(6)的指令传送方向相反,规定相同 例:MovBL,AT MovSI,AP MovCX,BX MovDX,ES:BXSI,(8)立即数送寄存器 格式:Movreg,data ;B/W 执行操作:regdata 其中: data可以是8位立即数,也可以是16位立即数, 立即数可以是常量

53、,各种数制的常数, ASC字符,也可以是符号名. Data数据的类型必须与寄存器字长相一致。 8位数可送16位寄存器,但16位数不能送8位寄存器,例:MovCH,34H ;一字节十六进制数34HCH中 MovDL,A;ASC码A送DL中 MovSI,Count;Count值送SI MovBX,2346;十进制数2346BX 例:MovSI,OFFSET TABLE ;取TABLE的偏移地址送SI 指令执行前:BX=1247H, TABLE的EA=257AH 指令执行后:BX=257AH,TABLE的EA=257AH 注意:MOV指令的执行不影响标志位。,立即送存储器 格式:Mov mem, d

54、ata ; B/W 执行的操作:memdata data右以是字节立即数,也可以是字立即数,规 定同. mem必须作数据类型说明 BYTE PTR:属性操作符指明为字节操作 WORD PTR:属性操作符指明为字操作,例:MOV BYTE PTR MEM, 30H 说明目的存储器操作数MEM是字节单元 假设:DS=3000H, MEM=2000H 存储器单元的物理地址: PA=30000+2000=32000 指令执行前:(32000H)=40H 指令执行后:(32000H)=30H 例:MOV WORD PTR BX,2345H 说明目的操作数存储单元是字单元 假设:DS=3000H,BX=1

55、000H 字存储单元的物理地址:PA=30000H+1000=31000H 指令执行前:(31000H)=44,(31001H)=68H 指令执行后:(31000H)=45H,(31001H)=23H,2、数据交换指令:XCHG 语句格式:XCHGOPD,OPS ;B/W 功能: (OPD)OPS,(OPS)OPD即将源和目的地址中的内容互换。 其中,OPD和OPS表示两个操作数,该指令中必须有一个操作数是在寄存器中。 因此它可以在: (1)寄存器与寄存器之间交换数据 (2)寄存器与存储器之间交换数据,但不能与段寄存器交换数据。 存储器与存储器之间也不能交换数据。 指令可以是字操作,也可以是字

56、节操作。 该指令执行结果不影响标志位。,例:XCHG AX,BX 指令执行前:AX=2567H,BX=3107H 指令执行后:AX=3107H,BX=2567H 例:XCHG AX,DI 执行前:(AX)=0001H,(DI)=OFFFFH 执行后:(AX)=OFFFFH,(DI)=0001H,3地址传送指令 这组指令有三条:LEA、LDS和LES它们把地址送到指定的寄存器。 (1)传送偏移地址指令 格式:LEA OPD,OPS 功能: 按OPS提供的寻址方式计算偏移地址,并将其送入OPD中。 OPD:一定要是一个十六位的通用寄存器,而不能 使用8位寄存器和段寄存器,(2) OPS:只能是各种寻址方式的存储器操作数; 寄存器、立即数和段寄存器操作都不能用作源操作数 OPS。 换言之:所提供的一定是一个存储器地址。 例:DATASEGMENT BUFDB ABCDEF ADW72,-57,100H BDW0 DATAENDS Mov SI,OFFSET A ;将A的EA即6SI MovAX,SI ;(SI)=72AX LEAAX,SI ;将SI所指的存储单元的EA即6AX LEADI,4SI ;取以A为首址的第三个字存储单元 的EA即10DI MovB,BUF ;错误语句,因为OPD不是寄存器。,例:LEADX,BABX 指令执行前:BX=1254H

温馨提示

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

最新文档

评论

0/150

提交评论