汇编语言学习-基础篇2

来源:互联网 发布:go语言http json数据 编辑:程序博客网 时间:2024/06/06 00:09

1.8086模式下的指令介绍

        在介绍各个指令之前,需要说明的是当指令中的操作数带有SI, DI, BX时,如果不特别指定,则默认的使用数据段DS,如果操作数带有BP,则默认的使用堆栈段SS。

        下面说的8086下的指令格式以及分类

  指令表示的一般格式为:【标签:】 指令助记符 【操作数1  【操作数2】 】     【;注释】,标签的使用取决于程序的实现逻辑(标签本身不是指令),注释取决于编码人员的习惯。而指令中可以有两个操作数,例如MOV AX  [SI]  ;  也可以有一个操作数,例如PUSH AX;  也可以没有操作数,例如字转换指令CWD。指令按其功能特点可以分为如下六类:

         1.数据传送指令

               1.传送指令, 格式: MOV DST, SRC 。此指令把源操作数的一个字或字节送至目的操作数DST。数据传送指令可实现以下功能:

                             1.CPU内部寄存器之间的数据传送,例如:MOV AH,  AL。

                             2.立即数送至通用寄存器或存储器单元,例如:MOV AL.  3。

                             3.寄存器与存储器之间的数据传送,例如:MOV  BH,  [SI]。

               2.交换指令,格式:XCHG  OPPD1,  OPPD2。此指令时把操作数OPPD1的内容与操作数OPPD2的内容交换,例如:XCHG AL,  AH。

               3.地址传送指令,如下:

                             1.传送有效地址指令LEA,格式:LEA  REG,  OPRD。该指令把操作数OPRD的有效地址传送到操作数REG,OPRD必须是存储器操作数,REG必须是通用寄                                存器。

                                  例如:LEA  DX,  [BX + 3],即把BX + 3的值传送给DX

                             2.指令LDS,格式:LDS  REG,  OPRD。该指令把操作数OPRD中所含32位地址指针的段值部分传送到数据寄存器DS,把偏移量部分传送值寄存器REG。

                                  例如:LDS   DI,  [BX],即把BX对应的段值传送给DX,BX的值传送给DI。

                             3.指令LES,格式:LES  REG, OPRD。该指令把操作数OPRD所含32位地址指针的段值部分送到附加段寄存器ES,偏移部分传送给REG。

         2.堆栈操作指令

                堆栈的作用主要是保护现场和返回地址、保护寄存器内容、参数传递、存储局部变量。堆栈寄存器有两个,压栈PUSH,出栈POP,详细如下:

                              1.压栈PUSH,格式:PUSH SRC。该指令把源操作数压入栈。例如:PUSH  SI。

                              2.出栈POP,  格式: POP DST。该指令从栈顶弹出一个字数据到目的操作数DST。例如:POP [SI]。

         3.标志操作指令

                 标志指令包括四条标志位寄存器传送指令和七条设置或清除标志位的指令,具体如下:

                 1. 标志传送指令,

                               1.指令LAHF,格式:LAHF。LAHF采用固定寻址方式,该指令把标志寄存器的低8位(包括SF,ZF,AF,PF,CF)传送到寄存器AH的指定位,即AH需要指定的位必须与标志寄存器需要传送的位相同,如果标志寄存器的传送位为7,AH也要指定                                第7位。

                               2.指令SAHF, 格式: SAHF。SAHF采用固定寻址方式。改指令的功能与LAHF相反,把AH低8位传送至相应标志寄存器的SF,ZF,AF,PF,CF位。

                               3.指令PUSHF,格式:PUSHF。该指令把标志寄存器的内容压栈,此指令不改变标志寄存器。

                               4.指令POPF,格式:POPF。该指令把栈顶的一个字传送到标志寄存器。

                 2.标志操作指令

                                1.清进位标志指令,格式:CLC。该指令使进位标志位0。

                                2.置进位标志指令,格式:STC。改指令使进位标志位1。

                                3.进位标志取反指令,格式:CMC。该指令使进位标志取反。

                                4.清方向标志指令,格式:CLD。该指令使方向标志DF为0。

                                5.置方向标志指令,格式:STD。该指令使方向标志DF为1。

                                6.清中断允许标志指令,格式:CLI。该指令使中断允许标志IF为0。

                                7.置中断允许标志指令,格式:STI。该指令使中断允许标志IF为1。

         4.算术运算指令

                1.普通加法指令,格式:ADD  OPRD1,  OPRD2。该指令完成两个操作数的相加,结果送至目的操作数OPRD1。例如,ADD AL,  5。

                2.带进位加法指令,格式:ADC  OPRD1,  OPRD2。该指令完成两个操作数相加,同时还要把进位标志CF的现行值加上去,把结果送至目的操作数OPRD1。即OPRD1=OPRD1 + OPRD2 + CF。例如:ADC DX,  AX。

                3.加1指令,格式:INC  OPRD。该指令完成对操作数OPRD加1,然后把结果送回OPRD。例如:INC AL。

                4.普通减法指令,格式:SUB  OPRD1,  OPRD2。该指令完成两个操作数的相减,结果送至目的操作数OPRD1。例如,ADD AL,  5。

                5.带进(借)位加法指令,格式:SBB  OPRD1,  OPRD2。该指令完成两个操作数相减,同时还要把进位标志CF的现行值减去,把结果送至目的操作数OPRD1。即OPRD1=OPRD1 - OPRD2 -  CF。例如:ADC DX,  AX。

                6.加1指令,格式:DEC  OPRD。该指令完成对操作数OPRD减1,然后把结果送回OPRD。例如:DEC AL。

                7.取补指令,格式:NEG  OPRD。该指令对操作数取补,即用0减去操作,再把结果送回OPRD。例如:NEG   AL。

                8.比较指令,格式:CMP  OPRD1,  OPRD2。该指令完成操作数OPRD1减去操作数OPRD2,结果不送回OPRD1,仅影响标志寄存器的某些标志位。例如:CMP  SI,  DI。

                9.无符号数乘法指令,格式:MUL   OPRD。如果OPRD为字节操作数,则使用AL中的无符号数与OPRD相乘,产生的16位结果送到AX中;  如果OPRD为字操作数,则把AX中的无符号数与OPRD相乘,产生的32位结果送到DX, AX中,DX                                  为高16位,AX为低16位。例如:MUL  AX。

                10.有符号数乘法指令,格式:IMUL  OPRD。该指令把乘数和被乘数均作为有符号数,其他与MUL相同。如果乘的结果的高位部分不是低位部分的扩展,则CF=OF=1,否则CF=OF=0。例如:IMUL  CL。

                11.无符号数除法指令,格式:DIV   OPRD。如果OPRD为字节操作数,则使用AX中的无符号数除OPRD,8位的商送到AL中;  如果OPRD为字操作数,则把DX作为高16位与AX作为低16位的无符号数除以OPRD,产生的16商送到AX中,                                    16位的余数送至DX中。例如:DIV  CX。

                 12.有符号数除法指令,格式:IDIV  OPRD。该指令把乘数和被乘数均作为有符号数,其他与DIV相同。例如:IDIV   BX。

                 13.符号扩展指令(在无符号数除之前,不宜用CBW或CWD指令,一般用XOR指令清掉高8位或高16位),如下:

                                1.字节转换为字指令,格式:CBW。该指令把寄存器AL中的符号扩展到寄存器AH,即若AL的最高有效位为0, 则AH为0;若AL的最高有效位为1,则AH为FF。

                                 2.字转换为双字指令,格式:CWD。该指令把寄存器AX中的符号扩展到寄存器DX。即若AX的最高有效位为0,则DX 为0;若AX的最高有效位为1,则DX为FFFF。

          5.逻辑运算和移位指令

                  1.逻辑运算指令

                                1.否操作指令,格式:NOT  OPRD。该指令把操作数OPRD取反,然后送回OPRD。例如:NOT  AX。

                                2.与操作指令,格式:AND  OPRD1,  OPRD2。该指令对两个操作数进行按位的逻辑"与"运算,把结果送到目的操作数OPRD1。例如:AND AH  DH。

                                3.或操作指令,格式:OR   OPRD1,    OPRD2。该指令对两个操作数进行按位的逻辑"或"运算,结果送至目的操作数OPRD1。例如OR   AX,  8080H。

                                4异或操作指令,格式:XOR  OPRD1,   OPRD2。该指令对两个操作数进行按位的逻辑"异或"运算,结果送至目的操作数OPRD1,指令执行后CF=OF=0,通过PF,SF,ZF可以反映运算结果。例如:XOR  DX,  DX。

                                5.测试指令,格式:TEST  OPRD1,   OPRD2。该指令与指令AND类似,但不把结果送到操作数OPRD1中,仅影响标志位。指令执行后,标志ZF,PF和SF反映出运算结果。例如:TEST AL, BL。

                   2.一般移位指令

                                 1.算术左移或逻辑左移指令,格式:SAL  OPRD,  m  或者SHL  OPRD,  m。这两条指令军事把操作数OPRD左移m位,右边补0,移出的最高位进入CF。例如:SHL  AL,  1。

                                 2.算术右移指令,格式:SAR  OPRD,  m。该指令使操作数右移m位,每移动一位,左边符号位保持不变,移出的最低位进入CF。例如:SAR  BX ,  CL。

                                 3.逻辑右移指令,格式:SHR  OPRD,  m。该指令使操作数右移m位,每移动一位,左边补0,移出的最低位进入CF。例如:SHR  BL,1。

                   3.循环右移指令

                                1.左循环移位指令,格式:ROL  OPRD,  m。m或为1或为CL,每移动一位,操作数左移,其最高位移入最低位,同时最高位也移入进位标志CF。例如:ROL AH 1。

                                2.右循环移位指令,格式:ROR  OPRD,  m  。m或为1或为CL,每移动一位,操作数右移,其最低位移入最高位,同时最低位也移入进位标志CF。例如:ROR AH CL。

                                3.带进位左循环移位指令,格式:RCL  OPRD,  m。m或为1或为CL,每移动一位,操作数左移,其最高位移入,CF移入最低位。例如:RCL AH 1。 

                                4.带进位右循环移位指令,格式:RCR  OPRD,  m。m或为1或为CL,每移动一位,操作数右移,其最低位移入CF,CF移入最高位。例如:RCR AH CL。

           6.转移指令

                   1.无条件转移指令

                                1.无条件段内直接转移指令,格式:JMP   标签。该指令使程序无条件的从标签地址处开始执行。

                                 例如:

                                         NEXT: MOV AX,  1

                                         JMP  NEXT

                                 2.无条件段内间接转移指令,格式:JMP   OPRD。该指令使程序无条件转到由操作数OPRD的内容给定的目标地址处,OPRD可以是寄存器也可以是存储单元。例如:JMP  CX或JMP   WORD PTR  [1234H]。

                                 3.无条件段间直接转移指令,格式:JMP  FAR  PTR  标签。该指令使程序无条件的从标签开始的地址执行。FAR指明是段间转移。例如JMP  FAR  PTR  EXIT    ;EXIT是另一代码段的标签

                                 4.无条件段间间接转移指令,格式:JMP  OPRD。基本同无条件段内间接转移指令,但OPRD必须是双字存储单元,低字送入IP, 高字送入CS。例如:JMP  DWORD PTR  [1234]。

                    2.循环指令

                                 1.计算循环指令,格式:LOOP  标签。该指令使寄存器CX的值减一,如果结果不等于0,则转移到标签处,否则往下执行。

                                  例如:

                                             NEXT:  MOV AX ,  BX;

                                                          DEC  CX

                                                          LOOP  NEXT

                                 2.等于/全零循环指令,格式:LOOPE  标签 / LOOPZ  标签。这条指令使寄存器CX减1,如果不等于0,并且ZF等于1,则转移到标签处执行。

                                 3.不等于/非零循环指令,格式:LOOPNE 标签 / LOOPNZ  标签。该指令使CX减1,如果不等于0,并且ZF等于1,则转移到标签处执行。

                     3.条件转移指令,涉及的比较多就不一一说明了

                             

                   


      

原创粉丝点击