玩命加载中 . . .

汇编指令


这一部分主要记录一下课程中学习到的基本指令。

数据传送类指令

功能:把数据、地址或者立即数传送到寄存器或者存储单元中。

MOV指令

语法:MOV reg/mem/seg(目的操作数), reg/mem/seg/imm(源操作数)

  • reg:通用寄存器
  • mem:内存单元,形如[EA] (EA为有效地址,即偏移地址)
  • seg:段寄存器
  • imm:立即数

将源操作数src复制到目的操作数dst中,结果是目的操作数的内容等于源操作数的内容,源操作数的内容不变。

重要说明:

  • 双操作数不能同时为段寄存器或者内存
  • 代码段寄存器CS和立即数不能作为目的操作数,立即数不能直接传送到段寄存器中
  • dest与src必须类型匹配(位数一致)

XCHG指令

语法:XCHG reg/mem(dest), reg/mem(src)

交换dest和src中的内容。

栈操作

  1. 进栈指令

    格式:PUSH reg/mem/seg(src)

    将把src中的内容存入SP指向的内存(地址对应)

    隐藏了目的操作数SP+1与SP(双字)。

  2. 出栈指令

    格式:POP reg/mem/seg(src)

    与上面的进栈指令相逆。

标志处理指令

除了有一些指令影响标志位外,80x86还提供了一组设置或清除标志位指令,它们只影响本指令指定的标志,而不影响其他标志位。如

  • CLD 方向标志置0指令
  • CLI 中断标志置0指令

地址传送指令

LEA reg16,mem

主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定的寄存器。

注意:LEA与MOV指令相比,最大的区别在于LEA是将偏移地址送入寄存器,而MOV是将存储单元中的内容送入寄存器(或其他)

段寄存器装入指令

LDS/LES REG, SRC

LDS指定的段寄存器是DS,LES指定的段寄存器是ES;其中的SRC只能使用存储器寻址方式,目的寄存器不允许使用段寄存器。

累加器专用传送指令

IN AL, PORT(字节)

IN AX, PORT(字)

OUT PORT, AL

OUT PORT, AX

算术指令

加法指令

  • ADD dest,src

    将dest和src相加,并将和保留在目的操作数中。

    会改变标志位。

  • ADC dest,src

    带进位的加法指令,会加上进位CF。

  • INC opr

类型转换指令

CBW 字节转换为字指令:AL的内容符号扩展到AH,形成AX中的字。

CWD 字转换为双字指令:AX的内容符号扩展到DX,形成DX,AX中的双字。

位操作指令

逻辑与、逻辑或、逻辑异或

逻辑非指令:操作数按位取反

NOT reg/mem

移位指令

分为逻辑左移(SHL)、逻辑右移,算术左移(SAL)、算术右移,循环左移(ROL)、循环右移,带CF位的循环左移(RCL)和循环右移。

语法格式:移位指令 dest, Count

当移位次数大于1时,必须将移位次数提前送至CL寄存器,再执行移位指令

  • 逻辑移位:不考虑符号位(每次移位后补零)
  • 算术移位:考虑符号位(左移补零,右移补符号位)

控制转移指令

无条件转移指令:JMP

  • 段内直接转移

    JMP SHORT OPR

  • 段内间接近转移

    JMP WORD PTR OPR

  • 段间直接远转移

  • 段间间接远转移

    JMP DWORD PTR OPR

    EA内容送入IP,EA+2内容送入CS。


文章作者: 鹿卿
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 鹿卿 !
评论
  目录