【问题标题】:Trying to understand GCC generated MIPS code试图理解 GCC 生成的 MIPS 代码
【发布时间】:2022-01-15 08:33:31
【问题描述】:

对于底部的编译代码,我试图了解数组的标签是什么,它在哪里保存 add/sub、pos/neg 基本内容的值。或者只是它如何处理计算。任何智慧都值得赞赏

我有这个 C 代码

#include <stdio.h>

void calc(int arr[], int size, int* sum, int* pos, int* neg);


int main () {

        int size = 10, sum=0, pos=0, neg=0;
        int arr[10] = {12, -1, 8, 0, 6, 85, -74, 23, 99, -30};
        calc(arr, size, &sum, &pos, &neg);
        return 0;


// Calculation procedure

void calc(int arr[], int size, int* sum, int* pos, int* neg);

        for (int i = 0; i < size; i++) {
        sum += arr[i];
        if (arr[i] > 0)
                pos += arr[i];
        if (arr[i] < 0)
                neg += arr[i];
        }
}

编译成这个

.text
    .globl  main
    .type   main, @function

main:
.LFB0:
    
.cfi_startproc
    
pushq   %rbp
    
.cfi_def_cfa_offset 16  
.cfi_offset 6, -16
    
movq    %rsp, %rbp
    
.cfi_def_cfa_register 6
    
subq    $64, %rsp   
movl    $10, -4(%rbp)   
movl    $0, -8(%rbp)    
movl    $0, -12(%rbp)   
movl    $0, -16(%rbp)   
movl    $12, -64(%rbp)  
movl    $-1, -60(%rbp)  
movl    $8, -56(%rbp)   
movl    $0, -52(%rbp)   
movl    $6, -48(%rbp)   
movl    $85, -44(%rbp)  
movl    $-74, -40(%rbp) 
movl    $23, -36(%rbp)  
movl    $99, -32(%rbp)  
movl    $-30, -28(%rbp) 
leaq    -16(%rbp), %rdi 
leaq    -12(%rbp), %rcx 
leaq    -8(%rbp), %rdx  
movl    -4(%rbp), %esi  
leaq    -64(%rbp), %rax 
movq    %rdi, %r8   
movq    %rax, %rdi  
call    calc    
movl    $0, %eax    
leave
    
.cfi_def_cfa 7, 8
    
ret
    
.cfi_endproc

.LFE0:  
.size   main, .-main    
.ident  "GCC: (GNU) 7.3.1 20180712 (Red Hat 7.3.1-13)"  
.section    .note.GNU-stack,"",@progbits

【问题讨论】:

  • 欢迎来到 SO。请花点时间修复您的代码。没有必要张贴所有这些空行。此外,如果您有 C 代码,则 C++ 标志不相关。请避免添加不相关的标签。
  • 这不是 MIPS 代码,它是 x64 代码。
  • 数组没有标签。数组是堆栈上的局部变量。因此,相对于帧指针%rbp,存在一个偏移量,即 -64 字节。
  • @selbie 不适用于 mips。
  • 您的代码已完全损坏。你从来没有define calc(),因为你弄乱了你的括号并在main()之后重新声明了calc() inside,在return 0之后,所以@ 987654329@-loop 是死代码。 fixed code,请注意优化编译器可以在这里删除几乎所有代码,因为唯一可观察到的副作用是 main() 中的 return 0;

标签: c linux mips


【解决方案1】:

Mips 代码:

$LC0:
        .word   12
        .word   -1
        .word   8
        .word   0
        .word   6
        .word   85
        .word   -74
        .word   23
        .word   99
        .word   -30
main:
        addiu   $sp,$sp,-96
        lui     $5,%hi($LC0)
        addiu   $4,$sp,32
        li      $6,40                 # 0x28
        addiu   $5,$5,%lo($LC0)
        sw      $31,92($sp)
        sw      $0,80($sp)
        sw      $0,76($sp)
        jal     memcpy
        sw      $0,72($sp)

        addiu   $2,$sp,72
        sw      $2,16($sp)
        addiu   $7,$sp,76
        addiu   $6,$sp,80
        addiu   $4,$sp,32
        jal     calc
        li      $5,10                 # 0xa

        lw      $31,92($sp)
        move    $2,$0
        j       $31
        addiu   $sp,$sp,96

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 2014-07-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多