微机原理与接口技术汇编语言Word格式.docx

上传人:b****5 文档编号:18738905 上传时间:2022-12-31 格式:DOCX 页数:38 大小:55.55KB
下载 相关 举报
微机原理与接口技术汇编语言Word格式.docx_第1页
第1页 / 共38页
微机原理与接口技术汇编语言Word格式.docx_第2页
第2页 / 共38页
微机原理与接口技术汇编语言Word格式.docx_第3页
第3页 / 共38页
微机原理与接口技术汇编语言Word格式.docx_第4页
第4页 / 共38页
微机原理与接口技术汇编语言Word格式.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

微机原理与接口技术汇编语言Word格式.docx

《微机原理与接口技术汇编语言Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术汇编语言Word格式.docx(38页珍藏版)》请在冰豆网上搜索。

微机原理与接口技术汇编语言Word格式.docx

  PUSH  src;

进栈指令(pushontothestack)

(SP)←(SP)-2

       ((SP))←(src)

  POP  dst;

出栈指令(popfromthestack)

(dst)←((SP))

       (SP)←(SP)+2

  PUSH和POP指令分别将数据存入堆栈或把堆栈中的数据取出。

堆栈是以LIFO(后进先出)方式工作的一个存储区,程序中定义的堆栈段就是这样一个LIFO存储区。

数据存入堆栈单元或从堆栈单元中取出都由堆栈指针SP指示,而SP总是指向栈顶,所以进栈和出栈指令都会自动修改SP。

  PUSH指令执行时,SP的内容先减2,然后将数据压入SP所指示的字单元,存储的方法同样是高8位存入高地址字节,低8位存入低地址字节。

POP指令执行时,将SP所指示的栈顶地址的内容取出放入目的地址,然后SP增2,指向新的栈顶地址。

   ●PUSH和POP指令只能是字操作,因此存取字数据后,SP的修改必须是+2或-2;

   ●PUSH和POP指令不能使用立即数方式;

   ●POP指令的dst不允许是CS寄存器;

   ●PUSH和POP指令都不影响标志位。

  PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。

  XCHG opr1,opr2;

交换指令(exchange)

(opr1)←→(opr2)

  XCHG指令使两个操作数opr1,和opr2互相交换,其中一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。

   ●不允许使用段寄存器

   ●不影响标志位

 例假设(DS)=1000H,(SS)=4000H,(SP)=100H,(BX)=2100H,(12100)=00A8H,指出连续执行下列各条指令后,有关寄存器、存储单元以及堆栈的情况。

     PUSH  DS

     PUSH  BX

     PUSH  [BX]

     POP  DI

     POP  WORDPTR[DI+2]

     POP  DS

  

执行结果:

(SP)=100H-2=0FEH   (SP)=0FE-2=0FCH  (SP)=0FC-2=0FAH

     (400FEH)=1000H    (400FCH)=2100H   (400FAH)=00A8H

(SP)=0FA+2=0FCH   (SP)=0FC+2=0FEH    (SP)=0FE+2=100H

     (DI)=00A8H     (100AAH)=2100H    (DS)=1000H

  例已知(AX)=6634H,(BX)=0F24H,(SI)=0012H,(DS)=1200H,(12F36H)=2500H,写出下列指令执行的结果。

     XCHG AH,AL   ;

执行前:

(AH)=66H,(AL)=34H

               ;

执行后:

(AH)=34H,(AL)=66H

     XCHG AX,[BX+SI] ;

(AX)=6634H,(12F36H)=2500H

(AX)=2500H,(12F36H)=6634HH

  

2累加器专用传送指令

  这组指令只限于使用累加器(ac:

AX或AL)传送信息。

  IN ac,port ;

输入指令(input),port≤0FFH

  执行操作:

 (AL)←(port)传送字节

   或(AX)←(port+1,port)传送字

  IN ac,DX ;

输入指令,DX中的port>0FFH

 (AL)←((DX))传送字节

   或(AX)←((DX)+1,(DX))传送字

  OUT port,ac ;

输出指令(output),port≤0FFH

 (port)←(AL)传送字节

   或(port+1,port)←(AX)传送字

 OUT DX,ac  ;

输出指令(output),DX中的port>0FFH

 执行操作:

 ((DX))←(AL)传送字节

   或((DX)+1,(DX))←(AX)传送字

  对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。

IN指令将信息从I/O输入到CPU,OUT指令将信息从CPU输出到I/O端口,因此,IN和OUT指令都要指出I/O端口地址。

微处理机分配给外部设备最多有64K个端口,其中前256个端口(0~FFH)称为固定端口,可以直接在指令中指定。

当端口地址超过8位(≥256),称为可变端口,它必须先送到DX寄存器,然后再用IN或OUT指令传送信息。

CPU与I/O端口传送信息的寄存器只限于累加器ac(AX或AL),传送16位信息用AX,传送8位信息用AL,这取决于外设端口的宽度。

   ●只限于在AL或AX与I/O端口之间传送信息

  XLAT  ;

换码指令(translate)

(AL)←((DS)×

16+(BX)+(AL))

  这条指令根据AL寄存器提供的位移量,将BX指示的字节表格中的代码换存在AL中。

该指令还可写为:

XLATopr,opr为字节表格的首地址,因为opr所表示的偏移地址已存入BX寄存器,所以opr在换码指令中可有可无,有则可提高程序的可读性。

   ●所建字节表格的长度不能超过256字节,因为存放位移量的是8位寄存器AL;

   ●XLAT指令不影响标志位。

例IN  AL,61H  ;

(AL)←端口61H的内容

         MOV DX,278H ;

(DX)←端口地址278H

        IN  AL,DX  ;

(AL)←端口278H的内容

  例OUT 61H,AL  ;

61H端口←(AL)

         MOV DX,279H ;

(DX)←端口地址279H

         OUT DX,AX  ;

279H端口←(AX)

3地址传送指令

  这组指令完成把地址送到指定寄存器的功能。

  LEAreg,src;

有效地址送寄存器(loadeffectiveaddress)

(reg)←offsetofsrc

  LEA指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由src选定的一种存储器寻址方式确定的。

  LDSreg,src;

指针送寄存器和DS(loadDSwithpoint)

(reg)←(src)

       (DS)←(src+2)

  LESreg,src;

指针送寄存器和ES(loadESwithpoint)

       (ES)←(src+2)

  LDS和LES指令把确定内存单元位置的偏移地址送寄存器,段地址送DS或ES。

这个偏移地址和段地址(也称地址指针)是由src指定的两个相继字单元提供的。

 注意:

  ●指令中的reg不能是段寄存器;

  ●指令中的src必须使用存储器寻址方式;

  ●该指令不影响标志位。

 

例假设某数据段定义如下:

  0000       DATA SEGMENT

  00000040    TABLE  DW 0040H

  00023000         DW 3000H

  0004       DATA ENDS

  请指出下列指令的执行结果,并说明它们之间的区别。

  ①MOVBX,TABLE

  ②LEABX,TABLE

  ③MOVBX,OFFSETTABLE

 答:

第①条指令执行后,(BX)=0040H,

    第②条指令执行后,(BX)=0000,

    第③条指令执行后,(BX)=0000。

 比较①②两条指令,第①条MOV指令是用直接寻址方式把变量TABLE的内容送入BX,而LEA指令是把TABLE的地址送入BX。

  比较②③两条指令可以看到,LEA和用OFFSET指示符实现的功能是相同的,都是将TABLE的偏移地址0000送BX。

既然功能相同,它们之间还有什么区别呢?

  首先,LEA指令可以使用各种存储器寻址方式,如,LEABX,[DI],LEABX,TABLE[DI],LEASI,[BX+DI]等,这些指令都是把计算出来的有效地址送目的寄存器,而OFFSET不能使用这些寻址方式,它只作用于像TABLE这样的简单变量(或标号)。

 其次,对简单变量,OFFSET指示符比LEA执行速度快,因为MOVBX,OFFSETTABLE指令在汇编时,由汇编程序计算出了TABLE的偏移地址,并被汇编成立即数传送指令,因此效率很高,而LEA指令是在执行时才计算地址,然后再传送到指定寄存器,因此执行速度相对慢一些。

 例对例3.17的数据定义,下列两条指令的执行结果是什么?

     ①LDSBX,TABLE

     ②LESBX,TABLE

  答:

LDS指令执行后,(BX)=0040H,(DS)=3000H

    LES指令执行后,(BX)=0040H,(ES)=3000H

 4标志寄存器传送指令

 这组指令完成和标志位有关的操作。

 LAHF标志寄存器的低字节送AH(loadAHwithflags) 

 SAHFAH送标志寄存器低字节(storeAHintoflags)

 

 PUSHF标志进栈(pushtheflags)

 POPF标志出栈(poptheflags)

注意:

   ●LAHF和SAHF指令隐含的操作寄存器是AH和FLAGS

   ●LAHF和PUSH不影响标志位,SAHF和POPF则由装入的值来确定标志位的值。

LAHF标志寄存器的低字节送AH(loadAHwithflags)

 (AH)←(FLAGS)0-7

SAHFAH送标志寄存器低字节(storeAHintoflags)

 (FLAGS)0-7←(AH)

PUSHF标志进栈(pushtheflags)

 (SP)←(SP)-2

 ((SP)+1,(SP))←(FLAGS)0-15

POPF标志出栈(poptheflags)

 (FLAGS)0-15←((SP)+1,(SP))

 (SP)←(SP)+2

算术指令包括加、减、乘、除指令,它包括对二进制数进行的算术运算的指令,以及对十进制数(用BCD码表示)运算进行调整的指令。

执行算术指令都会影响条件标志位,条件标志位包括CF、PF、AF、ZF、SF和OF,它们标志算术运算结果的特征。

 ⑴加法指令           ⑵减法指令

    ADD 加法             SUB 减法

    ADC 带进位加           DEC 减1

    INC 加1             NEG 求补

                      CMP 比较

     

  ⑶乘法指令           ⑷除法指令

    MUL 无符号数乘法         DIV 无符号数除法

    IMUL 带符号数乘法         IDIV 带符号数除法

  ⑸符号扩展指令         ⑹十进制调整指令

    CBW 字节转换为字         DAA 加法的十进制调整

    CWD 字转换为双字         DAS 减法的十进制调整

                      AAA 加法的ASCII调整

                     AAS 减法的ASCII调整      

                      AAM 乘法的ASCII调整

                      AAD 除法的ASCII调整

  1加法指令

  ADDdst,src加法指令(addition)

(dst)←(src)+(dst)

  ADCdst,src带进位加指令(addwithcarry)

(dst)←(src)+(dst)+CF

  INCopr加1指令(increment)

(opr)←(opr)+1

  ADD和ADC指令是双操作数指令,它们的两个操作数不能同时为存储器寻址方式,也就是说,除源操作数为立即数的情况外,源和目的操作数必须有一个是寄存器寻址方式。

INC指令是单操作数指令,它可以使用除立即数方式外的任何寻址方式。

  ADD和ADC指令影响条件标志位(也称条件码),INC指令影响除CF外的其它条件码。

条件码中最主要的是SF、ZF、CF和OF,加法运算对这四个条件码的设置方法如下:

  SF=1加法结果为负数(符号位为1)

  SF=0加法结果为正数(符号位为0)

  ZF=1加法结果为零

  ZF=0加法结果不为零

  CF=1最高有效位向高位有进位

  CF=0最高有效位向高位无进位

  OF=1两个同符号数相加(正数+正数,或负数加负数),结果符号与其相反

  OF=0不同符号数相加时,或同符号数相加,结果符号与其相同

  计算机在执行运算时,并不区别操作数是带符号数还是无符号数,一律按上述规则设置条件码,因此,程序员要清楚当时处理的是什么类型的数据。

例如,当加法运算结果的最高有效位为1时,机器将SF置1。

如果参加运算的是两个带符号数,那么和的最高有效位是符号位,SF置1说明结果是一个负数。

如果参加运算的是两个无符号数,那么和的最高有效位也是数值位,此时SF置0或置1都失去了表示正负数的意义。

  对带符号数和无符号数,它们表示结果溢出的条件标志位也是不同的。

上述OF位的设置条件显然只符合带符号数的溢出情况,OF=1表示运算结果是错误的。

而无符号数溢出(运算结果超出了有限位的表示范围)时,表现为最高有效位产生进位,因此,CF=1是无符号数溢出的标志。

另外,在双字长数运算时,低位字相加设置的CF,说明低位字向高位字有无进位的情况。

 例MOV BX,9B8CH ;

(BX)=9B8CH

         ADD BX,6478H ;

now(BX)=0000H

         9B8A     1001101110001010

        +6476   +0110010001110110

       ----------- --------------------------

       1←0000  1←0000000000000000

  条件码设置:

SF=0 最高有效位(D15)为0

        ZF=1 结果为0

        CF=1 最高有效位向高位有进位

        OF=0 不同符号数相加,不产生溢出

  例编写执行双精度数(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作数的高位字,BX是源操作数的高位字。

指令执行前:

      (DX,CX)=A2482AC0H,(BX,AX)=088AE25BH。

  指令序列:

 ADD CX,AX ;

(CX)=0D1BH

         ADC DX,BX ;

now,(DX)=0AAD3H

  执行ADD指令:

         2AC0    0010101011000000

        +E25B   +1110001001011011

       ---------  ------------------------

       1←0D1B  1←0000110100011011

SF=0 最高有效位(D15)为0,无符号位意义

        F=0  结果不为0

        CF=1 最高有效位向高位有进位

        OF=0 加数最高位分别为0、1,溢出位置0,OF对低位字无溢出意义

  执行ADC指令:

        A248    1010001001001000

        088A    0000100010001011

       + 1   +        1←CF

       ---------- ----------------------------

        AAD3    1010101011010011

SF=1 最高有效位(D31)为1,对带符号数运算表示结果为负

        ZF=0 结果不为0

        CF=0 最高有效位向高位无进位

        OF=0 结果符号与操作数相同,未产生溢出

  2减法指令

  SUBdst,src减法指令(subtract)

(dst)←(dst)-(src)

  SBBdst,src带借位减法指令(subtractwithborrow)

(dst)←(dst)-(src)-CF

  DECopr减1指令(decrement)

(opr)←(opr)-1

  CMPopr1,opr2比较指令(compare)

(opr1)-(opr2),根据相减结果设置条件码,但不回送结果

  以上指令除DEC指令不影响CF外,其他都影响条件码。

与加法类似,SF和ZF分别表示减法结果的符号以及为零的情况;

CF表明无符号数相减结果溢出与否;

OF表明带符号数相减结果溢出与否。

但在对CF和OF位的设置方法上减法和加法有所不同,下面对此做进一步说明:

  CF=1  二进制减法运算中最高有效位向高位有借位(被减数<减数,不够减的情况)

  CF=0  二进制减法运算中最高有效位向高位无借位(被减数≥减数,够减的情况)

  OF=1  两数符号相反(正数-负数,或负数-正数),而结果符号与减数相同

  OF=0  同符号数相减时,或不同符号数相减,其结果符号与减数不同

  NEGopr求补指令(negate)

(opr)←-(opr),

                        

  求补操作即把操作数变为与其符号相反的数:

  机器在执行求补指令时,把操作数各位求反后末位加1,因此执行的操作也可表示为:

  (opr)←0FFFFH-(opr)+1

  NEG指令的条件码设置方法为:

   CF=1 不为0的操作数求补时

   CF=0 为0的操作数求补时

   OF=1 当求补运算的操作数为-128(字节)或-32768(字)时

   OF=0 当求补运算的操作数不为-128(字节)或-32768(字)时

 例字长为8位的两数相减,其可表示数的范围为:

带符号数-128~127(80H~7FH),无符号数0~255(0~FFH)。

运算结果超出可表示数范围即为溢出,说明结果错误。

  ①43H-16H=2DH

   01000011   01000011  条件码设置:

CF=0

  -00010110  +11101010        OF=0

 --------------   --------------

   00101101   1←00101101

  说明:

机器作减法运算时,先将减数求补,然后转化为加法运算,所以实际上机器设置CF的方法是:

最高有效位不产生进位时,CF=1;

最高有效位产生进位时,CF=0。

这和做减法时有借位CF=1,无借位CF=0是一致的。

  本例参加运算的数无论是看作带符号数还是无符号数,运算结果均有效。

  ②0C8H-66H=62H

   11001000   11001000  条件码设置:

  -01100110  +10011010        OF=1

  --------------   ------------

   01100010   1←01100010

如果是无符号数的运算,被减数够减无借位,所以CF置0,表明结果有效。

如果操作数是带符号数,且被减数与减数符号相反,而结果符号与减数符号相同,所以OF置1,表明结果无效。

  ③54H-76

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1