2012-08-30 2 views
0

내 출력은 사양에 따라 다음과 같이 가정한다 : 등등두 번째 숫자를 출력하는 방법은 무엇입니까?

00:00 
00:01 
00:12 
01:23 
12:34 
23:45 
34:56 
45:67 
56:78 
67:89 
78:9A 
89:AB 
9A:BC 
AB:CD 
BC:DE 
CD:EF 
DE:F0 
EF:01 
F0:12 
01:23 
12:34 

하고 있습니다. 필자는 16 진수 변환 2 개와 테스트 프로그램에서 인쇄 할 숫자를 얻는 어셈블리 서브 루틴 2 개를 작성했습니다.이 출력은 다음과 같이 보이기 시작합니다.

0: 
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
A: 
B: 
C: 
D: 
E: 
F: 
0: 
1: 
2: 
3: 
4: 
5: 

그래서 가장 오른쪽 숫자를 얻고있는 것처럼 보이지만 나머지 숫자는 어떻게 얻어야합니까? 그것은 assignment

그 예에서 말한다 0x0047114 바이너리 값을 포함하는 메모리 위치 0101 0011 (16 진수의 경우에는 0x53) 메모리 위치 0x0047115 이진 값 0001 0110 (16 진수에서 0 * 16)의 메모리 위치 0x0047116가 이진 값을 포함 포함 0000 0000 (16 진수 0x00) 메모리 위치 0x0047117에는 이진 값 0000 0000 (16 진수 0x00)이 포함됩니다. 호출자는 레지스터 r4를 0x0047114로 설정하고 puttime을 호출합니다. puttime은 새 줄에 을 16:53 출력합니다.

더 많은 배경 같은 과제 만의 다른 부분에 초점을 맞추고있다 나는 최근에 게시 된 다른 질문에서 사용할 수 있습니다 :

https://stackoverflow.com/questions/12105322/how-to-proceed-coding-for-this-assignment

Difference between load word and move?

https://stackoverflow.com/questions/12152323/why-is-load-word-not-working

내 프로그램이 변환은 다음과 같습니다.

17,451,515,나는 위의 정확하고 작업이라고 생각하지만 난 변수를 가져 와서 내 서브 루틴에 전달합니다 중간 부분 프로그래밍하는 방법을 잘 모르겠어요 : 어떤 도움을 주시면 더 좋구요

.macro PUSH reg 
     subi sp, sp, 4 
     stw  \reg, 0(sp) 
.endm 

.macro POP reg 
     ldw  \reg, 0(sp) 
     addi sp, sp, 4 
.endm 

.global puttime 

     .text 
     .align 2 

puttime: 
     PUSH r31 
     ldw r8,0(r4)   # put the variable in register 8 
     PUSH r8 
     nop 
     movi r4, 0x0A   # put newline char in register 4 
     movia r9,putchar  # copy subroutine address to a register 
     callr r9    # call subroutine via register 
     POP r8 
     mov r4, r8 
     call hexasc 
     mov r4, r2 
     movia r9,putchar  # copy subroutine address to a register 
     callr r9 
     movi r4, 0x3A 
     movia r9, putchar 
     callr r9 
     POP r31 
     ret 

을 .

답변

1

입력 데이터의 각 16 진수에 대해 한 번씩 hexasc를 두 번 호출해야한다고 생각합니다. hexasc는 입력 데이터의 하단 4 비트 만 변환하기 때문에 hexasc의 각 호출 사이에서 입력 데이터를 4 비트 오른쪽으로 시프트해야합니다.

그런데 PUSH와 POP를 사용하는 것은 관용적 인 MIPS 코드가 아닙니다. MIPS에서는 일반적으로 스택 포인터에서 루틴에 대한 상수 값을 빼고 라우팅에서 빠져 나올 때 상수 값을 다시 추가합니다. 이와 같이 :

puttime: 
    subi sp, 8  # reserve space for 2 words on the stack 
    sw r31, 4(sp) 
    ... 
    lw r31, 4(sp) 
    addi sp, 8 
    ret 
+0

당신 말이 맞아요. 효과가 있습니다. 답변 감사합니다. –

관련 문제