2016-10-10 1 views
0

나는 MIPS 어셈블리 코드 의이 조각 dechiper하려고합니다. 그러나, 나는 여전히 % hi (A)/% lo (A)를 가진 add/load 연산이 무엇을하는지 확신 할 수 없다. 나는 누군가가 댓글을 통해보고 이것 좀 도와 수 있다면Mips assembly help? 안녕하세요와 함께 특히

   # 28($fp) is zero 
lw $2,28($fp) # $2 = 0 
sll $3,$2,1  # $3 = 0*2^1 = 0 (multipying with 2^1) 
lui $2,%hi(A) # ?? 
lw $4,28($fp) # $4 = 0 
sll $4,$4,2  # $4 - 0*2^1 (not sure of the purpose yet) 
addiu $2,$2,%lo(A) #?? 
addu $2,$4,$2  # $2 += $4 
sw $3,0($2)   # save $3 in memory location 0 
lw $2,28($fp)  # $2 = 0 
addiu $2,$2,1  # $2 = 1 
sw $2,28($fp)  # MEM 28($fp) = 3 

나는 그것을 감사하겠습니다 ... 내가 이해에 댓글을 달았습니다. 둘러 보았지만 이해할 수있는 답을 아직 찾지 못했습니다. 나는 특히 Hi/Lo가하는 것에 혼란 스럽다.

답변

3

%hi은 상위 16 비트를 제공합니다. %lo 낮은 16 비트 입니다. 한 번에 32 비트를 즉시로드 할 수 없기 때문에이 작업이 필요합니다. 따라서 두 단계로 수행해야합니다. 이로드는 여기에 다른 코드와 혼합 된, 함께 속하는 부분은 다음과 같습니다

lui $2,%hi(A) # ?? 
addiu $2,$2,%lo(A) #?? 

$2A이 두 단지로드 주소. lui은 상위 16 비트를로드 한 다음 하위 16을 추가합니다. 소스 코드에서 보통 la 의사 명령어를 사용합니다. la $2, A

sll $4,$4,2  # $4 - 0*2^1 (not sure of the purpose yet) 

이것은 인덱스를 기반으로 배열의 오프셋을 계산합니다. 아마도 그것은 32 비트 정수의 배열이므로, 실제로는 2 배의 시프트가됩니다. 덧글에 의하면 2^2=4이 아닌 복수형이 실제로는 2^1입니다.

확장에 서명 인해

1 은 기술적으로 그것은 항상 사실이 아니다, 그러나 값이 제대로 필요한 주소를 추가 할 것입니다.