gpt4 book ai didi

c - 理解汇编语言中的 teSTL

转载 作者:行者123 更新时间:2023-11-30 17:38:22 25 4
gpt4 key购买 nike

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

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

我是否在某个地方误解了原始汇编代码?

编辑:是否可能涉及循环?

最佳答案

请注意,即使在添加之后,代码也会继续进行移位,并且 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:右移是除法,左移是乘法。

关于c - 理解汇编语言中的 teSTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com