2012-03-31 49 views
1

如果我聲明這些3個陣列陣列和組件

int a[10][10]; 
int b[10][15]; 
int c[10][30]; 

對於這三個陣列,將彙編代碼返回[i] [j]元素?假設數組的起始地址存儲在%ebx中。

pushl %ebp 
movl %esp, %ebp 
movl 8(%ebp), %edx   /* index i */ 
movl 12(%ebp), %ecx   /* index j */ 
movl %edx, %eax 
sall $4, %eax 
subl %edx, %eax 
addl %ecx, %eax 
movl (%ebx,%eax,4), %eax 
popl %ebp 
ret 

你怎麼

+0

沒有即時學習爲我的彙編中期 – user1114371 2012-03-31 02:25:21

回答

1

我會做一些手寫的數學與信息,比如:這個方法是:

movl 8(%ebp), %edx   /* index i */ 
-> edx = i 
movl 12(%ebp), %ecx   /* index j */ 
-> ecx = j 
movl %edx, %eax 
-> eax = i 
sall $4, %eax 
-> eax = 16 * i 
subl %edx, %eax 
-> eax -= i, thus: 
-> eax = 16 * i - i = 15 * i 
addl %ecx, %eax 
-> eax += j, thus: 
-> eax = 15 * i + j 
movl (%ebx,%eax,4), %eax 
-> eax = array[4 * eax], thus: 
-> eax = array[sizeof(int) * (15 * i + j)] 

所以,在eax結束時,您會在位置15 * i + j處得到給定數組中的內容(開始時指向ebx)。這可以很好地解決:

  • 的int數組
  • ,對於它的第一個(最右側)維度有15數組

考慮到和你的三個數組:

int a[10][10]; 
int b[10][15]; 
int c[10][30]; 

這個地址正確,但不是a也不是c

0

工作向後從解引用數組行解決這類型的問題:

movl (%ebx,%eax,4), %eax 

此處,使用4*eax作爲偏移(其中4是sizeof(int)),所以eax中的值是從數組開始的int秒的數量。現在寫eax在方程中的讀出棧參數方面...