CPU与汇编第二章寻址方式_第1页
CPU与汇编第二章寻址方式_第2页
CPU与汇编第二章寻址方式_第3页
CPU与汇编第二章寻址方式_第4页
CPU与汇编第二章寻址方式_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

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

文档简介

第二章Intel8086/8088CPU的寻址方式和指令系统2.1计算机组织结构运算器控制器存储器输入设备输出设备计算机系统硬件:中央处理机

CPU总线控制逻辑接口接口存储器大容量存储器I/O设备I/O子系统系统总线......软件:系统软件用户软件MainmemoryI/ObridgeBusinterfaceALURegisterfileCPUSystembusMemorybusDiskcontrollerGraphicsadapterUSBcontrollerMouseKeyboardDisplayDiskI/ObusExpansionslotsforotherdevicessuchasnetworkadaptersPChardwareMainmemoryI/ObridgeBusinterfaceALURegisterfileCPUSystembusMemorybusDiskcontrollerGraphicsadapterUSBcontrollerMouseKeyboardDisplayDiskI/ObusExpansionslotsforotherdevicessuchasnetworkadaptershelloexecutablestoredondiskPChellocodehello.c汇编语言MainmemoryI/ObridgeBusinterfaceALURegisterfileCPUSystembusMemorybusDiskcontrollerGraphicsadapterUSBcontrollerMouseKeyboardDisplayDiskI/ObusExpansionslotsforotherdevicessuchasnetworkadaptershelloexecutablestoredondiskPChellocode"hello,world\n""hello,world\n"微型计算机的工作过程微型计算机的工作过程就是执行程序的过程,而程序由指令序列组成,因此,执行程序的过程,就是执行指令序列的过程,即逐条地从存储器中取出指令并完成指令所指定的操作。

由于执行每一条指令,都包括取指、译码和执行三个根本步骤,所以,微型计算机的工作过程,也就是不断地取指令、译码和执行的过程,直到遇到停机指令时才结束机器的运行。优点:处理器简单通用,把复杂问题转移到存放解释程序存储器中,即把复杂的硬件设计转化为复杂的软件设计。8086微处理器8086/8088CPU内部的存放器组存放器是CPU内部存放操作数的地方,它的操作速度比内存操作数速度快。8086共有14个存放器,它们都是16位的,可以存放16位二进制数。通用存放器:4个数据存放器:AX、BX、CX和DX每个存放器又可分为2个8位存放器:AH、AL、BH、BL、CH、CL、DH、DL2个变址存放器:DI和SI2个指针存放器:SP和BP段存放器4个段存放器:ES、CS、SS和DS控制存放器1个标志存放器:FLAG(CF、AF、PF、ZF、OF、SF、IF、DF、TF)1个指令指针存放器:IP通用存放器的作用〔1〕数据存放器数据存放器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。4个16位存放器:AX:Accumulator,累加器BX:BaseRegister,基址存放器CX:CountRegister,计数存放器DX:DataRegister,数据存放器上述4个存放器可分为8个8位存放器,分别为AH和AL、BH和BL、CH和CL、DH和DL。每个存放器都有自己的名称,可独立存取。程序员可利用数据存放器“能分可合”的特性,灵活地处理双字、字和字节等信息。在32位处理器中,有4个32位存放器:EAX、EBX、ECX和EDX。通用存放器AX〔accumulator〕:作为累加器,是算术运算的主要存放器。所有I/O指令都使用它和外部设备传送信息。BX〔base〕:除了作为一般的数据存放器使用外,经常用做基址存放器。CX〔count〕:除了作为一般的数据存放器使用外,常用来保存计数值,如在移位指令、循环指令和串处理指令中用作隐含的计数器。DX〔data〕:除了作为一般的数据存放器使用外,可以在处理双字长运算时把DX和AX组合使用,DX存放高位字。通用存放器SP〔stackpointer〕:除了作为一般的数据存放器使用外,用来指示栈顶的偏移地址;BP〔basepointer〕:除了作为一般的数据存放器使用外,可以和堆栈段存放器SS联合使用来指示堆栈段中的存储单元地址;SI(sourceindex)和DI(destinationindex):除了作为一般的数据存放器使用外,可以和数据段存放器DS联合使用来确定数据段中存储单元的地址注意:这四个存放器只能以16位为单位一起使用标志存放器〔程序状态字存放器PSW〕1514131211109876543210状态标志:控制标志:OF

溢出标志DF方向标志SF

符号标志IF中断标志ZF

零标志TF陷阱标志CF

进位标志AF

辅助进位标志PF

奇偶标志OFDFIFTFSF

ZF

AF

PF

CF例:

MOVAX,1MOVBX,2ADDAX,BX

指令执行后,(AX)=3,OF=0,CF=0,ZF=0,SF=0例:

MOVAX,FFFFHMOVBX,1ADDAX,BX

指令执行后,(AX)=0,OF=0,CF=1,ZF=1,SF=0Debug下的内存和存放器(1)PSP

DSESSSCSEXE程序的内存映象图装入模块文件头Debug下的内存和存放器(2)一个16位存放器可以存储一个16位的数据。〔数据的存放情况〕一个16位存放器所能存储的数据的最大值为多少?答案:216-1。通用存放器16位数据在存放器中的存放情况数据:18二进制表示:10010在存放器AX中的存储:16位数据在存放器中的存放情况数据:20000二进制表示:在存放器AX中的存储:通用存放器以AX为例,8086CPU的16位存放器分为两个8位存放器的情况:通用存放器通用存放器的作用〔2〕变址存放器(IndexRegister)SI:SourceIndexRegister,源变址存放器DI:DestinationIndexRegister,目标变址存放器它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,且具有特殊的功能。〔3〕指针存放器(PointerRegister)它们主要用于访问堆栈内的存储单元,并且规定:BP:基指针(BasePointer)存放器,用它可直接存取堆栈中的数据SP:堆栈指针(StackPointer)存放器,用它只可访问栈顶通用存放器的作用寄存器用途AX乘法指令作累加器,I/O指令作数据寄存器由累加器做立即数运算,比其他指令少占字节ALBCD码,ASCII码运算的累加器,查表指令XLAT的累加器字节乘法,字节除法,字节I/O,十进制算术运算AH作为取指令标志LAHF的目的寄存器,字节乘法,字节除法BX间接寻址作基址寄存器,XLAT指令中作基址寄存器CX串操作或循环控制中的计数器,指令执行后内容会自动变化CL移位,循环计数,指令执行后内容不变DX字乘法,字除法,I/O指令中作端口间接寻址SI存储器指针(串操作中的源指针)DI存储器指针(串操作中的目的指针)BP存储器指针(存取堆栈的指针)SP堆栈指针通用存放器的隐含使用及特殊用途几条汇编指令汇编指令不区分大小写几条汇编指令CPU执行下表中的程序段的每条指令后,对存放器中的数据进行的改变。几条汇编指令存放器与存储器的比较:寄存器存储器在CPU内部在CPU外部访问速度快访问速度慢容量小,本钱高容量大,本钱低用名字表示用地址表示RegistersOn-chipL1cache(SRAM)Mainmemory(DRAM)Localsecondarystorage(localdisks)Larger,slower,andcheaper(perbyte)storagedevicesRemotesecondarystorage(distributedfilesystems,Webservers)Localdisksholdfilesretrievedfromdisksonremotenetworkservers.Mainmemoryholdsdiskblocksretrievedfromlocaldisks.Off-chipL2cache(SRAM)L1cacheholdscachelinesretrievedfromtheL2cache.CPUregistersholdwordsretrievedfromcachememory.L2cacheholdscachelinesretrievedfrommemory.L0:L1:L2:L3:L4:L5:Smaller,faster,andcostlier(perbyte)storagedevices8086在取指令和寻找内存操作数的地址时,采用了分段寻找的方式,在同一时刻可将内存分成4个段:代码段、数据段、堆栈段和特别数据段,段与段之间允许有重叠。4个段存放器是:CS(CodeSegmentRegister,代码分段存放器)DS(DataSegmentRegister,数据分段存放器)SS(StackSegmentRegister,堆栈分段存放器)ES(ExtraSegmentRegister,特别分段存放器)。这4个存放器都只能够作为16位存放器使用。8086内部有20根地址线,它可以直接访问的物理空间为1M字节,其编码区间为:00000H~0FFFFFH。而CPU内部存放存储单元偏移量的存放器(如IP、SP、BP、SI、DI和BX等)都是16位,它们的编码范围仅为:00000H~0FFFFH。如何用16位存放器有效地访问1MB的存储空间,8086采用了内存分段的管理模式,并引入存储器分段的概念。段存放器的作用8086内存分段管理模式〔1〕存储器的分段计算机的内存单元是以“字节”为最小单位进行线性编址的。为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址。16位微机把内存空间划分成假设干个逻辑段,每个逻辑段的要求如下:逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0;逻辑段的最大容量为64K,这由16位存放器的寻址空间所决定。按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。〔2〕物理地址的形成方式存储单元的逻辑地址分为两局部:段地址和偏移量。由逻辑地址得到其物理地址(PA—PhysicalAddress)的计算方法如下:物理地址PA=段地址×16+偏移量逻辑地址到物理地址的生成加法器

逻辑地址191500

偏移地址段地址0000

20-bit物理存储器地址150物理地址:每个存储单元唯一的20位地址段地址:段起始地址的高16位偏移地址:段内相对于段起始地址的偏移值〔16位〕〔有效地址EA〕8086内存分段管理模式〔3〕段存放器的引用段存放器是因为对内存的分段管理而设置的。一般情况下,段存放器及其指针存放器的引用关系方面有如下规定:取指令所用的段存放器和偏移量一定是用CS和IP;堆栈操作所用的段存放器和偏移量一定是SS和SP;串操作的目标操作数所用的段存放器和偏移量一定是ES和DI;其它情况,段存放器除其默认段存放器外,还可以强行改变为其它段存放器。访问存储器方式缺省的段寄存器可选用的段寄存器偏移量取指令CSIP堆栈操作SSSP一般取操作数DSCS、ES、SS有效地址串操作源操作数DSSI目标操作数ESDI使用指针寄存器BPSSCS、DS、ES有效地址CS和IPCS和IP是8086CPU中最关键的存放器,它们指示了CPU当前要读取指令的地址。CS为代码段存放器;IP为指令指针存放器。8086PC工作过程的简要描述〔1〕从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;〔2〕IP=IP+所读取指令的长度,从而指向下一条指令;〔3〕执行指令。转到步骤〔1〕,重复这个过程。8086PC工作过程的简要描述在8086CPU加电启动或复位后〔即CPU刚开始工作时〕CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。CS和IP内存中指令和数据都是二进制信息,CPU在工作的时候把有的信息看作指令,有的信息看作数据。CPU根据什么将内存中的信息看作指令?

CPU将CS:IP指向的内存单元中的内容看作指令。CS和IP在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。修改CS、IP的指令在CPU中,程序员能够用指令读写的部件只有存放器,程序员可以通过改变存放器中的内容实现对CPU的控制。CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。我们如何改变CS、IP的值呢?修改CS、IP的指令8086CPU必须提供相应的指令mov指令不能用于设置CS、IP的值,

8086CPU没有提供这样的功能。8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令修改CS、IP的指令同时修改CS、IP的内容:

jmp段地址:偏移地址

jmp2AE3:3 jmp3:0B16

功能:用指令中给出的段地址修改CS,偏移地址修改IP。修改CS、IP的指令仅修改IP的内容: jmp某一合法存放器 jmpax〔类似于movIP,ax〕 jmpbx 功能:用存放器中的值修改IP。〔4〕存储单元的内容存储单元中所存放的二进制信息称为该存储单元的内容或值,并且规定:一个字节的内容是该字节单元内存放的二进制信息;一个字的内容是该字地址所指向的单元及其后继一个单元的内容拼接而成;一个双字的内容是该字地址所指向的单元及其后三个单元的内容拼接而成。在拼接“字内容”时,我们按“高上下低”的原那么来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。在拼接“双字内容”时也是如此。8086内存分段管理模式3.

存储器存储单元的地址和内容:存储器以字节〔8bit〕为单位存储信息每个字节单元有一个地址,从0编号,顺序加1地址用二进制数表示〔无符号整数,写成十六进制〕一个字要占用相继的两个字节低位字节存入低地址,高位字节存入高地址机器以偶地址访问〔读/写〕存储器字单元地址用它的低地址来表示10011111

1000H(1000H)=9FH00100110

1001H

00011110

1002H(1002H)=1EH11010111

1003H

(1000H

)=269FH(

1002H)=D71EH(1001H)=1E26H

访问两次存储器(1001H)=26H(1003H)=D7H存储器存储器的分段:20根地址线:地址范围

00000H~FFFFFH机器字长16位:仅能表示地址范围0000H~FFFFH小段:每16个字节为一小段,共有64K个小段

小段的首地址

00000H~0000FH

00010

H~0001FH

00020H~0002FH

FFFF0H~FFFFFH

段起始地址:小段首地址段的大小:64K范围内的任意字节存储器的逻辑分段:

存储器64K代码01500H42000H1CD00H0150H4200H1CD0H段寄存器CSDSSSES64K堆栈64K数据64K附加数据B0000HB000H

存储器8K代码2K数据256堆栈02000H04800H04000H0200H0400H0480HCSDSSS例:(DS)=0400H,EA=1234H,

物理地址

=

16d(DS)+EA=05234HCPU可以用不同的段地址和偏移地址形成同一个物理地址:物理地址段地址偏移地址05234H0400H1234H0523H0004H0520H0034H……8086/8088有两个独立的存储空间和I/O地址空间,地址空间为1MB,I/O地址空间为64KB。数据按字节、字或双字存放,存放方式可按对正的双字边界或非对正的双字为边界。逻辑地址〔logicaladdress〕物理地址〔physicaladdress〕。物理地址=段地址*16+偏移地址地址00001H00008H00007H00006H00005H00004H00003H00002HByte8Byte7Byte6Byte5Byte4Byte3Byte2Byte1Word6Word4Word2Word0Byte000000HWord5Word1物理存储器

双字对齐字对齐Doubleword0Doubleword4图3.2对正的数据字和双字Byte8图(a)中数据5AF0H存放在对正的双字地址02000H,其中0F0H存放在低字节地址02000H,5AH存放在高字节地址02001H。图(b)中数据2C96H,对正的双字地址边界是0200CH。

地址

存储器(二进制)存储器〔十六进制〕

地址020011602000160101101011110000

存储器(二进制)0010110010010110

0200E160200D16

5A

F0

(b)

(a)

物理存储器

图3.4非对正的字或双字为边界的例子地址00001H00008H00007H00006H00005H00004H00003H00002HByte8Byte7Byte6Byte5Byte4Byte3Byte2Byte1Word7Word3Byte000000H字未对齐Doubleword1Doubleword2Doubleword5Doubleword3双字未对齐〔a〕非对正的双字边界的双字存储〔b〕对正的双字存储

A011001101

AB

地址存储器(二进制)存储器(十六进制)

地址021051602104160000000100100011存储器(十六进制)000210F160210E16

01

23

(b)

(a)021031602102160210116021001610101011

CD

55

FF0210D160210C160210B160210A16××××××××××××××××××××××××〔a〕其中0123H存放在02104H处,此地址是对正的双字边界地址,而ABCD存放的起始地址是02102H,而该字的对正的双字边界应为02100H。完整的双字是0123ABCDH。逻辑地址与物理地址之间的关系:段基址为002B0H,偏移地址为0013H,物理地址为002C3H。

段基址为002C0H,偏移地址为0003H,物理地址为002C3H。

~~逻辑地址

~2C4H2C3H2C2H2C1H2C0H2BFH2BEH2BDH2BCH2BBH2BAH2B9H2B8H2B7H2B6H2B5H2B4H2B3H2B2H2B1H2B0H段基址

偏移(3H)

偏移(13H)段基址物理地址图表示堆栈结构堆栈——是一个特殊的随机存储区,用于临时存放一些信息如数据或地址。对于实模式,堆栈区为64KB,按32K个字组织......

堆栈段...存储器〔字宽〕

0000HSPSS

FFFEH堆栈底部

堆栈顶部图PUSHAX指令执行前的堆栈状态堆栈~~

0011

2233

4455

6677

8899AABB

0123

4567

89AB

CDEF

0105

0008

1062

1060105E

105C

105A

1058

1056

1054

10521050SSSPTOS

堆栈底部

PUSHAX指令执行后、POPAX和POPBX执行后堆栈状况~~

1234

0011

2233

4455

6677

8899

AABB

3412

4567

89AB

CDEF

0105

0006

1062

1060105E

105C

105A

1058

1056

1054

10521050SSSPPUSHAXAXTOS~~

0011

2233

4455

6677

8899

AABB

3412

4567

89AB

CDEF

0105

0008

1062

1060105E

105C

105A

1058

1056

1054

10521050

1234SSSPPOPAXTOP控制存放器的作用〔1〕指令指针存放器(InstructionPointer)指令指针IP是16位的存放器,存放着下次将要执行的指令在代码段的偏移量。在80386及其高档处理器处于保护模式时,其指令指针存放器是32位的EIP。〔2〕标志存放器(FlagsRegister)FLAG存放器的各位用来存放各种不同的标志。算术运算指令和逻辑运算指令的运行结果都将定性地反映在不同的标志位上,以便后续的条件判断指令根据这些标志实现判断转移,判断转移的实质是修改CS和IP。这也正是计算机能够实现判断转移的底层原理。6个状态标志:OF、SF、ZF、AF、PF、CF3个控制标志:IF、DF、TF;7位保存;标志存放器CF:进位标志,在进行字/字节运算产生进位或借位时置1,否那么置0。PF:奇偶性标志,结果有偶数位为1时置1,否那么置0。AF:辅助进位标志,当进行字节运算有低4位向高4位进位或借位时置1,否那么置0。在作BCD码运算时常常使用。ZF:零标志,当运算结果为0时置1,否那么置0。SF:符号标志,运算结果为负,即结果最高位为1时置1,否那么置0。TF:陷阱标志,假设IF=1,那么在执行指令时产生单步中断。IF:中断标志,假设IF=1开中断,响应可屏蔽中断;IF=0,关中断。DF:方向标志,DF置1引起串操作指令的变址存放器自动减值,DF置0引起串操作指令的变址存放器自动增值。OF:溢出标志,运算溢出时自动置1,当它为1时可用溢出中断指令产生中断。机器语言〔machinelanguage)CPU执行的程序都是用机器语言写成的。机器代码是二进制代码,一条机器语言指令长度,可以是1个字节或多个字节。微处理器只能理解机器语言,但直接用机器语言写程序几乎是不可能的。因此程序常采用其它语言来编写。汇编语言〔Assembler〕2.2寻址方式程序〔program〕源代码(sourcecode)目标代码〔objectcode)编译(assember)连接(link)指令(instruction)指令系统(指令集)操作码(opcode)操作数〔operand)目标操作数〔destinationoperand)源操作数(sourceoperand)指令格式操作码字段操作数地址字段地址结构二地址单地址隐含地址根本指令长度1-6字节。寻址方式形式地址有效地址EA物理地址PA利用汇编语言编写程序具有以下优点:〔1〕用汇编语言编写的程序,程序的代码短,程序占用的内存少,程序运行速度要比用高级语言写的程序快;〔2〕汇编语言给予程序设计者更强的能力,实现高技术任务,而这些任务假设用高级语言是难以实现或根本不能实现;〔3〕汇编语言的知识,有助于理解微处理器的结构,这是高级语言所没有的;〔4〕驻留程序和中断效劳程序总是用汇编语言开发汇编语言语句的一般格式是:标号:指令;注释例:START:MOVAX,BX;COPYBXINTOAXSTART是该指令的地址标识,叫做标号〔Label〕。在指令后面由分号〔;〕标识的是注释。00138A24NEXT:MOVAH,[SI];MOVEABYTE其中8A24是指令MOVAH,[SI]的机器码,这是一条双字节指令,该指令的存储器地址是0013H和0014H。汇编指令的书写形式一条汇编指令通常可以写成如下形式:[标号:]操作码[目标操作数][,源操作数][;注释]

〔1〕其中[]中的内容为可选项。〔2〕标号必须是用字母打头的字母或数字组成的字符串,标号供转移指令作为转移的目标。〔3〕指令末尾的分号表示由‘;’起直至〈ENTER〉前均为注释局部,在输入源程序时,每一条汇编指令的末尾必须输入换行键〈ENTER〉表示本指令的结束,下一指令的开始。汇编指令的书写形式操作码目标操作数,源操作数

一条能汇编成机器代码指令的汇编指令必须有唯一的操作码。操作码是汇编指令的关键字,它指出该指令要做什么。一条汇编指令中的源操作数用来指出指令处理的对象来自何处。一条汇编指令中的目标操作数用来指出指令的处理结果置于何处。在许多指令中目标操作数既表示处理的对象之一来自何处,又指出处理的结果置于何处。目标操作数总是紧接着操作码出现在源操作数的左边,因此有也称目标操作数为左源。汇编指令的书写形式操作码目标操作数,源操作数

指令行中可以没有源操作数和目标操作数。在这种情况下通常是对某一固定的或称作隐含操作数的操作。指令行中可以没有源操作数而仅含目标操作数。这时目标操作数既指出处理对象来自何处,又指出处理结果置于何处。这种指令被称为单操作数指令。指令行中既有源操作数又有目标操作数的指令称为双操作数指令。双操作数指令中目标操作数一定出现在源操作数的左边。寻址方式就是寻找指令中的操作数的方式,寻址主要是指寻找内存数据的地址。几个概念寻址方式:根据指令中给出的地址寻找真实操作数地址的方式形式地址:指令中的地址码字段给出的地址有效地址:能够直接访问的存储器地址物理地址:存储器地址汇编指令的书写形式举例: LOOP1:AAA ;此处可添加注释<ENTER> MOVAX,053H ;此处可添加注释<ENTER> INCDH ;此处可添加注释<ENTER>第一条指令:带标号LOOP1,AAA是操作码,这一指令隐含使用固定操作数AL;第二条指令:MOV是操作码,双操作数指令,AX是目标操作数,053H是源操作数第三条指令:INC是操作码单操作数指令在DOS下运行汇编程序,注释局部只能用英文和ASCII码符号书写,在中文操作系统下那么可用中文书写,<ENTER>是指换行键。操作码通常是指指令功能的助记符,它给出了指令功能便于记忆的形式,例如,MOV是Movement的缩写等。三种类型的操作数〔1〕立即数〔2〕存放器〔3〕内存单操作数指令的操作数只能是存放器操作数或内存操作数。双操作数指令的目标操作数只能是存放器操作数或内存操作数,而源操作数可以是三者之一,但是两操作数不能同时为内存操作数。〔1〕立即数操作数立即数操作数作为代码指令的一局部出现在双操作数指令中。除了乘法、除法和字符串操作指令之外,立即数操作数均可作为源操作数。立即数操作数在汇编指令中可以以十六进、八进制、二进制或十进制形式书写,例如0F0H、777Q、101B、99D等,注意,在用十六进制书写时第一个字符是非数字0~9时,前面一定要补一个0,例如,FAH应记为0FAH。汇编指令中立即数操作数还可以以一个表达式的形式出现,此时该立即数就是表达式的值。〔2〕存放器操作数存放器操作数是以存放器的内容参加运算,或用存放器存放结果。MOVAX,3456H中的AX,MOVDL,41H中的DL就是存放器操作数。段存放器的内容指出当前4个段的基址,这些存放器不能用一般的传送指令将立即数送入。如果需要将立即数置入段存放器中的DS、ES或SS,那么首先应将该值送入AX或其他通用存放器,然后再由AX传送给DS、ES或SS。至于CS因其与指令地址有关,一般不需用户干预。标志存放器FLAG的各位在执行算术逻辑运算指令后一般均被修改,其状态将依指令及执行结果而定,它可以反映出当时处理器和累加器所检测到的结果。标志存放器一般不能作为操作数,但可用标志指令或INC、DEC、ADD、MUL、DIV等来处理。通用存放器(AX、BX、CX、DX、SP、BP、SI、DI、AH、AL、BH、BL、CH、CL、DH、DL)和指针及变址存放器(BX、BP、SI、DI)均可参加算术和逻辑运算操作。虽然经常把AX作为累加器,但所有通用存放器均可用作累加器。通用存放器在单操作数指令中可作目标操作数,在双操作数指令中既可作源操作数也可作目标操作数。〔2〕存放器操作数一些汇编指令中虽然没有显式地写有存放器,但是它却隐含着使用所指定的通用存放器,详见表。指令隐含应用AAA,AAD,AAM,AASAL,AHCBW,CWDAL,AH或AX,DXDAA,DASALIN,OUTAL或AXMUL,IMUL,DIV,IDIVAL,AX或AX,DXLAHF,SAHFAHLESESLDSDS循环或移位指令CL字符串操作指令CX,SI,DIXLATAL,BX〔3〕内存操作数内存操作数又称为存储器操作数,是指把内存某地址存放的字节、字作为指令的处理对象。这时要将该字节、字作为源操作数或目标操作数,当其作为源操作数时从内存中取出,或送到某个存放器,或参加运算等;当其作为目标操作数时,那么是将操作的结果置入该内存单元。无论是何种内存操作数,关键是必须找到其所在地址,即必须指出其所在段和相对于段首的位移(即有效地址EA),才能确定其物理地址。内存操作数地址确实定是寻址规那么的重点。内存操作数所在段的段存放器的名字在汇编指令中一般是不写的,它遵循着如前面的表所示的隐含原那么,根据内存操作数类型的不同相应使用不同的段存放器。寻址方式与数据有关的寻址方式 〔1〕隐含寻址方式 〔2〕立即数寻址(ImmediateAddressing) 〔3〕存放器寻址(RegisterAddressing) 〔4〕直接寻址(DirectAddressing) 〔5〕存放器间接寻址(RegisterIndexAddressing) 〔6〕存放器相对寻址(RegisterRelativeAddressing) 〔7〕基址加变址寻址(BasedIndexedAddressing) 〔8〕相对基址变址寻址(BasedIndexedAddressing) 与转移地址有关的寻址方式 〔1〕段内直接寻址 〔2〕段内间接寻址 〔3〕段间直接寻址 〔4〕段间间接寻址I/O端口寻址(I/OPORTAddressing)1.8086的寻址方式

与数据有关的寻址方式:立即寻址MOVAX,3069H存放器寻址MOVAL,BH直接寻址MOVAX,[2000H]存放器间接寻址MOVAX,[BX]存放器相对寻址MOVAX,COUNT[SI]基址变址寻址MOVAX,[BP][DI]相对基址变址寻址MOVAX,MASK[BX][SI]存储器寻址1.隐含寻址方式2.立即寻址方式操作数直接存放在指令中,紧跟在操作码后,它作为指令的一局部存放在代码中。操作数叫做立即数。立即数可以是8位、16位。例:MOVAL,15H机器码如下:地址存储器内容指令01000HB015MOVAL,15H01002HXX下一条指令(1)立即寻址方式*

——操作数在指令中给出

MOVAL,5MOVAX,3064HMOVAL,‘A’*

只能用于

SRC字段*

SRC和DST的字长一致

MOVAH,3064H

3.存放器寻址方式指令的操作数存放在处理器的存放器中,指令指明存放器号,这些内部存放器包括段存放器和通用存放器,存放器可以分8位、16位。例:MOVAX,BXBX为源操作数,AX是目的操作数,该指令是将BX中的内容传送至AX,即传送后,BX的内容保持不变。

地址储器内容指令010008BC3MOVAX,BX01002XX下一条指令(2)存放器寻址方式*——操作数在指定的存放器中MOVAX,BXMOVAL,BHMOVAX,3064H*字节存放器只有AHALBHBLCHCLDHDL*SRC和DST的字长一致MOVAH,BX*CS不能用MOV指令改变MOVCS,AX4.存储器寻址操作数存放在存储器中。CPU首先计算这个操作数的物理地址PA〔physicaladdress〕,然后读或写这个操作数。PA=SBA:EA=段基址*16+偏移量SBA〔segmentbaseaddress〕一个物理存储器段的起始地址。EA〔effectiveaddress〕为操作数相对该存储器段开始的偏移量。其有效地址计算的公式如下:EA=base+index+displacementBase为基址存放器:BX、BP。Index为变址存放器:SI、DI,Displacement为位移量:16位或8位。隐含段前缀:DS:BX、DS:SI、DS:DI、SS:BP超越段前缀:可以利用其它的段存放器作为段基址,需要使用段超越,即将段存放器用显式方式“段存放器”:放在间接寻址存放器的左方括号前,如:MOVAL,ES:[SI]变址器汇编书写形式有效地址(EA)段寄存器物理地址SI[SI](SI)DS(DS)*10H+(SI)DI[DI](DI)DS(DS)*10H+(DI)BX[BX](BX)DS(DS)*10H+(BX)BP[BP](BP)SS(SS)*10H+(BP)〔1〕、直接寻址方式指令中地址码中给出的是有效地址,即形式地址就是有效地址。PA=段基址:直接地址段基址指:CS、DS、SS、ES例:MOVCX,DS:[BETA]地址存储器内容指令010008B0E3412MOVCX,DS:[BETA]01004XX设〔03234〕=0EDH,〔03235〕=0BEH,〔DS〕=0200H,BETA=1234H,指令执行后,将操作数0BEEDH传至CX。(3)直接寻址方式*

——有效地址EA由指令直接给出

例:MOVAX,[2000H]EA=2000H,假设

(DS)=3000H,那么PA=32000H*隐含的段为数据段DS*可使用段跨越前缀MOVAX,ES:[2000H]*操作数地址可由变量〔符号地址〕表示VALUEDB10MOVAH,VALUEMOVAX,VALUEMOVAX,WORDPTRVALUE50H30H32000AHAL3050(AX)=3050HMOVAX,[2000H];设(DS)=3000H执行结果(AX)=3050H可以用符号地址代替数值地址,如:MOVAX,VALUE;或者MOVAX,[VALUE]VALUE为存放操作数单元的符号地址。DATASEGMENTDB41H;偏移量0DB42H;偏移量1DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAGO:MOVAX,DATAMOVDS,AX

MOVDL,DS:[0] ;MOVAH,2INT21HMOVDL,DS:[1] ;INT21HMOVAH,4CHINT21HCODEENDSENDGODATASEGMENTA1DB41H;变量A1,偏移量0B1DB42H;变量B1,偏移量1DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAGO:MOVAX,DATAMOVDS,AX

MOVDL,A1 ;MOVAH,2INT21H

MOVDL,B1 ;INT21HMOVAH,4CHINT21HCODEENDSENDGO(2)、存放器间接寻址方式操作数的有效地址存放在通用存放器BX、BP、SI、DI中。例:MOVAX,[SI];其隐含的段存放器为DS,设DS=0200H,SI=1234H,所读取的操作数物理地址为03234H,读取的操作数为0BEEDH,传送至存放器AX中。地址存储器内容指令010008B04MOVAX,[SI]01002XX下一条指令..03234ED源操作数03235BE(4)存放器间接寻址*——EA在基址存放器(BX/BP)或变址存放器(SI/DI)中MOVAX,[BX]PA=16d(DS)+(BX)MOVAX,ES:[BX]PA=16d(ES)+(BX)MOVAX,[BP]PA=16d(SS)+(BP)*

不允许使用AX、CX、DX存放EAMOVAX,[CX]

*

SRC和DST的字长一致

MOVDL,[BX];[BX]指示一个字节单元

MOVDX,[BX];[BX]指示一个字单元*

适于数组、字符串、表格的处理举例

假设有指令:MOVAX,[BX];在执行时,(DS)=2000H,(BX)=1000H,执行指令后AX=50A0H.EA=1000H,物理地址为21000H这种寻址方式可以用于表格处理,执行完一条指令后,只需修改存放器内容就可取出表格中的下一项。〔3〕、基址〔变址〕寻址方式〔存放器相对寻址〕操作数的有效地址是由基址〔变址〕存放器中的内容加上偏移量。偏移量是8位或16位的。基址存放器:BX、BP变址存放器:SI、DI例:MOV[BX]+BETA,AL其中BETA为立即数,操作数的有效地址是EA=[BX]+BETA该指令也可以写成如下形式:MOVBETA[BX],AL或MOV[BX+BETA],AL

有效地址

=(BX)(BP

)8位

(SI)16位

(DI)+

位移量(5)存放器相对寻址方式*例:MOVAX,COUNT[SI]或MOVAX,[COUNT+SI]假设(DS)=3000H,(SI)=2000H,COUNT=100H,那么PA=32100H假设(32100H)=1234H,那么(AX)=1234H*适于数组、字符串、表格的处理假设DS=0200H,BX=1000H,BETA=1234H,AL=0EDH,那么指令执行后,指令的机器码及操作数按下述方式在存储器中存储:地址存储器内容指令0100088873412MOV[BX]+BETA,AL

01004XX下一条指令..04234ED

04235XX基址寻址常用于对一维数组的访问,用基地址指向一维数组的第一个元素的地址指针,用偏移量指向数组中要访问的元素。如图:Element0Element2...

数据结构...Elementn

偏移量基址存放器+存储器Elementn-1Element1

一个数组元素的变址寻址

Elementn-1Elementn...

数组...变址存放器

偏移地址+存储器Element0Element1Element2例如:MOVAX,[BP]+VARAMOVAX,VARA[BP]MOVAX,[BP+VARA]变址器汇编书写形式有效地址段寄存器物理地址SI[SI+disp](SI)+dispDS(DS)*10H+(SI)+dispDI[DI+disp](DI)+dispDS(DS)*10H+(DI)+dispBX[BX+disp](BX)+dispDS(DS)*10H+(BX)+dispBP[BP+disp](BP)+dispSS(SS)*10H+(BP)+disp举例:MOVAX,COUNT[SI],其中,COUNT为16位偏移量的符号地址。如果(DS)=3000H,(SI)=2000H,COUNT=3000H,那么EA=2000H+3000H=5000H物理地址=30000H+5000H=35000H执行结果(AX)=1234H(4)、基址变址寻址方式有效地址是基址存放器与变址存放器中数据之和。这种寻址模式可以被用于访问复杂的数据结构如二维数组。基址变址寻址的物理地址如下式所示:PA=段基址:基址+变址其有效地址如下:[BX+SI]或[BX][SI]表示:EA=(BX)+(SI)[BX+DI]或[BX][DI]表示:EA=(BX)+(DI)[BP+SI]或[BP][SI]表示:EA=(BP)+(SI)[BP+DI]或[BX][DI]表示:EA=(BP)+(DI)(6)基址变址寻址方式*MOVAX,[BX][DI]或MOVAX,[BX+DI]MOVAX,ES:[BX][SI]*适于数组、字符串、表格的处理*必须是一个基址存放器和一个变址存放器的组合MOVAX,[BX][BP]MOVAX,[SI][DI]有效地址=(BX)(SI)(BP

)(DI)+举例:MOVAX,[BX][DI]也可以表示为:MOVAX,[BX+DI]如果(DS)=2100H,(BX)=0158H,(DI)=10A5H,那么EA=0158H+10A5H=11FDH物理地址=21000H+11FDH=221FDH执行结果(AX)=1234H(7)相对基址变址寻址方式

MOVAX,MASK[BX][SI]

MOVAX,MASK[BX+SI]

或MOVAX,[MASK+BX+SI]

有效地址

=(BX)(SI)8位(BP

)(DI)16位++位移量访问存储器的方式偏移地址默认的段存放器可跨越的段存放器取指令CS无IP堆栈操作SS无SP一般数据访问DSCSESSSEABP作为基址的寻址SSCSDSESBP串操作的源操作数DSCSESSSSI串操作的目的操作数ES无DI段寄存器的使用规定其有效地址如下:[BX+SI+disp]表示:EA=(BX)+(SI)+disp[BX+DI+disp]表示:EA=(BX)+(DI)+disp[BP+SI+disp]表示:EA=(BP)+(SI)+disp[BP+DI+disp]表示:EA=(BP)+(DI)+disp以下表达形式是等价的:[BX][SI]+dispdisp[BX][SI]或[BX+SI]+disp[BX+SI+disp]但格式:BX[1000H+SI]、SI[1000H+BX]等是错误的,即所用存放器不能在”[“,”]”之外,该限制对存放器相对寻址方式的书写也同样起作用。

基址寄存器变址寄存器汇编书写形式有效地址段寄存器物理地址BXSI[BX+SI+disp](BX)+(SI)+dispDS(DS)*10H+EABXDI[BX+DI+disp](BX)+(DI)+dispDS(DS)*10H+EABPSI[BP+SI+disp](BP)+(SI)+dispSS(SS)*10H+EABPDI[BP+DI+disp](BP)+(DI)+dispSS(SS)*10H+EA相对基址变址寻址的有效地址形成举例:MOVAX,MASK[BX][SI]如果(DS)=3000H,(BX)=2000H,MASK=0250H,(SI)=1000H,那么物理地址=30000H+2000H+1000H+0250H=33250H执行结果(AX)=1234H相对基址加变址寻址方式与其它寻址方式之间的变形关系源操作数指令的变形源操作数的寻址方式只有一个偏移量MOVAX,[100H]直接寻址方式只有一个寄存器MOVAX,[BX]或MOVAX,[SI]寄存器间接寻址方式有一个寄存器和偏移量MOVAX,[BX+100H]或MOVAX,[SI+100H]寄存器相对寻址方式有二个寄存器MOVAX,[BX+SI]基址加变址寻址方式有二个寄存器和常数项MOVAX,[BX+SI+100H]相对基址加变址寻址方式5、与转移地址有关的寻址方式这些寻址方式用来确定转移指令及CALL指令的转向地址。〔1〕段内直接寻址〔Intrasegmentdirectaddressing〕〔2〕段内间接寻址〔Intrasegmentindirectaddressing〕〔3〕段间直接寻址〔Intersegmentdirectaddressing〕〔4〕段间间接寻址〔Intersegmentindirectaddressing〕〔1〕段内直接寻址〔Intrasegmentdirectaddressing〕转向的有效地址是当前IP存放器的内容和指令中指定的8位或16位偏移量之和。这是一种相对寻址方式;适用于条件转移及无条件转移指令,但当它用于条件转移时,位移量只允许8位,这称为短跳转。举例JMPNEARPRTPROGIAJMPSHORTQUESTPROGIA和QUEST均为转向的符号地址,在机器指令中,用偏移量来表示,符合程序再定位要求。在汇编指令中,如果偏移量为16位,那么在符号地址前加操作符NEARPRT,如果偏移量为8位,那么在符号地址前加操作符SHORT。〔2〕段内间接寻址〔Intrasegmentindirectaddressing〕转向有效地址是一个存放器或是一个存储单元的内容。这个存放器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的转向有效地址用来取代IP存

温馨提示

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

评论

0/150

提交评论