2016-04-06 45 views
0

我希望有人可以驗證我下面的彙編代碼的理解:瞭解Lea和裝配

test %esi,%esi 
js 17 <build+0x17> 
cmp $0x8,%esi 
ja 1d <build+0x1d> 
lea (&rsi,2),%ecx 
shl $0x2,%rdi 
mov %rdi,%rax 
retq 
mov $0x0,%eax //17 
retq 
mov $0x0,%eax //1d 
retq 

這就是我認爲的代碼所做的:

  • 如果ESI & ESI是負收益項目地址爲0
  • 如果esi大於8,則返回地址爲0的項目
  • 否則將rsi * 2的地址存儲到ecx中
  • 複製RDI
  • 然後右移RDI權利兵營,並返回其
+1

返回0,而不是在地址0 –

+0

返回任何東西是它的其餘部分準確嗎? – Keyadun

+1

'lea(&rsi,8),%ecx'應該寫成'lea(,%rsi,8),%ecx',意思是'ECX = RSI * 8',而不是'rsi的地址。其餘的看起來不錯。 – zx485

回答

1

這是代碼做什麼:

if (esi >= 0 && esi <= 7) { 
    return rdi >> (esi * 8); // Note: arithmetic shift; preserves sign 
} 
return 0; 

所以esi指定字節的0號(。 .7)從rdi右移。由於使用算術移位,所以rdi的原始符號被保留。

例如:

Input: 
    rdi = 0xFC00AABB12345678 
    esi = 2 

Output: 
    rax = 0xFFFFFC00AABB1234