2009-10-22 3 views
1

따라서, 예를 들어, 어떤 것이 같은 :lw는 C 또는 C++에서 어떻게 표현됩니까?

LW의 $의 T1, 0 ($ t0의)

또는

LW의 $의 T2, 8 ($ t0의)

C 또는 C++로 번역? 주소에서 등록어로 단어를로드하는 중입니다. 배열은 비슷한 개념입니까, 아니면 무엇입니까? 사전에

감사합니다.

답변

2

"로드 단어"명령입니다. 레지스터 $ t0에 저장된 주소가 $ t1 레지스터에있는 메모리에서 4 바이트 워드를로드합니다.

c/C++에는 해당 구성 요소가 없습니다. 이 명령은 예를 들어, 매우 인기있는 메모리 액세스가 필요한 대부분의 구조물에 사용되는 :

int *p; 
// p = ... 
*p += 10; 

같은로 번역 할 수 여기에

lw $t1, 0($t0) 
addi $t1, $t1, 10 
sw $t1, 0($t0) 

(주어진 $ t0의 포인터 'P'를 포함)

: 첫 번째 명령은 그것을 변경하고 제 첫번째 라인 메모리

0

에 다시 기록하는 레지스터에 변수를로드또는 t1 = t0[0] 또는 심지어 int t0, t1; ... t1 = t0입니다. 두 번째의 경우

:

int t2 = t0[2], 어쩌면, 혹은 int t2 = t0.thirdThing.

struct { 
    int a,b,thirdThing; 
} t0; 

하지만 당신은 확실히 알 수 없습니다. 그것은 char *x, **y; x = y[2]; 일 수 있습니다. 어떻게 주소가 레지스터에 들어 왔는지 알면 원래 코드에 더 많은 빛을 줄 수 있습니다.

0

정확하게 비슷한 코드를 작성할 수는 없다고 생각합니다. 당신은 다음 작업을 수행 할 수 있습니다 : 또한 값을 검색 할 때

int* wordAddress = ... + 8; // 8 or any offest 
// assuming int is a word on MIPS wich I never worked with personally 
int word = *wordAddress; 

당신은 오프셋을 적용 할 수 :

int* wordAddress = ... + 0; 
int word = *(wordAddress + 8); 

는 주석이 : 당신은 언어에서 필요한 register를 지정할 수 없습니다. 당신이 할 수있는 것은 register A의 word을 넣어 컴파일러에 대한 힌트를 제공하는 것입니다 :

// it is just a hint. The compiler is free to put it in memory. 
register int word = *wordAddress; 
0

그들이 무엇 다음은 아주 쉽게 당신이 MIPS32을 사용하여 (따라서 32 비트 주소 메모리가) 있습니다 가정.

lw $t1, 0($t0) 

이것은 메모리 주소 t0에서 t1 레지스터로 바이트 오프셋 0의 값을로드합니다.

lw $t2, 8($t0) 

이것은 메모리 주소 t0에서 t2 레지스터로 바이트 오프셋 8의 값을로드합니다.

메모리 주소가 0x12345678이라고 가정합니다. 그런 다음 MIPS 어셈블리는 기본적으로 다음을 수행합니다.

int t0 = 0x12345678; 
// ... 
int t1 = *(int*)(t0 + 0); 
int t2 = *(int*)(t0 + 8); 
관련 문제