int main() {
long int x=______;
long int mask=0xff;
int i,n,m;
for(i=0;i<______;i++) {
n=i;
m=7-i;
long int n8=n<<3;
long int m8= m<<3;
long int n_mask=mask<<n8;
long int m_mask=mask<<m8;
long int n_byte=((______>>n8) & ______;
long int left_over = ______;
x=left_over ______;
}
}
我能够推断出一些简单的空白,但是不确定如何找出其余的空白。
当前尝试:
int main() {
long int x=7;
long int mask=0xff;
int i,n,m;
for(i=0;i<4;i++) {
n=i;
m=7-i;
long int n8=n<<3;
long int m8= m<<3;
long int n_mask=mask<<n8;
long int m_mask=mask<<m8;
long int n_byte=((______>>n8) & ______;
long int left_over = ______;
x=left_over ______;
}
}
最佳答案
无法弄清楚哪些值存储在哪个寄存器中,因此我可以跟踪命令。
从循环开始。
0xff = 255,因此R9为mask
。
GCC将7
提升到循环之外,并对7-i
/ mov %r10d, %edi
执行sub %edx, %edi
,因此我们知道此时m = EDI。 (并且r10d
只是保存7
,而不是x
,因为还有一个movabs
可以初始化另一个注册表。)
循环外唯一无法解释的变量初始化是x
,因此RSI = x。
它从那里继续。从跟踪m
开始,从那里继续。
关于c - 了解Assembly与C对等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54489390/