用汇编语言理解testl

时间:2014-03-03 18:53:27

标签: c assembly

试图理解一些汇编语言,但我不确定我是否正确理解

movl 8(%ebp),%eax // assign %eax to a variable, say var
testl %eax,%eax // test if var is > 0 or not. if var is > 0, jump to .L3
jge .L3
addl $15,%eax // add 15 to var
.L3:
sarl $4,%eax // shift var 4 to the right , which is the same as multiplying var by 16

根据上述理解,我写了以下代码

int function(int x){    
    int var = x;    
    if(var>0) {
        ret = ret * 16;
    }    
    ret = ret + 15;    
    return ret;        
}

但是,我的汇编代码如下所示

movl 8(%ebp), %ebp
movl %eax. %edx
sall $4, %edx
test1 %eax, %eax
cmovg %edx, %eax
addl $15, %eax
我是否误解了原来的汇编代码?

编辑:是否涉及到循环?

1 个答案:

答案 0 :(得分:0)

请注意,即使在添加之后代码仍继续移位,jge也包含相同的大小写。因此代码可能看起来更像这样:

int function(int x) {
    int ret = x;
    if (ret >= 0) goto skip_add;
    ret = ret + 15;
skip_add:
    ret = ret / 16;
    return ret;
}

或者,为避免goto,请撤消条件:

int function(int x) {
    int ret = x;
    if(ret < 0) {
        ret = ret + 15;
    }
    ret = ret / 16;
    return ret;
}

PS:右移是分裂,左移是倍增。