汇编网首页登录博客注册
goal00001111的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  --
  • 『姓名』:                    
  • 『性别』:保密  『发送消息
  • 个人说明:当飞鸟失去飞翔的欲望,翅膀也会变成累赘;
    当理想与激情共舞,凡人也能成为英雄.
  • 详细信息『加为好友』
学习动态
好友圈

[2008-06-26 20:15] 推荐博文 学习笔记  第7章  更灵活的定位内存地址的方法

学习笔记  第7章  更灵活的定位内存地址的方法

        其实这些内容全部来自网络,与其说是学习笔记,不如说是转载文章。只不过我把三篇文章合成一块了,刚好作为第7章内容的一个补充和扩展。
文章来自:
“《汇编语言程序设计》课程教案”
网址:http://www2.jxust.cn/main/yzkc/hbyysj/ljnr/kcja/kcja32.htm
“《微机原理》远程教学”
网址:http://www.ahtvu.ah.cn/jxc1/zhykch/5124/jiaoxuefudao/xzfs1.htm
“北京邮电大学网络教学”。
网址:http://teach.jwc.bupt.cn:4213/jsjzcyl/pan1/Chap04/4.1.1.htm

操作码            

  指令字(简称指令)即表示一条指令的机器字。
  指令格式则是指令字用二进制代码表示的结构形式,由操作码字段和地址码字段组成。
  操作码字段表征指令的操作特性与功能;地址码字段通常指定参与操作的操作数的地址。
  操作码字段            地址码字段

  指令系统的每一条指令都有一个操作码,它表示该指令应进行什么性质的操作。
  不同的指令用操作码字段的不同编码来表示,每一种编码代表一种指令。
   指令的操作码表示该指令应进行什么性质的操作,组成操作码字段的位数一般取决于计算机指令系统的规模,较大的指令系统就需要更多的位数来表示每条特定的指令。一般说来,一个包含n位的操作码最多能够表示2n条指令。。例如,一个指令系统只有8条指令,则有3位操作码就够;如果有32条指令,那么就需要5位操作码。
对于一个机器的指令系统,在指令字中操作码字段和地址码字段长度通常是固定的。
在单片机中,由于指令字较短,为了充分利用指令字长度,指令字的操作码字段和地址码字段是不固定的,即不同类型的指令有不同的划分,以便尽可能用较短的指令字长来表示越来越多的操作种类,并在越来越大的存储空间中寻址。



地址码            

  根据一条指令中有几个操作数地址,可将该指令称为几操作数指令或几地址指令。
一般的操作数有被操作数、操作数及操作结果这三种数,因而就形成了三地址指令格式。在此基础上,后来又发展成二地址格式、一地址格式和零地址格式
         操作码          A1          A2          A3  (三地址指令)
         操作码          A1          A2          (二地址指令)
         操作码          A1                  (一地址指令)
         操作码                                (零地址指令)

注意:
(1)零地址指令的指令字中只有操作码,而没有地址码。
  (2)一地址指令常称为单操作数指令。通常这种指令以运算器中累加寄存器AC中的数据为被操作数,指令字的地址码字段所指明的数为操作数,操作结果又放回累加寄存器AC中。
 (AX) OP (A) -> AX   
OP表示操作性质;(AX)表示累加寄存器AX中的数;(A)表示内存中地址为A的存储单元中的数或运算器中地址为A的通用寄存器中的数; →表示把操作(运算)结果传送到指定的地方。
 (3)二地址指令常称为双操作数指令,它的两个地址码字段分别指明参与操作的两个数在内存中或运算器中通用寄存器的地址,A1作存放操作结果的地址。
 (A1) OP (A2) -> A1
 (4)三地址指令字中有三个操作数地址。
 (A1) OP (A2) -> A3     
A1为被操作数地址,也称源操作数地址; A2为操作数地址,也称终点操作数地址; A3为存放结果的地址。 同样,A1,A2,A3可以是内存中的单元地址,也可以是运算器中通用寄存器的地址。

二地址指令格式中,从操作数的物理位置来说,又可归结为三种类型。
存储器-存储器(SS)型指令:操作时都是涉及内存单元,参与操作的数都放在内存里,从内存某单元中取操作数,操作结果存放至内存另一单元中,因此机器执行这种指令需要多次访问内存。
寄存器-寄存器(RR)型指令:需要多个通用寄存器或个别专用寄存器,从寄存器中取操作数,把操作结果放到另一寄存器。机器执行寄存器-寄存器型指令的速度很快,因为执行这类指令,不需要访问内存。
寄存器-存储器(RS)型指令:执行此类指令时,既要访问内存单元,又要访问寄存器。



指令字长度          

指令字长度:一个指令字中包含二进制代码的位数。
机器字长:计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度。
指令字长度等于机器字长度的指令,称为单字长指令。指令字长度等于半个机器字长度的指令,称为半字长指令。指令字长等于两个机器字长度的指令,称为双字长指令。
使用多字长指令,目的在于提供足够的地址位来解决访问内存任何单元的寻址问题。其主要缺点是必须两次或多次访问内存以取出一整条指令,降低了CPU的运算速度,又占用了更多的存储空间。

等长指令字结构:各种指令字长度是相等的。这种指令字结构简单,且指令字长度是不变的,适用大中型计算机。
变长指令字结构:各种指令字长度随指令功能而异。结构灵活,能充分利用指令长度,但指令的控制较复杂,适用于微型和小型计算机。



指令助记符           

由于硬件只能识别1和0,所以采用二进制操作码是必要的,但是我们用二进制来书写程序却非常麻烦。
为了便于书写和阅读程序,每条指令通常用3个或4个英文缩写字母来表示。这种缩写码叫做指令助记符。
典型的指令助记符:
典 型 指 令           指令助记符           二进制操作码
  加 法            ADD             001
  减 法            SUB             010
  传 送            MOV             011
   跳 转            JMP             100
   转 子            JSR             101
   存 储            STR             110
   读 数            LDA             111

如上表所示,这里我们假定指令系统只有7条指令,所以操作码只需3位二进制。 由于指令助记符提示了每条指令的意义,因此比较容易记忆,书写起来比较方便,阅读程序容易理解。
需要注意的是,在不同的计算机中,指令助记符的规定是不一样的。因此,指令助记符还必须转换成与它们相对应的二进制码。这种转换借助汇编程序可以自动完成,汇编程序相当于一个“翻译”。


八位微型计算机的指令格式

8位微型机字长只有8位,指令结构是一种可变字长形式,包含单字长、双字长、三字长指令等多种。
操作码                                       (单字长指令)
操作码          操作数地址                         (双字长指令)  
操作码          操作数地址1          操作数地址2       (三字长指令)

内存按字节编址,所以单字长指令每执行一条指令后,指令地址加1。双字长指令或三字长指令每执行一条指令时,指令地址要加2或加3,可见多字长的指令格式不利于提高机器速度。



指令的寻址方式         

操作数或指令在存储器中的地址:某个操作数或某条指令存放在某个存储单元时其存储单元的编号。
在存储器中,操作数或指令字写入或读出的方式,有地址指定方式、相联存储方式和堆栈存取方式。
当采用地址指定方式时,形成操作数或指令地址的方式,称为寻址方式。
寻址方式分为两类,既指令寻址方式和数据寻址方式,前者比较简单,后者比较复杂。

指令的寻址方式有两种,一种是顺序寻址方式,另一种是跳跃寻址方式。
1. 顺序寻址方式:
指令地址在内存中按顺序安排,当执行一段程序时,通常是一条指令接一条指令的顺序执行。
从存储器取出第一条指令,然后执行这条指令;接着从存储器取出第二条指令,在执行第二条指令;接着再取出第三条指令……这种程序顺序执行的过程,我们称为指令的顺序寻址方式。
为此,必须使用程序计数器(又称指令指针寄存器)IP来计数指令的顺序号,该顺序号就是指令在内存中的地址。
2. 跳跃寻址方式:
当程序转移执行的顺序时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的地址码不是由程序计数器给出,而是由本条指令给出。程序跳跃后,按新的指令地址开始顺序执行。指令计数器的内容也必须相应改变,以便及时跟踪新的指令地址。采用指令跳跃寻址方式,可以实现程序转移或构成循环程序,从而能缩短程序长度,或将某些程序作为公共程序引用。指令系统中的各种条件转移或无条件转移指令,就是为了实现指令的跳跃寻址而设置的。
我们详细讲解跳跃寻址方式:
①段内直接寻址
段内直接寻址方式的汇编格式有三种:
格式1:指令名SHORT转移目标地址标号
格式2:指令名转移目标地址标号
格式3:指令名NEARPTR转移目标地址标号
指令中直接指明了要转移的目标地址,因此叫直接寻址。这种指令只改变IP寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。汇编这种指令寻址方式时,汇编程序计算转移目标地址标号与本条指令的下一条指令的地址的差值,将其补码称为位移量,写入指令的地址码字段。
执行这种寻址方式的转移指令时,机器取出位移量,与当前(IP)相加,和送入IP寄存器中,CS寄存器内容保持不变,从而实现转移。
可以看出,段内直接寻址方式实现的是相对转移。相对转移有个优点,就是位移量不会随程序加载到不同的内存区域而改变,因此不管程序加载到哪段内存区域,这种指令都能正确转移到目的地址。因此,使用这种转移指令可实现程序重定位。
位移量不同,转移范围不同。当位移量为8位时,只允许转移到与本条指令的下一条指令相距−128~+127范围内的存储单元去。当位移量为16位时,允许转移到当前代码段内任何地方。
要注意的是:条件转移指令的位移量只能是8位,子程序调用指令的位移量只能是16位,而无条件转移的指令可以是8位,也可以是16位。8位叫短跳转,16位叫近跳转。
②段间直接寻址
段间直接寻址方式的汇编格式有两种:
格式1:指令名FAR PTR转移地址标号
格式2:指令名段地址:段内偏移地址
指令中直接指明了要转移的目标地址,此转移地址或用地址标号表示,或用数值地址表示,因此叫直接寻址。
⑶段内间接寻址
段内间接寻址方式的汇编格式有两种:
格式1:指令名16位寄存器名
格式2:指令名WORD PTR存储器寻址方式
转移的目标地址放在寄存器或存储器中,因此叫寄存器间接寻址。这种指令只改变IP 寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。汇编这种指令寻址方式时,汇编程序按格式中规定的寻址方式填写地址码字段。当执行这种寻址方式的转移指令时,机器按照指令中规定的寻址方式寻址到一个字,然后把它送入IP寄存器中,CS寄存器的内容不变,从而实现转移。
④段间间接寻址
段间间接寻址方式的汇编格式有一种:
指令名DWORD PTR存储器寻址方式
转移的目标地址放在存储器中,因此叫间接寻址。这种指令不仅改变IP 寄存器的值而且改变CS寄存器的值,因此又叫段间寻址。汇编这种指令寻址方式时,汇编程序按格式中规定的寻址方式填写地址码字段。当执行这种寻址方式的转移指令时,机器按照指令中规定的寻址方式寻址到存储器中相继的两个字,把第一个字送入IP寄存器中,把第二个字送入CS寄存器,从而实现转移。
在微机指令系统中,JMP类和CALL类指令通常使用上述四种寻址方式,使程序从当前执行的位置跳转到指令寻址方式指定的地方继续运行,或是从指定的位置调用一个子程序。


操作数寻址方式        

形成操作数的有效地址的方法,称为操作数的寻址方式。
例如,一种单地址指令的结构如下所示,其中用X,I,D各字段组成该指令的操作数地址。
  操作码OP          变址X          间址I           形式地址D
指令中操作数字段的地址码是由形式地址和寻址方式特征位等组合形成,因此,一般来说,指令中所给出的地址码,并不是操作数的有效地址。 因此,寻址过程就是把操作数的形式地址,变换为操作数的有效地址的过程。
1. 隐含寻址
在指令中不明显的给出而是隐含着操作数的地址。例如,单地址的指令格式,没有在地址字段中指明第二操作数地址,而是规定累加寄存器AX作为第二操作数地址,AX对单地址指令格式来说是隐含地址。
2. 立即寻址
指令的地址字段指出的不是操作数的地址,而是操作数本身。这种方式的特点是指令执行时间很短,不需要访问存储器而是立即从指令中取得操作数。
例如:单地址的移位指令格式为
  OP(移位)           F           D
这里D不是地址,而是一个操作数。F为标志位,当F=1,操作数进行右移;当F=0时,操作数进行左移。
立即操作数可以是8位或16位,并且是指令的一部分。立即数据总是紧跟在指令操作码之后并和操作码一起存放在代码段中,因而立即数据总是和操作码一起被放入BIU中的指令队列里,在指令执行时不需再存取存储器。
由于在这种寻址方式中操作数是指令的一部分,不能修改,而一般情况下,指令所处理的数据都是在不断变化的,比如本条指令的操作数是上一条指令的执行结果。因此,这种寻址方式只能适用于操作数固定的情况。例如,给某一寄存器赋初值或给某存储单元提供常数等,例如:MOV  AX,1234H。
此外要注意,这种寻址方式不能用于单操作数指令;若用于双操作数指令,也只能用于源操作数字段,不能用于目的操作数字段。
3. 直接寻址
直接寻址特点是:在指令格式的地址字段中直接指出操作数在内存的地址D。
采用直接寻址方式时,指令字中的形式地址D就是操作数的有效地址E,既E=D。因此通常把形式地址D又称为直接地址。此时,由寻址模式给予指示。 如果用S表示操作数,那么直接寻址的逻辑表达式为:S =(E)=(D)。
汇编这种寻址方式时汇编程序计算出表达式的值并将其写入指令的地址码字段。当机器执行含有这种寻址方式的指令时,取出地址码字段的值作为操作数的偏移地址,取出DS寄存器的值作为操作数的段地址,这两个地址经计算后形成操作数的20位物理地址,继而得到操作数。
例如: MOV  AL,  DS:[2000H]
若DS=4000H,则此指令式将数据段中物理地址为42000H 单元的内容传送AL寄存器。
直接寻址方式默认的段寄存器是DS。IBMPC机允许在汇编指令中指定除DS寄存器以外的段寄存器作为操作数的段地址,这就是段超越前缀。
直接寻址方式一般适用于处理单个变量。
4. 间接寻址
间接寻址的情况下,指令地址字段中的形式地址D不是操作数的真正地址,而是操作数地址的指示器,D单元的内容才是操作数的有效地址。
如果把直接寻址和间接寻址结合起来,指令有如下形式:
  操作码           I           D
寻址特征位I=0,表示直接寻址,这时有效地址E=D;I=1,表示间接寻址,这时有效地址E=(D)。
间接寻址方式是早期计算机中经常采用的方式,但由于两次访存,影响指令执行速度,现在已不大使用。
5.        寄存器寻址方式和寄存器间接寻址方式
当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的地址编号。当机器执行含有这种寻址方式的指令时,根据地址码字段的编号访问到寄存器,继而得到操作数。
对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DL,SP或BP;而对8位操作数,寄存器可以是AH ,AL,BH,BL,CH,CL,DH或DL。
例如: MOV  AX,  BX
寄存器间接寻址方式与寄存器寻址方式的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。
操作数的有效地EA存放在基址寄存器(BX或BP)或变址寄存器(DI或SI)中。
例如: MOV  AX,  [BX]
它表示操作数在数据段中,存放单元与段基址的偏以量(即有效地址)在寄存器BX中。
寄存器间接寻址方式也允许指定段超越前缀来取得其他段中的数据。
例如:MOV AX,ES:[BX]
它表示将附加数据段偏移量(BX)处的字数据送到AX寄存器中去。
这两种寻址方式的优点是:寄存器数量一般在几个到几十个,比存储器单元少很多,因此它的地址码短,从而缩短了指令长度,节省了程序存储空间。另一方面,从寄存器里取数要比从存储器里取数的速度快得多,从而提高了指令执行速度。
6. 相对寻址方式
相对寻址是把程序计数器IP的内容加上指令格式中的形式地址D而形成操作数的有效地址。程序计数器的内容就是当前指令的地址。“相对”寻址,就是相对于当前的指令地址而言。
采用相对寻址方式的好处是程序员无须用指令的绝对地址编程,所编程序可以放在内存任何地方。此时形式地址D通常称为偏移量,其值可正可负,相对于当前指令地址进行浮动。
7. 基址寻址方式
基址寻址方式是将CPU中基址寄存器BX的内容加上指令格式中的形式地址而形成操作数的有效地址。
它的优点是可以扩大寻址能力。同形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。
8. 变址寻址方式
变址寻址方式与基址寻址方式计算有效地址的方法很相似,它把CPU中某个变址寄存器(SI或DI)的内容与偏移量D相加来形成操作数有效地址。 但使用变址寻址方式的目的不在于扩大寻址空间,而在于实现程序块的规律性变化。
9. 基址变址寻址方式
有效地址EA是由基址寄存器BX(或基址指示器BP)的内容与变址寄存器(DI或SI)的内容之和。
例如: MOV  AX,  [BX+SI]
表示将BX 的内容与SI的内容相加作为操作数存放单元距数据段基址的偏移值。
这种寻址方式用于访问表格或数组。将表格或数组首地址存入基址寄存器,通过修改变址寄存器内容可访问到表格或数组的任一数据项的存储单元。由于这种寻址方式两个寄存器内容都可修改,因此它比基址寻址和变址寻址都灵活。
10. 相对基址变址寻址方式
汇编时,汇编程序将基址寄存器的地址编号和变址寄存器的地址编号分别写入指令的地址码字段,并且将变量名的偏移地址、符号名的数值或数字表达式的计算结果值作为位移量也写入指令的地址码字段。
当机器执行含有这种寻址方式的指令时,依据地址码字段的值访问得到基址寄存器和变址寄存器的值以及位移量,将三者相加,和作为操作数的偏移地址。如果指令中指定的基址寄存器是BX,则操作数默认在数据段中,取DS寄存器的值作为操作数的段地址值;如果指令中指定的基址寄存器是BP,则操作数默认在堆栈段中,取SS寄存器的值作为操作数的段地址值,从而算得操作数的20位物理地址,继而访问到操作数。
例如: MOV  AH,  [BX+DI+1234H]
表示操作数地址是在数据段中,其在数据段的偏移量是BX的内容加上DI的内容再加上位移量1234H。
11. 块寻址方式
块寻址方式经常用在输入输出指令中,以实现外存储器或外围设备同内存之间的数据块传送。块寻址方式在内存中还可用于数据块搬家。块寻址时,通常在指令中指出数据块的起始地址(首地址)和数据块的长度(字数或字节数)。
如果数据块是变长的,可用三种方法指出它的长度: 
(1)指令中划出字段指出长度;
(2)指令格式中指出数据块的首地址与末地址;
(3)由块结束字符指出数据块长度。
操作码          首地址          标志位          末地址
12. 段寻址方式
微型机中采用了段寻址方式,例如它们可以给定一个20位的地址,从而有1M存储空间的直接寻址能力。
为此将整个1M空间存储器以64K为单位划分成若干段。在寻址一个内存具体单元时,由一个基地址再加上某些寄存器提供的16位偏移量来形成实际的20位物理地址。这个基地址就是CPU中的段寄存器。在形成20位物理地址时,段寄存器中的16位数会自动左移4位,然后以16位偏移量相加,即可形成所需的内存地址。
这种寻址方式的实质还是基址寻址。
评论次数(1)  |  浏览次数(1949)  |  类型(学习笔记) |  收藏此文  | 

[  starrynight   发表于  2008-06-27 10:58  ]

其实只是路过,不过,看完此文而不顶,于心不忍啊。

狂顶博主!

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码