2016-09-21 6 views
0

나는 mips를 배우는 학생이고 메모리 액세스 및 로딩이 어떻게 작동하는지에 대해 몇 가지 질문이 있습니다. 우리의 첫 번째 숙제에서밉과 메모리에 관한 간단한 질문이 있습니까?

은 우리가

sw $a0, numargs 
lw $t0, 0($a1) 
sw $t0, arg1 
lw $t0, 4($a1) 
sw $t0, arg2 
lw $t0, 8($a1) 
sw $t0, arg3 

이 매크로의 작업이 우리가 MIPS에로드 인수를 얻을 수 있습니다 사용이 매크로를 제공하고 있습니다. 그것은 작동하지만 교수가 결코 설명하지 않았고 단지 그것을 사용하도록 우리에게 말한 것처럼 그것이 어떻게 작동하는지 더 궁금해했습니다.

그래서 "프로그램 인수"필드에 세 가지 인수를 입력합니다. MIPS는 a0을 인수의 개수로 즉시 사용합니까? 그렇기 때문에 MIPS는 인수를 왜 우리 자신의 변수에 저장할 수 있습니까?

각 인수에는 자체 메모리 주소가 있습니다. 레지스터 $ a1은 인수의 메모리 주소 중 마지막 4 비트를 모두 합친 것입니까? 그렇게하면 매번 4 비트 씩 새로운 인수를 얻고 그 인수를 자체 변수에 저장합니다.

또한 단어가 제대로 작동

lw $t0, arg2   
lb $t1, 3($t0)  
move $a0, $t1 
addi $v0, $0, 11 
syscall 

이 코드 조각에 나에게 예를 들어 조금

혼란을로드합니다. 나는 t1의 마지막 바이트가되도록 (즉, 인수의 마지막 문자) t1로 설정하고 올바르게 인쇄합니다. 인수가 1234이면 내가 첫 번째 줄 이후

sll $t0, $t0, 8 

을 추가 할 때, 그것은 그러나 4

를 인쇄 그래서, 그것은 작동하지 않습니다. 나는 왜 그런지 이해하지 못한다. $ t0을 8 비트 씩 이동합니다. 그래서 마지막 바이트가 지워지고 "3"이 마지막 바이트가되어야하고 무엇이 인쇄됩니까? 그러나 그것은 나에게 오류를 준다.

답변

0

이 매크로는 MIPS 프로그래밍의 표준 방식이 아니며이 특정 클래스에만 유용합니다.

순서는 :

lw $t0, arg2 
lb $t1, 3($t0) 

은 당신이하지 생각하지 않습니다. lw $t0, arg2arg2 위치의 메모리 값을 $t0에로드합니다. 위치 arg2에서 메모리 단어가 값 1024 (십진수)가 있다면 그래서, $t0는 1024

lb $t1, 3($t0)로 설정 될 수는 $t0에 포함 된 주소의 메모리 바이트를로드하고 $t1로 넣습니다. $t0에 값 1024가 들어있는 경우 addess 1024 + 3 = 1027의 메모리 바이트는 $t1에 놓입니다. 그런 다음 lb이 프로그램은 아마도 읽을 수 없습니다 262144 + 3의 메모리 바이트를 읽으려고 할 262144. 1024에서 $t0의 값을 변경할 것 lwsll $t0, $t0, 8 추가

.