80x86数据传送指令与子程序

通用数据传送指令

MOV dest,src

(dest)←(src)
;传送的是字节、字或双字

① MOV mem/reg1,mem/reg2
② MOV reg,data ;立即数送寄存器
③ MOV mem,data ;立即数送存储单元
④ MOV segreg,mem/reg ;存储单元/寄存器送段寄存器
⑤ MOV mem/reg,segreg ;段寄存器送存储元/ 寄存器

指令中两操作数中至少有一个为寄存器
MOV指令使用规则

  1. EIP不能作目的寄存器
  2. 不允许mem←mem (即指令中两操作数中至少有一个为寄存器,将其中一个mem赋值给寄存器后再操作)
  3. 不允许segreg←segreg
  4. 目的操作数不允许是立即数, 也不允许是CS寄存器
  5. 不允许segreg←立即数
  6. 源操作数与目的操作数类型要一致

MOVSX带符号扩展传送指令

格式:MOVSX dest,src
操作:(dest)←符号扩展(src)
两种格式:

  • MOVSX reg1, reg2
  • MOVSX reg, mem
    注意: 源操作数可以是8位或16位,而目的操作数必须是16或32 位

MOVZX带零扩展传送指令

格式:MOVZX dest,src;
操作:(dest)←零扩展(src)
两种格式:

  • MOVZX reg1,reg2
  • MOVZX reg, mem

PUSH进栈指令

格式:PUSH SRC
执行操作:
(ESP) ←(ESP)-4
((ESP)+3,(ESP)+2, (ESP)+1,(ESP)) ←(SRC)
几种用法:
PUSH reg
PUSH mem
PUSH data ; 8086不允许使用立即数寻址方式

POP出栈指令

格式:POP DST
执行操作:
(DST) ←((ESP)+3, (ESP)+2, (ESP)+1,(ESP)) (ESP) ←(ESP)+4
几种用法:
POP reg
POP mem

堆栈指令使用时应注意几点:

  • 堆栈操作总是按双字进行
  • 不能从栈顶弹出一个字给CS
  • 堆栈指针为SS:ESP,ESP永远指向栈顶
  • 8086:PUSH ESP,进入堆栈的是该指 令已修改了的ESP新值。
  • 80286以后的PUSH ESP ,进入堆栈的 ESP是执行该指令之前的旧值

PUSHA/PUSHAD所有寄存器进栈指令

格式: PUSHAD
32位通用寄存器依次进栈,进栈次序为: EAX,ECX,EDX,EBX,
指令执行前的ESP, EBP, ESI, EDI。
指令执行后 (ESP) ←(ESP)-32。

POPA/POPAD所有寄存器出栈指令

格式: POPAD
执行操作: 32位通用寄存器依次出栈,
栈次序为: EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX。
指令执行后 (ESP) ←(ESP)+32。
出栈的ESP未存入ESP寄存器

交换指令XCHG

格式:XCHG reg,mem/reg
操作:交换两操作数的内容。
要求:

  • 两操作数中必须有一个在寄存器中
  • 操作数不能为段寄存器和立即数;
  • 源和目地操作数类型要一致。
  • 该指令允许除立即数以外的任何寻址方式。 举例: XCHG BX, [EBP+ESI] ; (BX) <-<->(EA) XCHG AL, BH ; (AL)<-> (BH)

短地址输入输出指令:

格式:
IN AL, PORT ;AL ← (PORT)
IN AX, PORT ; AX ← (PORT+1,PORT)
OUT PORT, AL ; (PORT) ← AL
OUT PORT, AX ; (PORT+1,PORT) ← AX
注意: PORT为输入输出端口号,范围为0~255

通用输入输出指令

格式:

  • IN AL, DX ; AL ← (DX)
  • OUT DX, AL ; (DX) ← AL
  • OUT DX, EAX ; (DX) ←EAX
  • 端口号范围:0000~FFFFH

换码指令XLAT

格式:XLAT OPR 或 XLAT
执行操作:
16位指令:(AL)←((BX)+(AL))
32位指令:(AL)←((EBX)+(AL))
该指令又叫查表转换指令,根据表项序号查 出表中对应的内容。
** 执行时先将表的首地址 送到BX或EBX中,表项序号存于AL中**

INCLUDE Irvine32.inc
.data
    arr db '0123456789ABCDE'
        db 'FGHIJKLMNOPQRST'
.code
main PROC
    mov ebx,offset arr
    mov al,10
    xlat
    call writeChar
    call crlf
    mov al,20
    xlat
    call writeChar
    exit
main ENDP
END main

注意:转换表长度最大为256个表项(字节)

地址传送指令

共有六种:
格式:LEA reg,mem ; 有效地址送寄存器指令
下面五个是指针送寄存器和段寄存器指令

  • LDS reg, mem32; DS: reg←(mem开始的四个内存单元)
  • LES reg, mem32; ES: reg←(mem开始的四个内存单元)
  • LFS reg, mem32; FS:reg←(mem开始的四个内存单元)
  • LGS reg, mem32; GS:reg←(mem开始的四个内存单元)
  • LSS reg, mem32; SS:reg←(mem开始的四个内存单元)
    要求源操作数必须是一个内存操作数, 目的操作数必须是一个32位的通用寄存器。

例:LEA EBX,[ESI+10H] 设:(ESI)=1000H 则执行该指令后,(EBX)=1010H
注意以下两条指令差别:
LEA EBX,BUFFER 将符号地址为BUFFER的存储单元的偏侈地址取 到 EBX中
MOV EBX,BUFFER ;后者表示将BUFFER存储单元中的内容取到 BX中

下面两条指令等效: LEA EBX,BUFFER MOV EBX, OFFSET BUFFER 其中OFFSET BUFFER表示存储器单元BUFFER的 偏移地址。 二者都可用于取存储器单元的偏移地址, 但LEA指令可以取动态的地址, OFFSET只能取静态的地址。

指针送寄存器

格式: LDS REG , SRC
执行操作:
16位指令: (src)→REG,(src+2)→DS
32位指令: (src)→REG,(src+4)→DS(16位)
例:LES DI, [BX]
执行前: (DS)=B000H, (BX)=080AH, (0B080AH)=05AEH, (0B080CH)=4000H
执行后:(DI)=05AEH, (ES)=4000H

  • 24
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值