关于X86-64汇编中⼏条指令的解答笔记
问题
这是⼀段C语⾔代码:
long test(long x,long y){
long val =8* x;
if(y >0){
if(x < y)
val = y - x;
else
val = x & y;
}else if(y <=-2){
val = x + y;
}
return val;
}
对应上⾯的C语⾔代码,gcc产⽣的部分汇编代码如下:
x in %rdi,y in %rsi
test:
leaq (,%rdi,8), %rax
testq %rsi, %rsi  .Q1
jle .L2                    .Q2
movq %rsi, %rax
subq %rdi, %rax
movq %rdi, %rdx
andq %rsi, %rdx
cmpq %rsi, %rdi            .Q3
cmovge %rdx, %rax          .Q4
ret
.L2:
addq %rsi, %rdi
cmpq $-2, %rsi            .Q5
cmovle %rdi, %rax          .Q6
ret
1. 关于汇编代码中标注.Q1和.Q2的指令,testq指令做了什么?jle指令跳转的依据⼜是什么?
2. 关于.Q3和Q4,cmpq指令做了什么?cmovge指令进⾏条件传送的具体依据是什么?
3. 关于.Q5和.Q6,cmpq指令做了什么?cmovle指令进⾏条件传送的具体依据是什么?
解答
1. testq指令⽤来检测%rax中值和0的关系,将检测结果保存在条件码寄存器中;下⾯紧接着的jle指令根据对应条件码的值来进⾏跳
转,具体⾏为是如果%rax >= 0,那么就跳转到标签.L2。
2. cmpq指令⽤来⽐较%rsi和%rdi中值的⼤⼩关系(⽐较的⾏为是%rdi - %rsi),将⽐较结果保存在条件码寄存器中;下⾯紧接着
的cmovge根据对应条件码的值来执⾏这条指令,具体⾏为是如果%rdi >= %rsi,那么将%rdi中的值赋给%rax。
3. 这两条指令的⾏为和问题⼆类似,不过cmovle指令的判断依据是:如果%rsi <= -2。
常见的条件码
条件码作⽤解释
CF进位标志最近的操作使最⾼位产⽣了进位。⽤于检查⽆符号溢出的操作
条件码作⽤解释
ZF零标志最近的操作得出的结果为0
SF符号标志最近的操作得出的结果为负数
OF溢出标志最近的操作导致了⼀个补码溢出(正溢出 / 负溢出)
jump指令
指令同义名跳转条件描述jmp Lable1z直接跳转jmp *Operand1间接跳转je Lable jz ZF相等/零
jne Lable jnz~ZF不相等/⾮零
js Lable SF负数
jns Lable~SF⾮负数
jg Lable jnle~(SF ^ OF)&~ZF⼤于(有符号)汇编指令有多少个
jge Lable jnl~(ZF ^ OF)⼤于或等于(有符号)
jl Lable jnge SF ^ OF⼩于(有符号)
jle Lable jng(SF ^ OF) | ZF⼩于或等于(有符号)
ja Lable jnbe~CF & ~ZF超过(⽆符号)
jae Lable jnb~CF超过或相等(⽆符号)
jb Lable jnae CF低于(⽆符号)
jbe Lable jna CF | ZF低于或等于(⽆符号)条件传送指令
指令同义名传送条件描述cmove S, R cmovz ZF相等/零
cmovene S, R cmovnz~ZF不相等/⾮零
cmovs S, R SF负数
cmovns S, R~SF⾮负数
cmovg S, R cmovnle~(SF ^ OF) & ~ZF⼤于(有符号)
cmovge S, R cmovnl~(SF ^ OF)⼤于或等于(有符号)cmovl S, R cmovnge SF ^ OF⼩于(有符号)
cmovle S, R cmovng(SF ^ OF) | ZF⼩于或等于(有符号)cmova S, R cmovnbe~CF & ~ZF超过(⽆符号)
cmovae S, R cmovnb~CF超过或等于(⽆符号)cmovb S, R cmovnae CF低于(⽆符号)
cmovbe S, R cmovna CF | ZF低于或等于(⽆符号)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。