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

나는 정말이 C 코드가 무엇을 이해 해달라고, 나는 내가 어셈블러이 C 매트릭스 코드는 무엇을합니까?

+8

좋은 것은 없습니다. 정의되지 않은 값으로 재생합니다. – Andrey

+2

시도해보십시오. – Maroun

+1

어셈블러로 번역하려는 경우 - 컴파일러를 선택하고 바이너리를 생성하는 대신 어셈블리를 인쇄하도록 지시합니다. – Andrey

답변

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

그것은 100 int의 50 개 배열을 생성로 "번역"할 수있는 할 필요가있다. 그런 다음 a 번째 배열의 b 번째 정수를 c 값으로 초기화합니다. 그러나 a, bc을 초기화해야합니다. 그렇지 않으면 자동 저장 기간이 있으므로 값은 정의되지 않습니다.

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

이 내 gcc (4.4.4) (& T 구문 AT) 어셈블리로 코드를 전환하는 방법입니다

C에서
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. 

는, 배열은 실제로 row-major order에 저장됩니다. 소스 코드에 matrix[a][b]를 작성할 때 즉, 당신은에 액세스 할 :

어셈블리 코드와 무엇
offset = row*NUMCOLS + column = a*100 + b 

.

+0

asm 코드의 일부 주석은 유용 할 것입니다. –

+0

@GrijeshChauhan : 맞습니다. 나는 그것을 새롭게 할 것이다. – md5

+0

더 개선하기 위해'% edx = 100 * a = 100 * 2 = 200'으로 계산 된 이유가 무엇인지 정보를 추가 할 수 있습니다. –