登录 注册 发新帖 |
★◤nitct◢★
武林高手
|
[] ◤nitct◢求教原理高手...-->在指令中,指定操作数或操作数存放位置的方法称为寻址方式。操作数的各种寻址方式是用汇编语言进行程序设计的基础,也是本课程学习的重点之一。 微机系统有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式、相对基址加变址寻址方式等。其中,后五种寻址方式是确定内存单元有效地址的五种不同的计算方法,用它们可方便地实现对数组元素的访问。 另外,在32位微机系统中,为了扩大对存储单元的寻址能力,增加了一种新的寻址方式——32位地址的寻址方式。 为了表达方便,我们用符号“(X)”表示X的值,如:(AX)表示寄存器AX的值。 3.1 立即寻址方式操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。 立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如: MOV AH, 80H ADD AX, 1234H MOV ECX, 123456H MOV B1, 12H MOV W1, 3456H ADD D1, 32123456H 其中:B1、W1和D1分别是字节、字和双字单元。 以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。 立即数寻址方式通常用于对通用寄存器或内存单元赋初值。图3.1是指令“MOV AX, 4576H”存储形式和执行示意图。 ![]() 图3.1 立即寻址方式的存储和执行示意图寄存器寻址方式 指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。 指令中可以引用的寄存器及其符号名称如下: ![]() ![]() ![]() 寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。 1、源操作数是寄存器寻址方式 如:ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。 其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。在第4章将会学到如何定义它们。 2、目的操作数是寄存器寻址方式 如:ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。 3、源和目的操作数都是寄存器寻址方式 如:MOV EAX, EBX MOV AX, BX MOV DH, BL等。 由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。 直接寻址方式 指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。 在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。 例3.1 假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?
由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。 下面指令的目标操作数就是带有段前缀的直接寻址方式。 MOV ES:[1000H], AX 直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。 注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。 试比较下列指令中源操作数的寻址方式(VARW是内存字变量):
寄存器间接寻址方式
![]() ![]() 例3.2 假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?
例3.3 假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?
基址加变址寻址方式
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。 例3.4 假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如右式所示。 ![]() 指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。 例3.5 假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?
用D1来访问一维数组D1的第i个元素,它的寻址有一个自由度,用D2[j]来访问二维数组D2的第i行、第j列的元素,其寻址有二个自由度。多一个可变的量,其寻址方式的灵活度也就相应提高了。 相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。 MOV AX, [BX+SI+1000H] MOV AX, 1000H[BX+SI] MOV AX, 1000H[BX][SI] MOV AX, 1000H[SI][BX] 但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。 相对基址加变址寻址方式是以上7种寻址方式中最复杂的一种寻址方式,它可变形为其它类型的存储器寻址方式。表3.1列举出该寻址方式与其它寻址方式之间的变形关系。 表3.1 相对基址加变址寻址方式与其它寻址方式之间的变形关系
在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。 当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器,一个可乘1、2、4或8的32位变址寄存器,一个8位/32位的偏移常量,并且这三部分还可进行任意组合,省去其中之一或之二。 32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP; 32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。
2、默认段寄存器的选用取决于基址寄存器; 3、基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS; 4、在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。 下面列举几个32位地址寻址指令及其内存操作数的段寄存器。
3.9 操作数寻址方式的小结下面控件是学习和理解操作数寻址方式的控件,它把各种寻址方式的变化和限制组合在一起。通过它,读者能更进一步掌握寻址方式的书写格式。指令系统 指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有实现其它功能的指令,也有为某种特殊的应用而增设的指令。 通常,把指令按其功能分成以下几大类:
5.2.1 数据传送指令 数据传送指令又分为:传送指令、交换指令、地址传送指令、堆栈操作指令、转换指令和I/O指令等。 除了标志位操作指令SAHF和POPF指令外,本类的其它指令都不影响标志位。 1、传送指令MOV(Move Instruction) 传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。指令的格式如下: MOV Reg/Mem, Reg/Mem/Imm 其中:Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。在本网络课件的网页中,都将采用上述缩写,此后不再说明。 指令的功能是把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。在存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。 下面列举几组正确的指令例子:
在汇编语言中,主要的数据传送方式如图5.1所示。虽然一条MOV指令能实现其中大多数的数据传送方式,但也存在MOV指令不能实现的传送方式。 ![]() 图5.1 MOV指令数据传送示意图 对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。
对于规定2、4和7,我们可以用通用寄存器作为中转来达到最终目的。表5.1列举一个可行的解决方案,尽供参考。读者可考虑用其它办法来完成同样的功能。 表5.1 MOV指令的变通方法
对于情况1:不同位数数据之间的传送问题,在80386及其以后的CPU中,增加一组新的指令——传送-填充指令,它可把位数少的源操作数传送给位数多的目的操作数,多出的部分按指令的规定进行填充。引用: 快考试了。。。没上好课。。。没办法 不知道有没有计算机原理高手帮我说一下指令系统及控制器 网上能不能找到此类易懂 能快速学会的课件,,,多谢啊。。。 惭愧。。。。。 [ 本帖最后由 ★◤nitct◢★ 于 2007-5-19 15:37 编辑 ]
#1楼
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发帖时间:2007-05-19 15:20:08 |
回复数:29
|
游客组
|
|