2014-07-10 14 views
-7

Я хотел бы, чтобы следующий код был переведен на язык ассемблера MIPS. Как бы я перевел его? Или есть проблема?Перевести код C на код сборки MIPS

#include <stdio.h> 

int main() 
{ 
    int n, sum = 0, remainder; 

    printf("Enter an integer\n"); 
    scanf("%d",&n); 

    while(n != 0) 
    { 
     remainder = n % 10; 
     sum = sum + remainder; 
     n = n/10; 
    } 

    printf("Sum of digits of entered number = %d\n",sum); 

    return 0; 
} 
+8

использовать компилятор, чтобы скомпилировать его? –

+0

Точно. Компилятор компилирует его в код сборки для вас ... –

+0

Почему «while (n! = 0)», а не просто «while (n)»? –

ответ

1

Перевести его в нечто вроде этого, с помощью GCC:

4007a0 <main>: 
    4007a0: 3c040040 lui a0,0x40 
int main() { 
    4007a4: 27bdffd8 addiu sp,sp,-40 
    4007a8: afbf0024 sw ra,36(sp) 
    int n, sum = 0, remainder; 
    printf("Enter an integer\n"); 
    4007ac: 0c10018c jal 400630 <[email protected]> 
    4007b0: 248408b8 addiu a0,a0,2232 
    scanf("%d",&n); 
    4007b4: 3c040040 lui a0,0x40 
    4007b8: 248408cc addiu a0,a0,2252 
    4007bc: 0c10017c jal 4005f0 <[email protected]> 
    4007c0: 27a50018 addiu a1,sp,24 
    while(n != 0) 
    4007c4: 8fa20018 lw v0,24(sp) 
    4007c8: 10400017 beqz v0,400828 <main+0x88> 
    4007cc: 3c036666 lui v1,0x6666 
    4007d0: 00002821 move a1,zero 
    { 
     remainder = n % 10; 
    4007d4: 24636667 addiu v1,v1,26215 
    4007d8: 00430018 mult v0,v1 
    4007dc: 000227c3 sra a0,v0,0x1f 
    4007e0: 00004810 mfhi t1 
    4007e4: 00093083 sra a2,t1,0x2 
    4007e8: 00c42023 subu a0,a2,a0 
    4007ec: 00043840 sll a3,a0,0x1 
    4007f0: 000430c0 sll a2,a0,0x3 
    4007f4: 00e63021 addu a2,a3,a2 
    4007f8: 00463023 subu a2,v0,a2 
     sum = sum + remainder; 
    4007fc: 00a62821 addu a1,a1,a2 
    400800: 1480fff5 bnez a0,4007d8 <main+0x38> 
    400804: 00801021 move v0,a0 
    400808: afa00018 sw zero,24(sp) 
    } 
    printf("Sum of digits of entered number = %d\n",sum); 
    40080c: 3c040040 lui a0,0x40 
    400810: 0c100188 jal 400620 <[email protected]> 
    400814: 248408d0 addiu a0,a0,2256 
    return 0; 
} 
    400818: 8fbf0024 lw ra,36(sp) 
    40081c: 00001021 move v0,zero 
    400820: 03e00008 jr ra 
    400824: 27bd0028 addiu sp,sp,40 
0

Мой НКУ может перевести его на следующей сборке.

.file 1 "C2MIPS.c" 

# -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: 
    .rdata 
    .align 2 
$LC0: 
    .ascii "Enter an integer\n\000" 
    .sdata 
    .align 2 
$LC1: 
    .ascii "%d\000" 
    .rdata 
    .align 2 
$LC2: 
    .ascii "Sum of digits of entered number = %d\n\000" 
    .text 
    .align 2 
    .globl main 
    .ent main 
main: 
    .frame $fp,40,$31  # vars= 16, regs= 2/0, args= 16, extra= 0 
    .mask 0xc0000000,-4 
    .fmask 0x00000000,0 
    subu $sp,$sp,40 
    sw $31,36($sp) 
    sw $fp,32($sp) 
    move $fp,$sp 
    jal __main 
    sw $0,20($fp) 
    la $4,$LC0 
    jal printf 
    la $4,$LC1 
    addu $5,$fp,16 
    jal scanf 
$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,24($fp) 
    lw $2,20($fp) 
    lw $3,24($fp) 
    addu $2,$2,$3 
    sw $2,20($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) 
    j $L2 
$L3: 
    la $4,$LC2 
    lw $5,20($fp) 
    jal printf 
    move $2,$0 
    j $L1 
$L1: 
    move $sp,$fp   # sp not trusted here 
    lw $31,36($sp) 
    lw $fp,32($sp) 
    addu $sp,$sp,40 
    j $31 
    .end main 
Смежные вопросы