第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 ;奇偶位不等则跳转
寄存器相关
-
-
- 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位值并且交换他们