【发布时间】: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;。