2017-04-12 8 views
1

그래서 최근에 C 코드와 MIPS 코드에서 이진수 1을 계산하는 코드를 만들었습니다. 나는 C에서 나머지 값을 사용하고 count_one 변수를 증가시킨다. MIPS에서는 같은 프로그램을 만들었지 만 1의 모든 값을 계산할 때까지 숫자의 바이트를 이동했습니다. Howver, 포인터를 사용하는 법을 배우려하지만이 개념을 파악할 수는 없습니다. MIPS 코드를 조작하고 스택 포인터를 사용하는 방법은 무엇입니까?

.data 
    prompt: .asciiz "Enter a integer: " 

.text 
    li $v0,4 
    la $a0, prompt 
    syscall 

    li $v0,5 
    syscall 
    move $s0,$v0 
    j count 

count: 
    beq $s0,0, exit 
    andi $t0,$s0,1 
    add $t1,$t1,$t0 
    srl $s0,$s0,1 
    j count 

exit: 
    move $a0,$t1 
    la $v0,1 
    syscall 
    li $v0,10 
    syscall 

나는이 완벽한 MIPS 코드를 얻을하지만 포인터가 완전히 MIPS에서 작동하는 방법에 및 나는 아직도 이해가 안 읽은 후 확실치 다음과 같이 내 MIPS 코드입니다. 포인터를 구현하는 방법에 대한 조언?

답변

1

가장 일반적인 명령은 데이터의 마음을 결정합니다. 번호

lw $s1, 0($a0) 

명령로드 그것을 등록 $a0 작품으로 가리키는 메모리로부터 데이터로서 의사 코드의 예를 그 등록 $a0 작품

inc $a0 

명령 증분 데이터 용

포인터 사용

+0

감사합니다. 내 주요 혼란은 메모리 크기를 선언하고 8,4,0 ($ sp) 행을 기반으로 변수를 구현하는 방법을 알아내는 것입니다. – CodeFreak

+0

도와 드리겠습니다. 행운을 빕니다. – oklas

+0

전체 메모리 부분을 할당하는 전체 설명 할 수 있습니까? – CodeFreak

1

다음은 흐르는 C 코드를 MIPS로 변환하는 예제 코드입니다. 보존 된 레지스터를 저장하고 복원하기 위해 스택에 일부 자리를 만들고 swlw을 사용하여 해당 레지스터를 저장 및 복원합니다.

int leaf_example(int g, int h, int i, int j) { 
    int f; 
    f = (g + h) - (i + j); 
    return f; 
}  



.text 
main: 

     addi $a0,$0,1  #argument 0 = 1 
     addi $a1,$0,2  #argument 1 = 2 
     addi $a2,$0,3  #argument 2 = 3 
     addi $a3,$0,4  #argument 3 = 4 
     jal leaf   # call function leaf 
     add $s0,$v0,$zero # return value 

     li $v0,10 
     syscall 


    leaf: 
     addi $sp, $sp, -12 #adjust stack to make room for 3 items 
     sw $s0, 8($sp)  #save register $t1 for use in memory location 8 
     sw $t0, 4($sp)  #save register $t0 for use in memory location 4 
     sw $t1, 0($sp)  #save register $s0 for use in memory location 0 

     add $t0, $a0, $a1 #register $t0 contains $a0 + $a1 
     add $t1, $a2, $a3 #register $t1 contains $a2 + $a3 
     sub $s0, $t0, $t1 #$t0 = $t0 - $t1 -> $t0 = ($a0 + $a1) - ($a2 + $a3) 

     add $v0, $s0, $zero #copy $s0 to return register $v0 

     #Before returning, we restore three original values 
     #of registers we pushed onto stack by popping them 
     lw $t1, 0($sp)  #restore register $s0 for caller 
     lw $t0, 4($sp)  #restore register $t0 for caller 
     lw $s0, 8($sp)  #restore register $t1 for caller 
     addi $sp, $sp, 12 #adjust stack to delete 3 items 

     jr $ra   #jump back to calling routine