我是靠谱客的博主 坚强哑铃,最近开发中收集的这篇文章主要介绍Linux系统IA-32 —— 操作系统常用指令类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

(1)传送指令

          –通用数据传送指令

                    MOV:一般传送,包括movbmovwmovl

                    MOVS:符号扩展传送,如movsbwmovswl等(有符号数)

                    MOVZ:零扩展传送,如movzwlmovzbl等(无符号数)

                    XCHG:数据交换(两个寄存器的内容)

                    PUSH/POP入栈/出栈,如pushl,pushw,popl,popw

          –地址传送指令

                    LEA:加载有效地址,如leal (%edx,%eax), %eax的功能为R[eax]←R[edx]+R[eax],执行前,若R[edx]=i,可                                    以做无符号的加法 

                    R[eax]=j,则指令执行后,R[eax]=i+j

          –输入输出指令

                    INOUTI/O端口与寄存器之间的交换

          –标志传送指令

                    PUSHFPOPF:将EFLAG压栈,或将栈顶内容送EFLAG

备注:b:字节,w:字(2个字节),l:双字(4个字节)

2)定点算术运算指令

          –/ 减运算(影响标志、不区分无/带符号)

                   ADD:加,包括addbaddwaddl

                   SUB:减,包括subbsubwsubl

          –1 / 1运算(影响除CF以外的标志、不区分无/带符号)

                   INC:加,包括incbincwincl

                   DEC:减,包括decbdecwdecl

          –取负运算(影响标志、若对0取负,则结果为0CF=0, 否则CF=1

                   NEG:取负,包括negbnegwnegl

          –比较运算(做减法得到标志、不区分无/带符号)

                   CMP:比较,包括cmpbcmpwcmpl

          –/ 除运算(区分无/带符号)

                   MUL / IMUL:无符号乘 / 带符号乘(影响标志OFCF

                   DIV/ IDIV:带无符号除 / 带符号除

(3)整数乘除指令

乘法指令:可给出一个、两个或三个操作数

  • 若给出一个操作数SRC,则另一个源操作数隐含在AL/AX/EAX中,将SRC和累加器内容相乘,结果存放在AX16                              位)或DX-AX32位)或EDX-EAX64位)中。DX-AX表示32位乘积的高、低16位分别在DXAX中。 n×                              n=2n
  • 若指令中给出两个操作数DSTSRC,则将DSTSRC相乘,结果在DST中。n× n=n
  • 若指令中给出三个操作数REGSRCIMM,则将SRC和立即数IMM相乘,结果在REG中。n× n=n

除法指令:只明显指出除数

  • 若为8位,则16位被除数AX寄存器中,商送回AL,余数在AH
  • 若为16位,则32位被除数DX-AX寄存器中,商送回AX,余数在DX
  • 若为32位,则被除数EDX-EAX寄存器中,商送EAX,余数在EDX

以上内容不要死记硬背,遇到具体指令时能查阅到并理解即可。

(4)定点算术运算指令汇总

(5)定点算术运算指令汇总

  • 逻辑运算(仅NOT不影响标志,其他指令OF=CF=0,而ZFSF根据结果设置:若全0,则ZF=1;若最高位为1,则SF=1 NOT:非,包括 notbnotwnotl
  • AND:与,包括 andbandwandl
  • OR:或,包括 orborworl
  • XOR:异或,包括 xorbxorwxorl
  • TEST:做“与”操作测试,仅影响标志

移位运算(左/右移时,最高/最低位送CF

  • SHL/SHR:逻辑左/右移,包括 shlbshrwshrl
  • SAL/SAR:算术左/右移,左移判溢出,右移高位补符
    (移位前、后符号位发生变化,则OF=1
  • ROL/ROR: 循环左/右移,包括 rolbrorwroll
  • RCL/RCR: 带循环左/右移,将CF作为操作数一部分循环移位

以上内容不要死记硬背,遇到具体指令时能查阅到并理解即可。

(6)控制转移指令

 指令执行可按顺序跳转到转移目标指令处执行

无条件转移指令

  • JMP DST:无条件转移到目标指令DST处执行

条件转移

  • Jcc DSTcc为条件码,根据标志(条件码)判断是否满足条件,若满足,则转移到目标指令DST处执行,否则按顺序执行

条件设置

  • SETcc DST:将条件码cc保存到DST(通常是一个8位寄存器 )

调用和返回指令 (用于过程调用)

  • CALL DST返回地址RA入栈,转DST处执行
  • RET:从栈中取出返回地址RA,转到RA处执行

中断指令 (详见第78章)

转移指令主要分三类

  1. 根据单个标志的值转移
  2. 按无符号整数比较转移
  3. 按带符号整数比较转移

无符号:

  1. above  >
  2. equals  =
  3. below   <

无符号:

  1. great    >
  2. equals  =
  3. less      <

最后

以上就是坚强哑铃为你收集整理的Linux系统IA-32 —— 操作系统常用指令类型的全部内容,希望文章能够帮你解决Linux系统IA-32 —— 操作系统常用指令类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部