黄老师 发表于 2013-8-2 08:30:40

大工13春《汇编语言程序设计》第二章辅导资料

大工13春《汇编语言程序设计》第二章辅导资料
主    题:第三章80x86指令系统和寻址方式(第1-2节)
学习时间:2013年4月22日-4月28日
内    容:
第二章概述
这周我们将学习第三章中的第1-2节,寻址方式和指令系统。指令是汇编语言语句基本的组成部分,寻址是语句中获取待处理数据的基本方式,因此对于这两方面知识的理解和熟练掌握是学好汇编语言的基础。
第一节80x86的寻址方式
1、基本概念
1)指令:指令就是一组供计算机运行的代码。它由操作码和操作数两部分构成。其中操作码部分是指示计算机所要执行的操作,而操作数字段则指出在指令执行期间所需要的操作数所在的存储位置。
指令的一般格式是:
操作码   操作数    ………    操作数
2)比例因子:在寻址中,可用比例因子乘以变址寄存器的内容来取得变址值,它的值可以为1,2,4,8.
3)有效地址的计算公式:
   EA=基址+(变址 比例因子)+位移量
在存储器寻址方式中,不同的有效地址计算方式决定了不同的寻址方式。
4)段跨越前缀:段跨越前缀是伪操作中的段操作符,允许指令定义默认段规则之外的联用方式。
2、与数据有关的寻址方式
1)说明:这种寻址方式用来确定操作数地址从而找到操作数。
2)数据相关的寻址方式如下:
立即数寻址:操作数以立即数的形式直接出现在指令中,因而是一种最简单的寻址方式,举例如下:
MOV AL,5
MOV BX,0CDFH
寄存器寻址方式: 操作数在寄存器中,指令指定寄存器号,从寄存器中取得操作数,因而是一种指令周期比较短的寻址方式,举例如下:
MOV AX,BX
MOV ECX,EDX
说明:字操作,寄存器可以是AX,BX,CX,DX,SI,DI,SP及BP,字节操作寄存器可以使AL,AH,BL,BH,CL,CH,DL及DH,对于双子操作,寄存器可以使EAX,EBX,ECX,EDX,ESI,EDI,ESP和EBP。
直接寻址方式: 操作数的有效地址只需要一个位移量指示,位移量可以用存储单元地址或符号地址表示,举例如下:
      MOV AX,
      MOV AX,ADREE
说明:直接寻址方式操作数已经在存储单元中,这和上述的寄存器寻址有本质的区别。有了位移量,我们就可以利用存储器分段寻址的方法找到操作数的位置从而取出操作数。
符号地址就是一个标号,它也代表一个存储单元的地址,上例中ADREE也可以写成。注意立即数寻址和直接寻址在指令上就差一对括号,但是确是不同的指令。
    寄存器间接寻址方式: 操作数的有效地址在某一寄存器中,操作数本身在存储器中,举例如下
       MOV AX,
       MOV ECX,
   例如(DS)=2000H,(BX)=1000H,则物理地址=20000+1000=21000H,从而(AX)内容就是21000H单元中的数据
    说明:字操作寄存器可以使用BX,BP,SI,DI,双子操作寄存器可以使用EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDOI等8个通用寄存器,根据段默认规则,凡使用BP,ESP,EBP,默认段都为SS段,其他寄存器的默认段都为DS段。
    直接寻址和寄存器寻址并无本质区别,都是在存储器中查找操作数。假如存储单元中的值又为一地址的时候,为了取得它指向的存储单元中的操作数,至少需要两条传送指令,即相继的两条直接寻址和寄存器间接寻址指令,如
   ((Y))=5CH
      MOV CX,Y          (直接寻址)
MOV AX,       (寄存器间接寻址)
    寄存器相对寻址方式:操作数有效地址为基址寄存器或变址寄存器的内容和位移量之和,举例如下
       MOV AX,COUNT
       MOV EAX,TABLE
若(DS)=3000H,(SI)=2000H,COUNT=3000H,则物理地址=30000+2000+3000=35000H,从而(AX)=35000存储单元的数据。
注意:SI寄存器默认的段是数据段DS,DI寄存器默认的段是附加段ES。
    基址变址寻址方式:操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,举例如下
       MOV AX,
       MOV EDX,
    说明:这种寻址方式适用于表格和数组数据的处理,表格和数组的首地址放在基址寄存器中,变址寄存器则可以访问数组中的各个元素,由于两个寄存器都可以修改,因此它比直接寻址方式更加灵活。
    相对基址变址寻址方式:就是在基址变址寻址方式中加入一个位移量,有效地址是3部分内容之和,举例如下
       MOV AX,VALUE
       MOV EAX,ARRAY
    比例变址寻址方式:就是变址寄存器内容再乘以一个比例因子,与上述几种寻址方式没有太大的差别,只举几个例子即可
       MOV EAX,COUNT   (比例变址寻址)
       MOV ECX,   (基址比例变址寻址)
       MOV EAX,TABLE (相对基址比例变址寻址方式)
3)关于以上寻址方式的分类问题:按不同的标准可以分为不同的寻址种类,比如按操作数的存贮位置可以分为寄存器指令和存储器指令,按操作数的获取方式分类可以分为直接寻址指令和间接寻址指令等等。
3、与转移地址有关的寻址方式
1)基本概念:这类寻址方式寻址的目的不是取得操作数了,而是取得一个地址供指令跳转用,因而这类寻址方式用与于转移指令JMP和CALL指令中。
2)四种寻址方式:段内直接、段内间接、段间直接、段间间接。
3)近跳转和短跳转:在无条件转移指令(JMP)中,位移量为8位时称为短跳转,用操作符SHORT表示;位移量为16位时称为近跳转,用操作符NEAR表示
   4)段内寻址:指令转向的有效地址是当前IP寄存器内容和位移量之和,位移量采用符号地址时为段内直接寻址,如
      JMP SHORT QUEST
JMP NEAR PTR PROGIA   (PTR是伪操作中的属性操作符,PROGIA和QUEST都是符号地址)
   段内间接寻址转向的有效地址可以采用除立即数寻址方式外的任何一种数据寻址方式获得,举例如下
      JMP BX       (有效地址采用寄存器寻址)
      JMP TABLE(有效地址采用相对变址寻址)
      这两种段内寻址方式只需要把转向的有效地址送到IP寄存器中就可以实现段内转移了。
   5)段间寻址:为了实现段间转移必须知道跳转的段地址和偏移地址取代CS段和IP寄存器值就可以了,举例如下
      JMP FAR PTR NEXT      (段间直接寻址,FAR代表远跳转,NEXT为转向符号地址)
      对于段间间接寻址,必须用存储器中相继的两个字内容来取代IP和CS寄存器中的内容,获取存储单元地址的方式为数据寻址方式中除立即数和寄存器方式以外的任何一种寻址方式,举例如下
       JMP DWORD PTR
其中说明数据寻址方式为相对变址寻址方式,DWORD PTR为双字操作符,说明转向地址需取双字。
      
      第二节80x86的指令系统
1、指令系统分类
   80x86指令系统分为如下6类:
      1)数据传送指令
      2)算术指令
      3)逻辑指令
      4)串处理指令
      5)控制转移指令
      6)处理机控制指令
   这节中我们学习数据传送指令和算术指令
   2、数据传送指令:数据传送指令负责把数据、地址或立即数传送到寄存器或存储单元中,又可以分为如下5种:
      1) 通用数据传送指令
      2)累加器专用传送指令
      3)地址传送指令
      4)标志寄存器传送指令
      5)类型转换指令
   下面分别说明这5种传送指令
   3、通用数据传送指令:
      MOV                  基本传送
      MOVSX                  带符号扩展传送
      MOVZX                  带零扩展传送
      PUSH                   进栈
POP                  出栈
      PUSHA/PUSHAD         所有寄存器进栈
      POPA/POPAD             所有寄存器出栈
      XCHG                   交换
说明: 基本传送指令格式为: MOV DST,SRC
   其中DST为目的操作数,SRC为源操作数,MOV指令要求两个操作数至少有一个是寄存器方式。寄存器也可以是段寄存器,但不允许是代码段CS;带扩展位传送指令在MOV指令基础上将操作数做符号扩展或零扩展。
   进栈指令格式:PUSH SRC,执行的操作如下
         字操作:(SP) (SP)-2
               ((SP)+1,(SP)) (SRC)
         双字操作:(ESP) (ESP)-4
                   ((ESP)-3,(ESP)-2,(ESP)-1,(ESP)) (SRC)
   出栈指令格式:POP DST,执行的操作如下
         字操作:(DST) ((SP)+1,(SP))
               (SP) (SP)+2
         双字操作:(DST) ((ESP)+3,(ESP)+2,(ESP)+1,(ESP))
                   (ESP) (ESP)+4
堆栈段工作方式是指针始终指向栈顶,栈顶位低地址,栈底为高地址,并且遵循“后进先出”的方式工作。因此进栈后指针值要减小,出栈指针值要增加,先入栈的数据位于高地址,后入栈的数据位于低地址,并且后入栈数据出栈时先于先入栈数据。
   所有寄存器入栈出栈指令只需要注意寄存器进栈出栈顺序即可,进栈顺序为AX,CX,DX,BX,SP,BP,SI,DI,堆栈段示意图如下
…….      
(DI)
(SI)
(BP)
(SP)
(BX)
(DX)
(CX)
(AX)
…………
                     
               (SP)
       出栈顺序正好和进栈相反。
   交换指令格式为:XCHG OPR1,OPR2
       其中OPR为操作数,执行的操作就是实现两个操作数的数据互换
4、累加器专用传送指令
   IN            输入
   OUT         输出
   XLAT          换码
   说明:由于这组指令必须使用累加器EAX,AX或AL传送信息,因此称为累加器专用传送指令。需要注意这3种指令执行的操作,默认寄存器。
   I/O端口和CPU间通信都由IN/OUT指令来完成。I/O端口地址常放入DX寄存器中,故IN/OUT指令中的DX寻址时,实际是寄存器间接寻址。这部分指令在外部中断章节中会经常用到。
5、地址传送指令
    LEA             有效地址送寄存器
    LDS             指针送寄存器和DS
    LES             ………………..ES
    LSS             ………………….SS
说明:LEA指令是取得目的操作数的有效地址,因而下面两条指令是等效的,
    LEABX,LIST
    MOVBX,OFFSET LIST
   LDS,LES,LSS都是指针送寄存器和段寄存器指令,只是指定的段寄存器不同而已,这里只需要了解它们的执行过程即可。
6、标志寄存器传送指令
    LAHF             标志送AH
    SAHF             AH送标志寄存器
    PUSHF            标志进栈
    POPF             标志出栈
7、类型转换指令
    CBW            字节到字
    CWD            字到双字
    CDQ            双字到4字
    BSWAP            字节交换
说明:这组指令也是累加器类型转换指令,即将累加器中的内容进行类型转换。在转换时注意符号扩展。对于CWD指令,双字分别存放在AX和DX寄存器中,也遵循符号扩展方法。
下面我们讨论第二类指令系统:算术指令,包括加法指令,减法指令,乘法指令,除法指令
8、加法指令
    ADD               加法
    ADC               带进位加法
    INC               自增一
    XADD            交换并相加
说明:ADD于ADC常联合使用用来计算双精度数之和。加法指令还需要考虑对标志位的影响,尤其CF位和OF位。我们知道对于固定位数的数码能表示的数(十进制)的范围是有限的,比如8位数,无符号数表示0到255,带符号数为-128到127;16位数码,无符号数为0到65535,带符号数为-32768到32767,因此加法指令必须考虑溢出的情况,溢出又分为无符号数加法溢出和有符号数加法溢出两种情况。可以容易的得出结论:CF=1,代表无符号数的溢出情况,OV=1代表有符号数的溢出情况。
ADC及INC指令对条件码设置方法与ADD相同,但INC指令不影响CF位。
9、减法指令
   SUB                减法
   SBB                带借位减法
   DEC                自减一
   NEG                求补
   CMP                比较
   CMPXCHG            比较并交换
   CMPXCHG8B          比较并交换8字节
说明:减法指令和加法指令有对应的关系,因此很好理解。NEG求补指令即对操作数实现求补运算,条件码设置情况按求补后的结果设置,只有当操作数为0时,CF=0,其他情况CF均为1,OF位设置情况是只有操作数为-128(8位)或-32768(16位)时,OF=1,其他情况均为0;CMP指令只是比较另个操作数,从而设置标志寄存器相应标志位,并不改变操作数原有值;在减法指令中依然可以用CF位判定无符号数减法是否溢出,OF位判定带符号数减法是否溢出。当有借位是CF=1,说明结果出错。对于带符号数减法运算,若两个数符号相反,而结果的符号与被减数想反(与减数想同),则OF=1,代表结果错,除了这种情况,OF=0。
10、乘法指令
    MUL                无符号数乘法
    IMUL               带符号数乘法
说明:乘法指令中目的操作数必须是累加器,字运算是AX,字节运算是AL。8位数码乘积为16位,存放在AX中,16为数码乘积为32位存放在DX,AX中,DX存高位字,AX存低位字。乘法指令依然遵循符号扩展原则。乘法指令对除CF位和OF位以外的条件码均无定义。
11、除法指令
    DIV               无符号数除法
    IDIV                带符号数除法
说明:除法指令与乘法指令相对应,只是需要注意执行过程。除法指令中除数依然由累加器提供,16位由AX提供,32位由DX,AX提供,16位除法得到8位的商和余数,32位除法得到16位的商和余数。还要注意除法结果的保存位置,16位除法中,商在AL中,余数在AH中,32位除法中,商在AX中,余数在DX中。除法指令对所有条件码均无定义。还需要注意除法溢出问题,80x86中,是引用0类型中断处理程序处理除法溢出的。
本周要求掌握的内容如下:
基本概念:寻址方式和指令系统、有效地址、比例因子、近跳转,短跳转和远跳转、六类指令系统和两类寻址方式、堆栈、堆栈中的指针和入栈出栈概念等等。
基本理论:了解伪操作符中的段跨越操作符和属性操作符,直接寻址和立即数寻址的区别,寄存器寻址和寄存器间接寻址的区别,堆栈指令中,入栈和出栈过程,算术指令中溢出位的设置,带符号数乘法和除法操作数位置和结果位置。
练习:
(一)选择题
1.下列指令中与堆栈相关的有(    )。
A.PUSH            
B. POP            
C. DIV            
D. MUL
2. 下列指令中,不属于加法指令的是(    )。
A.ADD            
B. MOV            
C. ADC               
D. INC
(二)判断题
1. 不能用一条MOV指令实现以下传送:存储单元之间的传送;立即数至段寄存器的传送;段寄存器之间的传送。(    )√
2. 8086提供了加、减、乘、除四种基本算术运算,这些运算都可对字节或字进行运算,只可以对无符号数运算,不可对有符号数运算。(    )×
页: [1]
查看完整版本: 大工13春《汇编语言程序设计》第二章辅导资料