我有一个任务,我需要将装配转换为C.装配是x86。我注释了这个装配,并开始填充C中的空白,但我有些失去了一些东西,有人可以协助吗?请解释一下,不要只给出我想学习的答案。装配到C的帮助
大会:
x at %ebp+8, n at %ebp+12
1 movl 8(%ebp), %esi //store x in esi
2 movl 12(%ebp), %ebx //store n in ebx
3 movl $-1, %edi //result in edi
4 movl $1, %edx //i of loop in edx
5 .L2:
6 movl %edx, %eax //move edx to eax
7 andl %esi, %eax //sum += 1 ...? i think
8 xorl %eax, %edi //results = results^(i & x)
9 movl %ebx, %ecx //store n in ecx
10 sall %cl, %edx //shift edx by %cl (low byte of ecx)
11 testl %edx, %edx //check if zeroed out
12 jne .L2 //jump to .L2 if flag
13 movl %edi, %eax //move result to eax
C代码:
int loop(int x, int n) {
int result = _______;
int mask;
for (mask = 1; mask != 0; mask = ______) {
result ^= mask & x;
}
return result;
}
我想表达'N'0xFF'在这里误导,因为没有相应的程序集映射它,尽管在语义上是正确的(简单的演员可能会更有意义)。 'sal'指令只有两种表示形式:直接形式和通过'cl'移位(有趣的事实:Intel处理器也为'sal'指令屏蔽'cl'为5位)。将这一点与移位溢出未定义的事实相结合(即n> = 32),编译器知道它甚至不需要屏蔽最不重要的字节。 –
在我这样表达它之前,我已经做了很多修改,但我确实同意你的看法,但提问者说这是一个任务,所以我选择在C代码中显示只有低位字节用于移位。我现在正在考虑添加一些细节。所有这一切都是为了回答,回想起来我本来应该做的。 你为什么认为演员会更清晰?我认为这可能更糟糕,因为(在C99中)'int'到'signed char'投射是在溢出的情况下实现定义的行为... –
顺便说一句,英特尔将'cl'的'cl'掩盖为5位是可爱 - 谢谢你的提示,尽管我希望它实际上不是一个真实的信息(经常重复的一块不可靠的信息)。 –