菜鷄日記——《汇编与接口技术》第3-3章 80X86指令系统 之 数据传送指令

第3-3章 80X86指令系统

                                       (能被CPU直接执行的指令组成的有机整体)

包括:

  • 数据传送指令
  • 算术指令
  • 逻辑指令
  • 串处理指令
  • 控制转移指令
  • 处理机控制与杂项操作指令

重点关注:

汇编格式、基本功能、支持的寻址方式、对标志位的影响、特殊要求

 汇编格式

操作码 [(目标)操作数] [(源)操作数] …… [(源)操作数]

如:1)MOV AH, [2000H]

       2)PUSH [2000H]

       3)RET

数据传送指令

  • 通用数据传输指令(通用寄存器都可以用,如AX,AL,SP等):MOV、PUSH、POP、XCHG

传送指令:MOV DST,SRC    执行操作:(DST)←(SRC)

                  1)DST、SRC不能同时为段寄存器(DS、ES等)

                  2)立即数不能直接送段寄存器    MOV DS,1234H ×

                  3)不允许使用AX、CX、DX存放EA(有效地址),BX允许

                  4)DST不能是立即数和CS寄存器

                  5)DST、SRC不能同时为存储器寻址(存储器单元不能直接传送数据,因为位宽不一定能匹配)

                  不影响标志位

进栈指令、出栈指令PUSH SRC    执行操作:先SP←SP-2,后(SP+1),(SP)←(SRC)

                                    POP DST    执行操作:先(DST)←(SP+1),(SP),后SP←SP+2

                  1)堆栈是操作系统分配的先进后出的存储区,段地址存放在SS寄存器中

                  2)低地址靠近栈顶,高地址靠近栈底

                  3)SP寄存器在任何时候都指向栈顶,进出栈后自动修改SP

                  4)堆栈操作必须以字为单位(即SP每次移动2字节,要修改单字节时运用AH、AL)

                  5)DST不能是CS寄存器,SRC和DST都不能是立即数    PUSH 1234H ×    POP 1234H ×

                  不影响标志位

交换指令:XCHG OPR1,OPR2    执行操作:(OPR1)↔(OPR2)

                  1)不允许使用段寄存器

                  2)两个操作数至少有一个在寄存器中,不能都是内存(内存间不能直接传送数据)

                  不影响标志位

  • 累加器专用传送指令(只限定使用AX寄存器):IN、OUT、XLAT

输入指令:AX是目标操作数,源操作数是PORT(I/O设备端口号的8位立即数)或DX,执行操作为:CPU←I/O

                  长格式:IN AL,PORT    执行操作:AL←(PORT)    字节

                                IN AX,PORT    执行操作:AX←(PORT+1),(PORT)    字

                  短格式:IN AL,DX    执行操作:AL←(DX)    字节

                                IN AX,DX    执行操作:AX←(DX+1),(DX)    字

                  (测试端口27H的第2位是否为1:

                     IN AL,27H

                     TEST AL,00000100B   (与运算后更新标志寄存器,00000001B时测试第0位)

                     JNZ ERROR)

输出指令:目标操作数是PORT或DX,AX是源操作数,执行操作为:I/O←CPU

                  长格式:OUT PORT,AL    执行操作:(PORT)←AL    字节

                                OUT PORT,AX    执行操作:(PORT+1),(PORT)←AX    字

                  短格式:OUT DX,AL    执行操作:(DX)←AL    字节

                                OUT DX,AX    执行操作:(DX+1),(DX)←AX    字

                  (输入指令与输出指令都要注意

                  1)通过指定的端口号从I/O设备输入或输出数据

                  2)前256个端口号00H~0FFH可直接用长格式指定(PORT限定8位)

                  3)端口号大于0FFH则要存储到DX中,再用短格式指定

                  不影响标志位

换码指令:XLAT 或 XLAT OPR    执行操作:AL←(BX+AL)

                  BX寄存器中存放表格的首地址,将该首地址偏移AL后的内存内容赋给AL

                  (例:MOV BX,OFFSET TABLE    ;将变量TABLE的偏移地址送到BX,等价于LEA BX,TABLE

                             MOV AL,3

                             XLAT

                             AL的内容从3映射到了表格的3号位的内容)

                  1)字节表格(长度<=256)

                  2)首地址→BX,偏移量→AL

                  3)有操作数时,自动将OPR赋给BX

                  不影响标志位

  • 地址传送指令:LEA、LDS、LES

有效地址送寄存器指令:LEA REG,SRC    执行操作:REG←SRC

指针送寄存器和DS指令:LDS REG,SRC    执行操作:REG←(SRC),同时DS←(SRC+2)

指针送寄存器和ES指令:LES REG,SRC    执行操作:REG←(SRC),同时ES←(SRC+2)

都要注意:

1)地址MEM长为16位,用两个字节存储

2)指针占4字节,高位的2字节16位的存储段地址,低2位16位的存储偏移地址

3)REG不能是段寄存器,SRC必须是寄存器寻址方式

不影响标志位

  • 标志寄存器传送指令:LAHF、SAHF、PUSHF、POPF

标志传送AH指令:LAHF    执行操作:AH←(FLAGS的低字节)

                              根据第2章标志寄存器的结构可知,该指令将SF、ZF、AF、PF、CF五个标志位传至AH的第7、                                            6、4、2、0位,第5、3、1位未定义

AH送标志寄存器指令:SAHF    执行操作:(FLAGS的低字节)←AH

标志进栈指令:PUSHF    执行操作:先SP←SP-2,后(SP+1),(SP)←(FLAGS)

标志出战指令:POPF    执行操作:先(FLAGS)←(SP+1),(SP),后SP←SP+2

影响标志位

  • 其他

猜你喜欢

转载自blog.csdn.net/Wyatt__Liu/article/details/82848139