2013-02-16 3 views
0
int Reverse(int num) 
{ 
    int remainder = 0; 
    int rev = 0; 
    while (num != 0) 
    { 
     remainder = num % 10; 
     num = num /10; 
     rev = rev * 10 + remainder; 
    } 
    return rev; 
} 

void Palindrome() 
{ 
    int num; 
     cin >> num; 
     Reverse(num); 
     cout << num; 
     for (int i = 0; i < 10; i++) 
     { 
      if (num != Reverse(num)) 
      { 
       num = num + Reverse(num); 
       cout << " " << num; 
      } 
      if (num == Reverse(num)) 
      { 
       cout << " "; 
      } 
     } 
} 

가장 큰 문제는 루프입니다. 실제 수학은 어렵지 않지만 for 루프의 if 루프, 특히 for 루프의 루프를 설정하는 방법을 알아낼 수는 없습니다.어떻게이 C를 MIPS로 변환 할 수 있습니까?

정수로 찍은 다음 10 번까지 다른 정수를 출력합니다. 정수를 거꾸로 추가하여 반복적으로 회문인지 확인합니다.

메인 프로그램은 이미 rev 기능뿐 아니라 MIPS로 작성되었습니다. 나는 단지 내가 Palindrome 절차를 수행하는 방법을 이해할 을 이해하지 못합니다.

힌트를 보내 주시면 감사하겠습니다.

나는 이것을 시도 :

먼저 나는 10 시간 동안 계속됩니다 루프를 수행합니다.

그때 나는 그것이 정말 잘못된해야합니다 알고있는 회문 절차

jal rev      # call rev function 

la $a0, spaces    # display the number 
bne $a0, $v0, then   # if num isnt equal to rev 
add $a0, $a0, $t1   # num = num + reverse(num) 
la spaces, $a0    # display the added number each time 
beq $a0, $v0, then   # if num IS equal to rev 

// display spaces instead?? 

의 회전 함수를 호출하지만 이건 내 처음이 일을합니다.

+3

gcc 또는 무엇인가로 컴파일 할 수 있습니까? 손으로 최적화하거나 뭔가 특별한 것을해야하는 경우가 아니면 아키텍처를 MIPS로 설정하고 사용하십시오. –

+0

Im gcc에서 매우 새로 생겼습니다. 이전에 시도해 본 모든 시도에서 "허가가 거부되었습니다"라는 메시지가 나타납니다. 최선의 방법은 직접 작성하는 것입니다. – user2077525

+0

더 나은 방법은 LCC 일 수 있습니다. 설치하기가 쉽고 (기본적으로 MIPS 코드가 생성됩니다). 하지만 아마도 MIPS 어셈블러 숙제에서 속이는 것입니다 ;-) – vonbrand

답변

0

나는 rev 기능을 변경하지 않았지만 C를 MIPS로 컴파일하기 위해 Palindrome 절차를 변경해야했습니다. cin 또는 cout을 컴파일 할 수 없습니다 (C++이 아니므로) cincout은 주석 처리되었습니다.

int Reverse(int num) 
{ 
    int remainder = 0; 
    int rev = 0; 
    while (num != 0) 
    { 
     remainder = num % 10; 
     num = num /10; 
     rev = rev * 10 + remainder; 
    } 
    return rev; 
} 

void Palindrome() 
{ 
    int num = 0; 
    int i; 
     //cin >> num; 
    Reverse(num); 
     //cout << num; 

    for (i = 0; i < 10; i++) 
     { 
      if (num != Reverse(num)) 
      { 
       num = num + Reverse(num); 
       //cout << " " << num; 
      } 
      if (num == Reverse(num)) 
      { 
       //cout << " "; 
      } 
     } 
} 

int main (int argc , char * argv []) 
{ 
    return 0; 
} 




# -G value = 8, Cpu = 3000, ISA = 1 
# GNU C version cygnus-2.7.2-970404 (mips-mips-ecoff) compiled by GNU C version cygnus-2.7.2-970404. 
# options passed: -msoft-float 
# options enabled: -fpeephole -ffunction-cse -fkeep-static-consts 
# -fpcc-struct-return -fcommon -fverbose-asm -fgnu-linker -msoft-float 
# -meb -mcpu=3000 

gcc2_compiled.: 
__gnu_compiled_c: 
    .text 
    .align 2 
    .globl Reverse 
    .ent Reverse 
Reverse: 
    .frame $fp,16,$31  # vars= 8, regs= 1/0, args= 0, extra= 0 
    .mask 0x40000000,-8 
    .fmask 0x00000000,0 
    subu $sp,$sp,16 
    sw $fp,8($sp) 
    move $fp,$sp 
    sw $4,16($fp) 
    sw $0,0($fp) 
    sw $0,4($fp) 
$L2: 
    lw $2,16($fp) 
    bne $2,$0,$L4 
    j $L3 
$L4: 
    lw $2,16($fp) 
    li $3,1717960704   # 0x66660000 
    ori $3,$3,0x6667 
    mult $2,$3 
    mfhi $6 
    sra $3,$6,2 
    sra $4,$2,31 
    subu $3,$3,$4 
    move $5,$3 
    sll $4,$5,2 
    addu $4,$4,$3 
    sll $3,$4,1 
    subu $2,$2,$3 
    sw $2,0($fp) 
    lw $2,16($fp) 
    li $3,1717960704   # 0x66660000 
    ori $3,$3,0x6667 
    mult $2,$3 
    mfhi $6 
    sra $3,$6,2 
    sra $4,$2,31 
    subu $2,$3,$4 
    sw $2,16($fp) 
    lw $2,4($fp) 
    move $4,$2 
    sll $3,$4,2 
    addu $3,$3,$2 
    sll $2,$3,1 
    lw $3,0($fp) 
    addu $2,$2,$3 
    sw $2,4($fp) 
    j $L2 
$L3: 
    lw $3,4($fp) 
    move $2,$3 
    j $L1 
$L1: 
    move $sp,$fp   # sp not trusted here 
    lw $fp,8($sp) 
    addu $sp,$sp,16 
    j $31 
    .end Reverse 
    .align 2 
    .globl Palindrome 
    .ent Palindrome 
Palindrome: 
    .frame $fp,32,$31  # vars= 8, regs= 2/0, args= 16, extra= 0 
    .mask 0xc0000000,-4 
    .fmask 0x00000000,0 
    subu $sp,$sp,32 
    sw $31,28($sp) 
    sw $fp,24($sp) 
    move $fp,$sp 
    sw $0,16($fp) 
    lw $4,16($fp) 
    jal Reverse 
    sw $0,20($fp) 
$L6: 
    lw $2,20($fp) 
    slt $3,$2,10 
    bne $3,$0,$L9 
    j $L7 
$L9: 
    lw $4,16($fp) 
    jal Reverse 
    lw $3,16($fp) 
    beq $3,$2,$L10 
    lw $4,16($fp) 
    jal Reverse 
    lw $3,16($fp) 
    addu $2,$3,$2 
    sw $2,16($fp) 
$L10: 
    lw $4,16($fp) 
    jal Reverse 
    lw $3,16($fp) 
    bne $3,$2,$L8 
$L11: 
$L8: 
    lw $2,20($fp) 
    addu $3,$2,1 
    sw $3,20($fp) 
    j $L6 
$L7: 
$L5: 
    move $sp,$fp   # sp not trusted here 
    lw $31,28($sp) 
    lw $fp,24($sp) 
    addu $sp,$sp,32 
    j $31 
    .end Palindrome 
    .align 2 
    .globl main 
    .ent main 
main: 
    .frame $fp,24,$31  # vars= 0, regs= 2/0, args= 16, extra= 0 
    .mask 0xc0000000,-4 
    .fmask 0x00000000,0 
    subu $sp,$sp,24 
    sw $31,20($sp) 
    sw $fp,16($sp) 
    move $fp,$sp 
    sw $4,24($fp) 
    sw $5,28($fp) 
    jal __main 
    move $2,$0 
    j $L12 
$L12: 
    move $sp,$fp   # sp not trusted here 
    lw $31,20($sp) 
    lw $fp,16($sp) 
    addu $sp,$sp,24 
    j $31 
    .end main 
관련 문제