2013-03-03 41 views
3
int matrix[50][100], a, b, c; 
matrix[a][b] = c; 

我真的不明白這一點的C代碼做什麼,我需要做的,所以我可以「翻譯爲」成彙編這個C矩陣代碼是做什麼的?

+8

沒什麼好。播放未定義的值。 – Andrey 2013-03-03 17:25:13

+2

試試吧,你就會知道。 – Maroun 2013-03-03 17:25:52

+1

如果你想把它翻譯成彙編程序 - 選擇一個編譯器並指示它打印彙編代替生成二進制文件。 – Andrey 2013-03-03 17:26:01

回答

3
int matrix[50][100], a, b, c; 
matrix[a][b] = c; 

它創造的100 int 50個陣列。然後使用值c初始化a th數組的b個整數。但您應初始化a,bc。否則,由於它們具有自動存儲持續時間,因此它們的值將不確定。

int matrix[50][100]; 
int a = 2; 
int b = 3; 
int c = 4; 
matrix[a][b] = c; 

這是我的gcc(4.4.4)如何接通代碼插入組件(AT & T語法):

movl $2, -4(%ebp)    # a = 2 
movl $3, -8(%ebp)    # b = 3 
movl $4, -12(%ebp)    # c = 4 
movl -4(%ebp), %edx    # %edx = a = 2 
movl -8(%ebp), %eax    # %eax = b = 3 
imull $100, %edx, %edx   # %edx = 100 * a = 100 * 2 = 200 
addl %eax, %edx     # %edx = %edx + b = 200 + 3 = 203 
            # Formula: %edx = 100 * a + b 
movl -12(%ebp), %eax    # %eax = c = 4 
movl %eax, -20012(%ebp,%edx,4) # Access to 203-th element (each of these 
            # are 4 bytes, ie. sizeof(int) on my 
            # computer) and put %eax = 4 in it. 

在C中,陣列被確實存儲在row-major order。也就是說,在源代碼中編寫matrix[a][b]的時候,你將獲得:

offset = row*NUMCOLS + column = a*100 + b 

這就是彙編代碼顯示。

+0

在asm代碼中的一些意見將是很好:) – 2013-03-03 17:31:44

+0

@GrijeshChauhan:對。我會更新它。 – md5 2013-03-03 17:37:23

+0

爲了進一步提高你可以添加信息矩陣存儲在列主要這就是爲什麼有效地址計算爲'%edx = 100 * a = 100 * 2 = 200' – 2013-03-03 17:49:08