따라서, 예를 들어, 어떤 것이 같은 :lw는 C 또는 C++에서 어떻게 표현됩니까?
LW의 $의 T1, 0 ($ t0의)
또는
LW의 $의 T2, 8 ($ t0의)
C 또는 C++로 번역? 주소에서 등록어로 단어를로드하는 중입니다. 배열은 비슷한 개념입니까, 아니면 무엇입니까? 사전에
감사합니다.
따라서, 예를 들어, 어떤 것이 같은 :lw는 C 또는 C++에서 어떻게 표현됩니까?
LW의 $의 T1, 0 ($ t0의)
또는
LW의 $의 T2, 8 ($ t0의)
C 또는 C++로 번역? 주소에서 등록어로 단어를로드하는 중입니다. 배열은 비슷한 개념입니까, 아니면 무엇입니까? 사전에
감사합니다.
"로드 단어"명령입니다. 레지스터 $ t0에 저장된 주소가 $ t1 레지스터에있는 메모리에서 4 바이트 워드를로드합니다.
c/C++에는 해당 구성 요소가 없습니다. 이 명령은 예를 들어, 매우 인기있는 메모리 액세스가 필요한 대부분의 구조물에 사용되는 :
int *p;
// p = ...
*p += 10;
같은로 번역 할 수 여기에
lw $t1, 0($t0)
addi $t1, $t1, 10
sw $t1, 0($t0)
(주어진 $ t0의 포인터 'P'를 포함)
: 첫 번째 명령은 그것을 변경하고 제 첫번째 라인 메모리
에 다시 기록하는 레지스터에 변수를로드또는 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];
일 수 있습니다. 어떻게 주소가 레지스터에 들어 왔는지 알면 원래 코드에 더 많은 빛을 줄 수 있습니다.
정확하게 비슷한 코드를 작성할 수는 없다고 생각합니다. 당신은 다음 작업을 수행 할 수 있습니다 : 또한 값을 검색 할 때
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;
그들이 무엇 다음은 아주 쉽게 당신이 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);