2012-08-22 5 views
0

나는 NIOS II의 IDE에서 MIPS 32 비트 어셈블리를 배우고 내가 R4 및 R5에 저장된 두 숫자를 곱 완벽한 작업 서브 루틴을 가지고와 R2의 결과를 반환했습니다이 서브 루틴을 호출하는 방법?

 .global muladd   # makes label "main" globally known 

     .text     # Instructions follow 
     .align 2    # Align instructions to 4-byte words 

muladd: 
    movi r2, 0 # total = 0 
    movi r8, 0 # i = 0 
L1: # if(i >= a) goto L2 
    bge r8, r4, L2 # a i r4 
    # total = total + b 
    add r2, r2, r5 # öka b med r5 
    addi r8, r8, 1 # i = i + 1 
    br L1 # goto L1 
L2: # return(total) 
ret 

을 어떻게 할 수 서브 루틴을 호출하고 그 내용을 인쇄하여 예상대로 작동하는지 확인하십시오. 이것은 첫 번째 서브 루틴이고 전에 서브 루틴을 호출 한 적이 없으므로 모든 것을 즉시 이해하지 못하면 나를 용서해주십시오.

+0

환경 ???? 어셈블러 ?? – perilbrain

+0

@Anon ymous 코멘트 주셔서 감사합니다. 나는 환경과 어셈블러에 관한 더 많은 정보를 가지고 질문을 업데이트했다. Altera DE2 개발 보드에서 32 비트 MIPS이고, 사용하는 IDE는 Nios II로 불리며, 사용 된 프로세서의 이름이기도합니다. 원하는 경우 더 많은 질문을하십시오. –

+0

그런 환경에 결코 대처하지 말고 elf를 생성한다면 [int 0x80] (http://asm.sourceforge.net/articles/linasm.html)을 사용하십시오. 또한 루틴을 호출하기 위해서는'call' 명령이 있어야합니다. '점프 '명령. – perilbrain

답변

1

는이 같은 메인에서 서브 루틴을 호출 :

main: 
    ... 
    li r4, 123 // load some test data into r4 and r5 
    li r5, 1 
    jal muladd // call muladd. Return address is stored in r31 
    nop   // branch delay slot 
    // muladd returns to this address. 
    // If muladd worked correctly r2 should contain decimal 123+1, or 124 
    // print subroutine call goes here 
    ... 

Muladd는 jr r31 (레지스터 31에 포함 된 주소로 점프)를 사용하여 반환합니다. 비표준 환경에서 ret으로 철자가 표시 될 수 있습니다.

+0

답변 해 주셔서 감사합니다. 제 경우에는 단지'call' 문을 사용할 수 있습니다. –

+0

예, 저는 그것이 여러분의 환경에서 작동 할 것이라고 생각합니다. – markgz

관련 문제