第20部分-Linux x86 64位汇编 AT&T语法深入

第20部分-Linux x86 64位汇编 AT&T语法深入

字符串汇编语法

Intel汇编和AT&T的语法基本一致。

有如下:

(1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI

(2) stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI

(3) movsb、movsw:把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI

(4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI

(5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI

(6) rep:重复其后的串操作指令。重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在LODS前。

上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX

           涉及的标志位:DF、AF、CF、OF、PF、SF、ZF

 

汇总后如下,看上去更加,五个字串基本操作指令

 

  指令      功能    說    明

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

  CMPSB     比较    比较来源字串与目的字串一个字节

  CMPSW                                   一个字

  CMPSD                                   一个双字

  LODSB     载入    将来源字串一个指定的字元载入AL

  LODSW                                 字载入AX

  LODSD                                 双字载入EAX

  MOVSB     搬移    从来源字串搬移一个字节至目的字串

  MOVSW                               字至目的字串

  MOVSD                               双字至目的字串

  SCASB     扫描    扫描来源字串一个指定的字元

  SCASW                                   字

  SCASD                                   双字

  STOSB     存储    将AL存至字串一个指定的字节位址

  STOSW               AX                    字

  STOSD               EAX                   双字

 

字串指令所使用的运算元

   指令    第一个运算元   第二个运算元   搭配虚拟指令

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

   MOVSB       DS:SI          ES:DI      REP

   MOVSW       DS:SI          ES:DI      REP

   MOVSD       DS:SI          ES:DI      REP

   CMPSB       DS:SI          ES:DI      REPE,REPNE

   CMPSW       DS:SI          ES:DI      REPE,REPNE

   CMPSD       DS:SI          ES:DI      REPE,REPNE

   SCASB       AL             ES:DI      REPE,REPNE

   SCASW       AX             ES:DI      REPE,REPNE

   SCASD       EAX            ES:DI      REPE,REPNE

   LODSB       AL             DS:SI

   LODSW       AX             DS:SI

   LODSD       EAX            DS:SI

   STOSB       ES:DI          AL         REP

   STOSW       ES:DI          AX         REP

   STOSD       ES:DI          EAX        REP

 

有些REP指令除监视ECX外还监视ZF(零标志)的状态。

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

指令 描述

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

REPE 等于时重复

REPNE 不等于时重复

REPNZ 不为0时重复

REPZ 为0时重复

标记位

CF(carry flag):进位标志 描述了最近操作是否发生了进位(可以检查无符号操作是否溢出)

ZF(zero flag):零标志 最近操作结果为0(列如 逻辑操作 等)

SF(sign flag):符号标志最近操作结果为负数

OF(overflow flag):溢出标志最近操作导致一个补码溢出 补码溢出通常有两种结果(正溢出或者负溢出)

PF     奇偶校验(parity)标志      寄存器包含数学操作造成的错误操作

 

汇编跳转

JE   ;等于则跳转

JNE  ;不等于则跳转

JZ   ;为 0 则跳转

JNZ  ;不为 0 则跳转

JS   ;为负则跳转

JNS  ;不为负则跳转

JC   ;进位则跳转

JNC  ;不进位则跳转

JO   ;溢出则跳转

JNO  ;不溢出则跳转

JA   ;无符号大于则跳转

JNA  ;无符号不大于则跳转

JAE  ;无符号大于等于则跳转

JNAE ;无符号不大于等于则跳转

JG   ;有符号大于则跳转

JNG  ;有符号不大于则跳转

JGE  ;有符号大于等于则跳转

JNGE ;有符号不大于等于则跳转

JB   ;无符号小于则跳转

JNB  ;无符号不小于则跳转

JBE  ;无符号小于等于则跳转

JNBE ;无符号不小于等于则跳转

JL   ;有符号小于则跳转

JNL  ;有符号不小于则跳转

JLE  ;有符号小于等于则跳转

JNLE ;有符号不小于等于则跳转

JP   ;奇偶位置位则跳转

JNP  ;奇偶位清除则跳转

JPE  ;奇偶位相等则跳转

JPO  ;奇偶位不等则跳转

 

寄存器相关

      1. cld 和sld

cld相对应的指令是std,二者均是用来操作方向标志位DF(Direction Flag)。cld使DF 复位,即是让DF=0,std使DF置位,即DF=1.这两个指令用于串操作指令中。通过执行cld或std指令可以控制方向标志DF,决定内存地址是增大(DF=0,向高地址增加)还是减小(DF=1,向地地址减小)。

 

数据交换指令

指令 描述

XCHG       在两个寄存器之间或者寄存器和内存器之间交换值

BSWAP     反转一个32位寄存器中的字节顺序

XADD       交换来嗯改制并且把总和存储在目标操作数中

CMPXCHG        把一个值和一个外部值进行比较,并且交换它和另一个值

CMPXCHG8B   比较两个64位值并且交换他们

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值