2016-04-06 12 views
0
Birisi aşağıdaki montaj kod benim anlayış doğrulamak umuyordum

: Buradaanlama Lea ve montaj

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 

ben kod yapar düşünüyorum ne:

  • esi & esi negatif getiri öğesi ise esi 8 üzerinde ise adresinde 0
  • , * 2
  • ecx içine adreste RSI 0
  • Else mağaza adresini öğeyi iade
  • Sonra sağ shift rdi rax için
  • Kopya rdi 2 bit sağa ve dönüş o
+1

Return 0, gerisi doğru mu adresinde 0 –

+0

bir şey döndürmez? – Keyadun

+1

"lea (& rsi, 8),% ecx" satırı muhtemelen "lea (,% rsi, 8),% ecx" ve "ECX = RSI * 8" anlamına gelir ve "rsi" adresi olmamalıdır. Gerisi iyi görünüyor. – zx485

cevap

1

Bu kod yaptığı şudur:

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

Yani esi bayt sayısını (0 belirtir. .7) rdi'dan sağa kaydırmak. Aritmetik bir kaydırma kullanıldığından, rdi'un özgün işareti korunur.

Örneğin:

Input: 
    rdi = 0xFC00AABB12345678 
    esi = 2 

Output: 
    rax = 0xFFFFFC00AABB1234