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

この C コードが何をするのか本当に理解できません。アセンブラーに「変換」できるようにする必要があります。

4

1 に答える 1

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

100の50個の配列を作成しますint。次に、 th配列bのth整数を値で初期化します。ただし、、、およびを初期化する必要があります。それ以外の場合、自動保存期間があるため、値は未定義になります。acabc

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では、配列は実際に行優先の順序で格納されます。つまりmatrix[a][b]、ソースコードを書き込むときは、次の場所にアクセスします。

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

それがアセンブリコードが示していることです。

于 2013-03-03T17:29:24.820 に答える