加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

微机汇编知识点总结

(2011-09-27 11:50:43)
标签:

微机

汇编

知识点

总结

教育

 

 

 

 

处理器内部寄存器

 

一、总线接口部件

① 4个段地址寄存器(CS、DS、ES、SS

DS  数据段寄存器 (Data Segment)    CS  代码段寄存器 (Code Segment)

ES  附加段寄存器 (Extra Segment)    SS  堆栈段寄存器 (Stack Segment)

这些段寄存器的内容与有效的地址一起,用于确定内存的物理地址。通常用CS、DS、ES以及SS用于确定代码段、数据段、附加段以及堆栈段的基地址。

② 16位的指令指针寄存器IP(Instruction Pointer)

指令指针寄存器IP,指示代码段中指令的偏移地址。

它与代码段寄存器CS联用,确定下一条指令的物理地址。

计算机通过CS : IP寄存器来控制指令序列的执行流程。

IP寄存器是一个专用寄存器。

③ 20位的地址加法器

④  6字节的指令队列缓冲器

二、执行部件

① 4个16位通用寄存器,即AX、BX、CX、DX;

它们还可以分成高8位和低8位两个独立的寄存器:

AH  BH  CH  DH

AL   BL   CL   DL

对其中某8位的操作,并不影响另外对应8位的数据

每个寄存器又有它们各自的专用目的:

1.         AX-累加器,使用频度最高,用于算术、逻辑运算以及与外设传送信息等

2.         BX-基址寄存器,常用做存放存储器地址

3.         CX-计数器,作为循环和串操作等指令中的隐含计数器

4.         DX-数据寄存器,常用来存放双字长数据的高16位,或存放外设端口地址

② 4个专用寄存器,即

Ø  基数指针寄存器BP(base pointer) 堆栈指针寄存器SP(stack pointer)

SP,BP指针寄存器用于寻址内存堆栈内的数据。

SP为堆栈指针寄存器(Stack Pointer),指示栈顶的偏移地址。

SP不能再用于其他目的,具有专用目的。

BP为基址指针寄存器(Base Pointer),表示数据在堆栈段中的基地址。

SP和BP寄存器与SS段寄存器联合使用以确定堆栈段中的存储单元地址。

Ø  源变址寄存器SI(source index)      目的变址寄存器DI(destination index);

变址寄存器常用于存储器寻址时提供地址,串操作类指令中,SI和DI具有特别的功能

③ 标志寄存器FR(Flag register)标志(Flag)用于反映指令执行结果或控制指令执行形式,8086处理器的各种标志形成了一个16位的标志寄存器FLAGS

标志的分类:分为状态标志和控制标志

6状态标志:用来记录程序运行结果的状态信息,许多指令的执行都将相应地设置它的状态。共有6个状态标志位:CF  ZF  SF  PF  OF  AF

3控制标志:可由程序根据需要用指令设置,用于控制处理器执行指令的方式

DF   IF   TF

1)         进位标志CF(Carry Flag)当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。

2)         辅助进位标志AF(Auxiliary Carry Flag)

若算术运算时D3位(低半字节)有进位或借位,则AF=1;否则AF=0这个标志主要由处理器内部使用,用于十进制算术运算调整指令中,用户一般不必关心。

3)     零标志ZF(Zero Flag)若运算结果为0,则ZF = 1;否则ZF = 0

4)         符号标志SF(Sign Flag)运算结果最高位为1,则SF = 1;否则SF = 0

有符号数据用最高有效位表示数据的符号所以,最高有效位就是符号标志的状态

5)     奇偶标志PF(Parity Flag)

当运算结果的低8位(最低字节)中“1”的个数为偶数时,PF = 1;否则PF = 0   PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作

6)         溢出标志OF(Overflow Flag) 若算术运算的结果有溢出,则OF=1;否则 OF=0

溢出的判断: 只有当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出,因为,此时的运算结果显然不正确。其他情况下,则不会产生溢出

溢出和进位的区别: 溢出标志OF和进位标志CF是两个意义不同的标志。进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确。溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。

溢出和进位的对比:

例1:49H + 6DH=B6H

无符号数运算:    73+109=182           范围内,无进位

有符号数运算:   73+109=182           范围外,有溢出

例2:BBH + 6AH=(1)25H

无符号数运算:    187+106=293          范围外,有进位

有符号数运算:    -69+106=37          范围内,无溢出

7)         方向标志DF(Direction Flag) 用于串操作指令中,控制地址的变化方向:

设置DF=0,存储器地址自动增加;  设置DF=1,存储器地址自动减少。

8)     中断允许标志IF(Interrupt-enable Flag)

用于控制外部可屏蔽中断是否可以被处理器响应:

设置IF=1,则允许中断;       设置IF=0,则禁止中断。

9)         跟踪标志TF(Trap Flag) 用于控制处理器进入单步操作方式:

设置TF=0,处理器正常工作;    设置TF=1,处理器单步执行指令。

处理器在每条指令执行结束时,便产生一个编号为1的内部中断,利用单步中断可对程序进行逐条指令的调试,这种逐条指令调试程序的方法就是单步调试

④  算术逻辑部件ALU(arithmetic logic unit)

8086的引脚信号

1)最小模式( MN/MX接+5V)

① AD15~AD0,地址/数据总线

② A19/S6~A16/S3,地址/状态总线

③ BHE/ S7,高8位数据允许/状态线

④ MN/MX,最小/最大模式控制信号,输入

⑤ RD,读信号

⑥ WR,写信号

⑦ M/IO,存储器/输入输出控制信号

⑧ALE,地址锁存允许信号

⑨READY(Ready),准备就绪信号

⑩INTR,可屏蔽中断请求信号

⑪INTA,中断响应信号

⑫NMI,非屏蔽中断请求信号

⑬RESET,系统复位信号

⑭DEN,数据允许信号

⑮DT/R,数据发送/接收控制信号

⑯HOLD,总线保持请求信号输入

⑰HLDA,总线保持响应信号

⑱TEST,测试信号

⑲CLK,时钟输入信号

⑳VCC(+5V),GND

(2)最大模式( MN/MX接地)

①QS1/QS0,指令队列状态信号。

②S2、S1、S0 ,总线周期状态信号。

③LOCK ,总线封锁信号。

④RQ/GT1和RQ/GT0 ,总线请求信号输入/总线请求信号允许输出。

物理地址和逻辑地址

对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H~FFFFFH。分段后在用户编程时,采用逻辑地址(即段首地址加段内偏移地址),其形式为:段基地址 : 段内偏移地址

 物理地址和逻辑地址的转换:将逻辑地址中的段地址左移4位,加上偏移地址就得到20位物理地址。一个物理地址可以有多个逻辑地址

 

寻址方式

与数据有关的寻址方式:以 MOV 指令为例

立即寻址     MOV  AX , 3069H

寄存器寻址   MOV  AL , BH

直接寻址      MOV  AX , [ 2000H ]

寄存器间接寻址    MOV  AX , [ BX ]

寄存器相对寻址    MOV  AX , COUNT [ SI ]

基址变址寻址      MOV  AX , [ BP ] [ DI ]

相对基址变址寻址  MOV  AX , MASK [ BX ] [ SI ]

(1)     立即寻址方式:数据在指令中给出

指令格式: MOV  AL, 5     MOV  AX, 3064     MOV  AL, ‘A’

只能用于SRC字段(源操作数字段):MOV  40H, AL  ´

SRC 和 DST 的字长必须一致MOV  AH, 3064H  ´

(2)     寄存器寻址方式:数据在指定的寄存器中

例: MOV  AX, BX    MOV  AL, BH     MOV  AL, BL

字节寄存器只有  AH  AL  BH  BL  CH  CL  DH  DL

SRC 和 DST 的字长必须一致: MOV  AH, BX    ´

CS 不能用 MOV 指令改变     MOV  CS, AX    ´

(3)     直接寻址方式:指令给出了数据所在的存储单元的段偏移地址(有效地址EA)

                                                   

 

注意:隐含的段为数据段 DS

可使用段跨越前缀           MOV  AX, ES: [2000H]

(4)     寄存器间接寻址:存储单元的段偏移地址在基址寄存器(BX/BP)或变址寄存器(SI/DI) 中

例:MOV   AX, [BX]    MOV   AX, ES:[BX]    MOV   AX, [BP]

存放段基地址的段寄存器有如下三种可能:

1)         若以SI/DI/BX间接寻址,则段基地址在数据段寄存器DS中;

2)         若以寄存器BP间接寻址,则段基地址在堆栈段寄存器SS中;

3)         若指令中规定是段超越的,也可以寻访其他段

若以SI/DI/BX间接寻址,则段基地址在数据段寄存器DS中(左图)

若以寄存器BP间接寻址,则段基地址在堆栈段寄存器SS中(右图)

 

(5)     寄存器相对寻址(直接变址寻址) :段偏移地址由指定的寄存器内容和指令中给定的8位或16位偏移量相加得到

 

例:

MOV   AX, COUNT[SI]              

MOV   AX, [COUNT+SI]

其中COUNT为16位位移量的符号地址

(6)     基址变址寻址:段偏移地址是由一个基址寄存器(BX/BP)和一个变址寄存器(SI/DI)的内容相加得到

例:MOV   AX, [BX][DI]    MOV   AX, [BP][DI]      

若使用的基址寄存器是BX,则默认段寄存器为DS;

若使用的基址寄存器是BP,则默认段寄存器为SS;

同样可以使用段超越,如:MOV AX,ES:[BX][SI]

 例:MOV  AX,[BX][DI]     若(DS) = 2100H;(BX) = 0158H;(DI)=10A5H

(7) 相对基址变址寻址:段偏移地址是由一个基址寄存器(BX/BP)、一个变址寄存器(SI/DI)的内容和一个8位/16位位移量相加得到

例MOV AX, MASK [BX] [SI]  MOV  AX,  MASK [BX+SI]   MOV  AX, [MASK+BX+SI]

段 寄 存 器 的 使 用 规 定

8086的指令系统

一、数据传送指令

1、通用数据传送指令:MOV;      PUSH;      POP;     XCHG

2、累加器专用传送指令: IN;OUT;XLAT 这组指令只限于累加器AX,AL。

3、地址传送指令:LEA ;      LDS;       LES

4、标志寄存器传送指令:

   LAHF;        SAHF;          PUSHF;    POPF

 (标志入AH)  (AH入标志)   (标志入栈)  (标志出栈 )

5、类型转换指令:CBW;    CWD

01.通用数据传送指令

传送指令:    MOV    DST,  SRC

执行操作:    (DST)  ¬  (SRC)

注意: DST、SRC 不能同时为段寄存器       MOV  DS, ES ´

     立即数不能直接送段寄存器          MOV  DS, 2000H ´

     DST 不能是立即数和CS  

DST、SRC 不能同时为存储器寻址    不影响标志位

进栈指令:   PUSH  SRC

执行操作:  (SP)  ¬  (SP) – 2             ( (SP)+1,  (SP) )  ¬  (SRC)

出栈指令:   POP  DST

执行操作:  (DST)  ¬  ( (SP)+1,  (SP) )     (SP)  ¬  (SP) + 2

堆栈:‘先进后出’的存储区,段地址存放在SS中,

      SP在任何时候都指向栈顶,进出栈后自动修改SP

注意:   堆栈操作必须以字为单位。 不影响标志位

不能用立即寻址方式   PUSH  1234H  ´      DST不能是CS  POP  CS  ´

交换指令:   XCHG  OPR1, OPR2

执行操作:   (OPR1)  «  (OPR2)

注意: 不影响标志位   不允许使用段寄存器例: XCHG  BX, [ BP+SI ]    XCHG  AL, BH

02.累加器专用传送指令(只限于使用累加器AX或AL)

输入指令    IN   (完成从I/O到CPU的信息传送)

长格式:    IN   AL, PORT   (字节)                ;前256个端口

            IN   AX, PORT   (字)

执行操作:(AL)  ¬  ( PORT )   (字节)

          (AX)  ¬  ( PORT+1,  PORT )(字)

短格式:    IN   AL, DX   (字节)            ;先将端口号送DX

            IN   AX, DX   (字)

执行操作:(AL)  ¬  ( (DX) )  (字节)

          (AX)  ¬  ( (DX)+1,  (DX) )(字)

输出指令   OUT   (完成从CPU到I/O的信息传送)

长格式:   OUT   PORT, AL  (字节)

           OUT   PORT, AX  (字)

执行操作:( PORT )  ¬  (AL)    (字节)

          ( PORT+1, PORT )  ¬  (AX)(字)

短格式:   OUT   DX, AL  (字节)

           OUT   DX, AX  (字)

执行操作:( (DX) )  ¬  (AL)      (字节)

          ( (DX)+1, (DX) )  ¬  (AX)(字)

注意:    * 输入指令和输出指令不影响标志位

        * 前256个端口号00H~FFH可直接在指令中指定(长格式)

        * 如果端口号³ 256,端口号 ® DX(短格式)

例1:   IN       AX, 28H                 MOV   DATA_WORD, AX

例2:   MOV  DX, 3FCH                  IN      AX, DX

例3:   OUT  5, AL

例4:   测试某状态寄存器(端口号27H)的第2位是否为1

               IN         AL, 27H

               TEST    AL, 00000100B

               JNZ      ERROR                  ;若第2位为1,转ERROR处理

换码指令:XLAT  或 XLAT  OPR

执行操作:(AL)  ¬  ( (BX) + (AL) )                (将BX中的内容和AL中的内容相加,作为有效地址EA,并在一个表格中找出该单元的内容,将其放入AL中)

例:MOV  BX, OFFSET TABLE         ; (BX)=0040H

    MOV  AL, 3

    XLAT  TABLE                    指令执行后 (AL)=33H

注意:       不影响标志位

            字节表格(长度不超过256)       首地址 ® (BX)

            需转换的代码位移量  ® (AL)

03.地址传送指令

有效地址送寄存器指令(Load Effective Address):     LEA  REG, SRC

执行操作:   (REG) ¬ SRC

指针送寄存器和DS指令(Load DS with pointer):LDS  REG, SRC

执行操作:   (REG) ¬  (SRC)      (DS)  ¬ (SRC+2)     相继二字 ® 寄存器、DS

指针送寄存器和ES指令(Load ES with pointer):LES  REG, SRC

执行操作:   (REG)  ¬  (SRC)     (ES)  ¬  (SRC+2)   相继二字 ® 寄存器、ES                      

04.标志寄存器传送指令(影响标准位)

标志送AH指令:    LAHF    (Load AH with Flags)

执行操作:          (AH) ¬ (FLAGS的低字节)

AH送标志寄存器指令:   SAHF    (Store AH into Flags) 

执行操作:          (FLAGS的低字节) ¬  (AH)

标志进栈指令:    PUSHF    (PUSH the Flags)

执行操作:          (SP)  ¬  (SP) – 2              ( (SP)+1,  (SP) )  ¬  (FLAGS)

标志出栈指令:    POPF    (POP the Flags)

执行操作:          (FLAGS)  ¬  ( (SP)+1,  (SP) )    (SP)  ¬  (SP) + 2

05.类型转换指令

CBW          AL ® AX    (Convert Byte to Word)

执行操作: 若(AL)的最高有效位为0,则(AH)= 00H  若(AL)的最高有效位为1,则(AH)= FFH

CWD         AX ® (DX,AX)    (Convert Word to Double word)

执行操作:若(AX)的最高有效位为0,则(DX)= 0000H

若(AX)的最高有效位为1,则(DX)= FFFFH

例:(AX) = BA45H

    CBW              ; (AX)=? 

    CWD              ; (DX)=FFFFH  (AX)=BA45H

注意: *无操作数指令       *隐含对AL 或AX 进行符号扩展          *不影响标志位

二、算术指令

1、加法指令:ADD;      ADC;      INC

2、减法指令:SUB;       SBB;      DEC;     NEG;   CMP

3、乘法指令:MUL;      IMUL;

4、除法指令:DIV;       IDIV;    

1、加法指令(注意:除INC指令不影响CF标志外,均对条件标志位有影响)

加法指令:    ADD  DST, SRC 

执行操作:    (DST)  ¬  (SRC) + (DST)

带进位加法指令:  ADC  DST, SRC 

执行操作:    (DST)  ¬  (SRC) + (DST) + CF

加1指令:        INC  OPR 

执行操作:      (OPR)  ¬  (OPR) + 1

加法指令对条件标志位的影响

CF位表示无符号数相加时的进位(溢出)。   OF 位表示 带符号数相加时的溢出。

例:

假设: (DX) = 0002H    (AX) = 0F365H    (BX) = 0005H    (CX) =   8100H

分析下列指令序列的执行结果:

ADD  AX, CX     ; (1)

ADC  DX, BX     ; (2)  

 (1) 执行后,(AX) = 7465H   CF=1    OF=1    SF=0    ZF=0

 (2) 执行后,(DX) = 0008H   CF=0    OF=0    SF=0    ZF=0

2、减法指令(注意:   除DEC指令不影响CF标志外,均对条件标志位有影响。)

减法指令:       SUB  DST, SRC 

执行操作:       DST ¬  (DST) - (SRC)

带借位减法指令: SBB  DST, SRC 

执行操作:       DST ¬  (DST) - (SRC) - CF

减1指令:       DEC  OPR 

执行操作:       OPR ¬ (OPR) - 1

求补指令:       NEG  OPR 

执行操作:       OPR ¬  - (OPR) 

比较指令:       CMP  OPR1, OPR2

执行操作:       (OPR1) - (OPR2)  执行减法运算,不保存

减法指令对条件标志位(CF/OF/ZF/SF)的影响:

CF 位表示 无符号数 减法的借位(溢出)          OF 位表示 带符号数 减法的溢出。

例3.48:SUB [SI+14H],0136H

假设指令执行前,(DS)=3000H,(SI)=0040H,  (30054H)=4336H,分析指令执行完后的情况。

03.乘法指令

无符号数乘法指令:        MUL  SRC

带符号数乘法指令:        IMUL  SRC

执行操作:字节操作数  AX ¬  (AL) * (SRC)        字操作数   DX, AX ¬  (AX) * (SRC)

注意:   AL (AX) 为隐含的乘数寄存器。*  AX (DX,AX) 为隐含的乘积寄存器。

SRC不能为立即数。           除CF和OF外,对条件标志位无影响。

04.除法指令

无符号数除法指令:   DIV  SRC

带符号数除法指令:   IDIV  SRC

执行操作: 字节操作  AL ¬ (AX) / (SRC) 的商        AH ¬ (AX) / (SRC) 的余数

           字操作      AX ¬ (DX, AX) / (SRC) 的商  DX ¬ (DX, AX) / (SRC) 的余数注意:  AX (DX,AX) 为隐含的被除数寄存器  AL (AX) 为隐含的商寄存器。

      AH (DX) 为隐含的余数寄存器。      SRC不能为立即数。

      对所有条件标志位均无影响。

例3.56:设X , Y , Z , V 均为16位带符号数,分别存放于相应的单元中,

试编制程序计算:( V - ( X*Y + Z – 540 )  / X

MOV   AX, X

IMUL          ; x*Y →(DX,AX)

MOV   CX, AX

MOV   BX, DX

MOV   AX, Z

CWD              ; Z →(DX,AX)

ADD   CX, AX

ADC   BX, DX     ; X*Y+Z →(BX,CX)

SUB   CX, 540

SBB   BX, 0      ; X*Y+Z-540

MOV   AX, V

CWD              ; V →(DX,AX)

SUB   AX, CX

SBB   DX, BX     ; V-(X*Y+Z-540)

IDIV          ; (V-(X*Y+Z-540))/x→(AX),余数→(DX)

三、逻辑指令

1、逻辑运算指令:AND; OR; NOT; XOR; TEST

逻辑非指令:NOT  OPR                        OPR不能为立即数

执行操作:  (OPR) ¬  Ø (OPR)      不影响标志位

逻辑与指令:AND  DST, SRC

执行操作:  (DST) ¬  (DST) Ù (SRC)

逻辑或指令:OR  DST, SRC

执行操作:  (DST) ¬  (DST) Ú (SRC)

异或指令:  XOR  DST, SRC

执行操作:  (DST) ¬  (DST) " (SRC)

测试指令:  TEST  OPR1, OPR2

执行操作:  (OPR1) Ù (OPR2)

只做与操作,不保存结果

2、移位指令:SHL; SAL; SHR; SAR; ROL; ROR; RCL;RCR;

一般移位指令

逻辑左移(SHift logical Left ):SHL  OPR, CNT  

逻辑右移(SHift logical Right):SHR  OPR, CNT

算术左移(Shift Arithmetic Left):SAL  OPR, CN(同逻辑左移)

算术右移(Shift Arithmetic Right):SAR  OPR, CNT

循环移位指令

循环左移(ROtate Left):ROL  OPR, CNT

循环右移(ROtate Right):ROR  OPR, CNT

带进位循环左移(Rotate Left through Carry):RCL  OPR, CNT

带进位循环右移:RCR  OPR, CNT

移位指令需要注意的地方:

OPR可用除立即数以外的任何寻址方式

CNT=1,SHL    OPR, 1

CNT>1,MOV  CL,    CNT

SHL    OPR, CL           ; 以SHL为例

条件标志位:   CF = 移入的数值   

CNT=1时,最高有效位的值发生变化      CNT=1时,最高有效位的值不变

移位指令:       SF、ZF、PF 根据移位结果设置,AF无定义

循环移位指令:  不影响 SF、ZF、PF、AF

四、串操作指令

串操作指令通常需要与串重复前缀联合使用,串重复前缀有:

REP;      REPE/REPZ;      REPNE/REPNZ

串重复前缀REP (通常与MOVS、STOS、LODS等联用) 重复串操作,直到计数器(CX)=0为止

1、串传送指令 MOVS  (MOVe String)

格式:      MOVS    DST, SRC         ; 必须标明字或字节

MOVSB                            ; 字节

MOVSW                           ;

例:MOVS  ES: BYTE PTR [DI],  DS: [SI]

执行操作:

 (1)  ((DI) + (ES)左移1位) ← ((SI) + (DS)左移1位)

 (2)  字节操作:(SI)←(SI)±1,  (DI)←(DI)±1

字操作: (SI)←(SI)±2,  (DI)←(DI)±2

方向标志  DF=0 时用 + ,DF=1 时用 - 。

REP MOVS:将数据段中的整串数据传送到附加段中。源串(数据段)→ 目的串(附加段)

执行 REP MOVS 之前,应先做好:

(1) 源串首地址(末地址)→ SI

(2) 目的串首地址(末地址)→ DI

(3) 串长度 → CX

(4) 建立方向标志( 使用CLD 使 DF=0 或 STD 使 DF=1 )   

2、存入串指令 STOS  (STOre in to String)

格式:STOS    DST

STOSB                      ; 字节

STOSW                     ;

执行操作:   字节操作:((DI)+(ES)左移1位)←(AL),  (DI)←(DI)±1

             字操作:((DI)+(ES)左移1位)←(AX),  (DI)←(DI)±2

例:把附加段中mess2的 10 个字节缓冲区置为 20H

3、从串取指令 LODS  (LOaD from String)

格式:LODS    SRC

      LODSB                      ; 字节

      LODSW                     ;

执行操作:   字节操作:(AL)←((SI)+(DS)左移1位),  (SI)←(SI)±1

             字操作:(AX)←((SI)+(DS)左移1位),  (SI)←(SI)±2

注意:  源串一般在数据段中(允许使用段跨越前缀来修改) 目的串必须在附加段中

       不影响条件标志位

串比较指令CMPS和串扫描指令SCAS通常与

串重复前缀REPE/REPZ/REPNE/REPNZ联用。

串重复前缀REPE/REPZ重复串操作,直到

计数器(CX)=0或标志位ZF=0为止。

4、串比较指令 CMPS  (CoMPare String)

格式:   CMPS    SRC, DST

         CMPSB                              ; 字节

         CMPSW                             ;

执行操作: (1)  ((SI) + (DS)左移1位) - ((DI) + (ES)左移1位)

根据比较结果置条件标志位:相等 ZF=1       不等 ZF=0

           (2) 字节操作:(SI)←(SI)±1,  (DI)←(DI)±1

              字操作: (SI)←(SI)±2,  (DI)←(DI)±2       加或减看方向标志位

5、串扫描指令 SCAS  (SCAn String)

格式: SCAS     DST

       SCASB        (字节)

       SCASW       (字)

执行操作:   字节操作: (AL) - ((DI) + (ES)左移1位),  (DI)←(DI)±1

             字操作: (AX) - ((DI) + (ES)左移1位),  (DI)←(DI)±2   (只比较,不保存结果)

串比较和串扫描指令常用于: 从字符串中查找,字符比较两个字符串

五、控制转移指令

1、无条件转移指令          JMP

作用:转移到指令的地址去执行从该地址开始的指令。分段内和段间转移两种。前者只需改变 IP,而后者不仅要改变IP,还要改变CS。

段内直接短转移:JMP    SHORT  OPR

执行操作:(IP) ← (IP) + 8位位移量

段内直接近转移:JMP    NEAR PTR  OPR

执行操作:(IP) ← (IP) + 16位位移量

段内间接转移:    JMP    WORD PTR  OPR

执行操作:    (IP) ← (EA)

段间直接远转移:JMP    FAR PTR  OPR

执行操作:(IP) ← OPR 的段内偏移地址       (CS) ← OPR 所在段的段地址

段间间接转移:    JMP    DWORD PTR  OPR

执行操作:    (IP) ← (EA)                  (CS) ← (EA+2)

2、条件转移指令     JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、JLE / JNLE、 JCXZ

作用:当条件满足时,跳转到相应位置执行指令。共有30条条件转移指令,可分为四类:

(1)  根据单个条件标志的设置情况转移  

格式      跳转条件                      格式      跳转条件

JZ(JE)     OPR             ZF = 1        JNZ(JNE)  OPR             ZF = 0

JS         OPR             SF = 1        JNS       OPR             SF = 0

JO        OPR             OF = 1        JNO      OPR             OF = 0

JP        OPR             PF = 1         JNP       OPR             PF = 0

JC         OPR            CF = 1        JNC       OPR             CF = 0

(2)  比较两个无符号数,并根据比较结果转移

               格式            跳转条件

    <         JB (JNAE,JC)      OPR             CF = 1

    ≥         JNB (JAE,JNC)    OPR             CF = 0

    ≤         JBE (JNA)        OPR             CF∨ZF = 1

    >         JNBE (JA)        OPR             CF∨ZF = 0

*  适用于地址或双精度数低位字的比较

(3)   比较两个带符号数,并根据比较结果转移

                 格式         跳转条件

      <        JL (JNGE)       OPR           SF"OF = 1

      ≥        JNL (JGE)       OPR           SF"OF = 0

      ≤        JLE (JNG)       OPR         (SF"OF)∨ZF = 1

      >        JNLE (JG)       OPR          (SF"OF)∨ZF = 0

*  适用于带符号数的比较

(4)   判断 CX 的值,若为 0,则转移

             格式     跳转条件        

            JCXZ      OPR          (CX)=0

3、循环指令    LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE

循环指令:LOOP   OPR                           循环判断条件:(CX) ¹ 0

为零或相等时循环指令:LOOPZ/LOOPE  OPR       循环判断条件:ZF=1 且 (CX) ¹ 0

不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR 循环判断条件:ZF=0 且 (CX) ¹ 0

 

 

4、子程序调用和返回指令    CALL、RET

汇编语言中采用子程序结构,它相当于高级语言中的过程(如C的函数/C++的类)。将某些具有独立功能的部分程序编为独立的子模块,称为子程序。

子程序调用包括段内调用和段间调用两种。

段内直接近调用:CALL  DST

执行操作: (SP) ← (SP) – 2        ( (SP)+1,(SP) ) ← (IP)   ; 保存原来指令所在地址

           (IP) ← (IP) + 16位位移量

段内间接近调用:CALL  DST

执行操作: (SP) ← (SP) - 2       ( (SP)+1,(SP) ) ← (IP)        (IP) ← (EA)

段间直接远调用:CALL  DST

执行操作:(SP) ← (SP) – 2          ( (SP)+1,(SP) ) ← (CS)        (SP) ← (SP) - 2

          ( (SP)+1,(SP) ) ← (IP)      (IP) ← 偏移地址            (CS) ← 段地址

段间间接远调用:CALL  DST

执行操作: (SP) ← (SP) – 2           ( (SP)+1,(SP) ) ← (CS)      (SP) ← (SP) - 2

( (SP)+1,(SP) ) ← (IP)       (IP) ← (EA)              (CS) ← (EA+2)

子程序返回指令RET

段内近返回:RET

执行操作: (IP) ← ( (SP)+1,(SP) )            (SP) ← (SP) + 2

段间远返回:RET

执行操作: (IP) ← ( (SP)+1,(SP) )            (SP) ← (SP) + 2

           (CS) ← ( (SP)+1,(SP) )            (SP) ← (SP) + 2

5、中断与中断返回指令      INT、IRET

中断:当系统运行或程序运行遇到某些特殊情况,要求计算机能自动执行一组程序来处理(例如等待用户输入/显示到外设等),这就是中断。中断包括外部中断和内部中断两种。

中断操作,计算机同样需要保存现场,即IP、CS等。IBP-PC的中断是采用中断向量形式的。

中断向量:中断例行程序的入口地址(包括IP和CS)。中断向量存放于中断向量表中。

中断指令:  INT   TYPE  或  INT

执行操作: (SP) ← (SP) – 2       ( (SP)+1,(SP) ) ← (FLAGS)   (SP) ← (SP) - 2

           ( (SP)+1,(SP) ) ← (CS)   (SP) ← (SP) – 2           ( (SP)+1,(SP) ) ← (IP)

(IP) ← (TYPE*4)       (CS) ← (TYPE*4+2)

注意:*  TYPE (0~255) 是中断类型号, 隐含的类型号为3

INT 指令还把 IF 和 TF 置0,但不影响其它标志位

从中断返回指令:IRET

执行操作:(IP) ← ( (SP)+1,(SP) )   (SP) ← (SP) + 2              (CS) ← ( (SP)+1,(SP) )

          (SP) ← (SP) + 2        (FLAGS) ← ( (SP)+1,(SP) )     (SP) ← (SP) + 2

注意:IRET 指令执行完,标志位由堆栈中取出的值确定

六、处理机控制与杂项操作指令

1、标志处理指令CLC;STC;CMC; CLD; STD; CLI; STI 

•      CLC         ; CF ← 0

•      CMC        ; CF ØCF

•      STC         ; CF ← 1

•      CLD        ; DF ← 0

•      STD        ; DF ← 1

•      CLI         ; IF ← 0

•      STI         ; IF ← 1

注意:    只影响指令本身指定的标志

2、其他处理机控制与杂项操作指令NOP;   HLT;   WAIT;   ESC;   LOCK

NOP        (No OPration)无操作 (机器码占一个字节)

HLT        (HaLT)暂停机 (等待一次外中断,之后继续执行程序)

WAIT       等待 (等待外中断,之后仍继续等待)

ESC         (ESCape)换码

LOCK       封锁 (维持总线的锁存信号,直到其后的指令执行完)

注意:    不影响标志位

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有