【问题标题】:Translate C code to MIPS assembly code将 C 代码转换为 MIPS 汇编代码
【发布时间】:2023-12-23 10:58:01
【问题描述】:

我希望将以下代码翻译成 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;
}

【问题讨论】:

  • 使用编译器编译?
  • 没错。编译器会为你编译成汇编代码...
  • 为什么是“while(n != 0)”,而不是简单的“while(n)”?

标签: c assembly translation mips


【解决方案1】:

我的 gcc 可以把它翻译成下面的程序集。

    .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

【讨论】:

    【解决方案2】:

    使用 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 <puts@plt>
      4007b0:   248408b8    addiu   a0,a0,2232
       scanf("%d",&n);
      4007b4:   3c040040    lui a0,0x40
      4007b8:   248408cc    addiu   a0,a0,2252
      4007bc:   0c10017c    jal 4005f0 <scanf@plt>
      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 <printf@plt>
      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
    

    【讨论】:

      最近更新 更多