汇编 - js 与 ja 指令
Assembly - js versus ja instruction
所以我的目标是写出对应于这个程序集的 C 代码:
0: 85 f6 test %esi,%esi
2: 78 13 js 17 <part3+0x17>
4: 83 fe 07 cmp [=10=]x7,%esi
7: 77 14 ja 1d <part3+0x1d>
9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx
10: 48 d3 ff sar %cl,%rdi
13: 48 89 f8 mov %rdi,%rax
16: c3 retq
17: b8 00 00 00 00 mov [=10=]x0,%eax
1c: c3 retq
1d: b8 00 00 00 00 mov [=10=]x0,%eax
22: c3 retq
我有点困惑,因为测试 %esi 寄存器的第一个循环在第二个循环结束之前结束。
第二个 if 语句是否在第一个循环中比较 %esi 和 7?或者这是一个 if , else if 情况??
总结一下,已经说过了
0: 85 f6 test %esi,%esi
2: 78 13 js 17 <part3+0x17>
这是“if (esi < 0) goto 17;”
4: 83 fe 07 cmp [=11=]x7,%esi
7: 77 14 ja 1d <part3+0x1d>
这是“if (esi >7) goto 1d;”
9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx
"cx = 8*rsi" // 不是很明显它是 "just" 乘法)
10: 48 d3 ff sar %cl,%rdi
rdi >> cl; // 不是 cx,但 cx <= 7*8 是安全的,所以是一样的
13: 48 89 f8 mov %rdi,%rax
16: c3 retq
return rdi;
17: b8 00 00 00 00 mov [=14=]x0,%eax
1c: c3 retq
17: "return 0"
1d: b8 00 00 00 00 mov [=15=]x0,%eax
22: c3 retq
1d: 另一个 "return 0"
所以 C 代码是:
{
if (esi < 0) return 0;
if (esi > 7) return 0;
return rdi >> ( 8 * rsi );
}
PS:2 "return 0"(17 和 1d)清楚地表明,在 C 代码中,两个 if
没有组合成一个
PSS:C 代码显然 未 编译优化 :P
所以我的目标是写出对应于这个程序集的 C 代码:
0: 85 f6 test %esi,%esi
2: 78 13 js 17 <part3+0x17>
4: 83 fe 07 cmp [=10=]x7,%esi
7: 77 14 ja 1d <part3+0x1d>
9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx
10: 48 d3 ff sar %cl,%rdi
13: 48 89 f8 mov %rdi,%rax
16: c3 retq
17: b8 00 00 00 00 mov [=10=]x0,%eax
1c: c3 retq
1d: b8 00 00 00 00 mov [=10=]x0,%eax
22: c3 retq
我有点困惑,因为测试 %esi 寄存器的第一个循环在第二个循环结束之前结束。
第二个 if 语句是否在第一个循环中比较 %esi 和 7?或者这是一个 if , else if 情况??
总结一下,已经说过了
0: 85 f6 test %esi,%esi
2: 78 13 js 17 <part3+0x17>
这是“if (esi < 0) goto 17;”
4: 83 fe 07 cmp [=11=]x7,%esi
7: 77 14 ja 1d <part3+0x1d>
这是“if (esi >7) goto 1d;”
9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx
"cx = 8*rsi" // 不是很明显它是 "just" 乘法)
10: 48 d3 ff sar %cl,%rdi
rdi >> cl; // 不是 cx,但 cx <= 7*8 是安全的,所以是一样的 13: 48 89 f8 mov %rdi,%rax 16: c3 retq
return rdi;
17: b8 00 00 00 00 mov [=14=]x0,%eax
1c: c3 retq
17: "return 0"
1d: b8 00 00 00 00 mov [=15=]x0,%eax
22: c3 retq
1d: 另一个 "return 0"
所以 C 代码是:
{
if (esi < 0) return 0;
if (esi > 7) return 0;
return rdi >> ( 8 * rsi );
}
PS:2 "return 0"(17 和 1d)清楚地表明,在 C 代码中,两个 if
没有组合成一个
PSS:C 代码显然 未 编译优化 :P