繁体   English   中英

如何通过分析汇编程序和 C 代码来查找数组大小

[英]How to find array size by analysing assembler and C code

我想知道如何从下面的 c 和相应的汇编代码中找到常数M的值。 有什么方法可以仅通过分析代码来确定M吗?

#include<stdio.h>
int main(){
    
    int i=7;
    int a[14];
    
    a[i] = 99;
    
    int b[M];
    b[i] = 88;
 }

给出的汇编代码

main : 
endr64
pushq %rbp
movq %rsp, %rbp
subq $80, %rsp
movl $7, -80(%rbp)
movl -80(%rbp), %eax
cltq
movl $99, -64(%rbp,%rax,4)
movl -80(%rbp),%eax
cltq
movl $88, -76(%rbp,%rax,4)
movl $0,%eax
leave
ret

在此处输入图像描述

想想由于变量的分配,堆栈的格式是什么。 您可以从堆栈指针rbp看到i位于 -80 上。 您还可以看到a[0]位于 -64 (参见movl $99, -64(%rbp,%rax,4) ),而b[0]位于 -76 (参见movl $99, -76(%rbp,%rax,4) )。 因此,b 的开头位于 a 开头的 -12 个字节处,即 b 的长度为 12 个字节。

接下来你需要知道的是int的大小是4,所以12/4 = 3,所以M是3。

在以下代码上使用gcc -s即可验证。

#include<stdio.h>
#define M 3
int main(){

    int i=7;
    int a[14];

    a[i] = 99;

    int b[M];
    b[i] = 88;
 }

也许这张堆栈布局的图片可能会有所帮助:

               --------------------
               | return from main |
               --------------------
               |  pushed RBP      |
               --------------------
RBP-08|RBP-04  |         |        |
               --------------------
RBP-16|RBP-12  |  a[12]  |  a[13] |
               --------------------
RBP-24|RBP-20  |  a[10]  |  a[11] |
               --------------------
RBP-32|RBP-28  |  a[8]   |  a[9]  |
               --------------------
RBP-40|RBP-36  |  a[6]   |  a[7]  |
               --------------------
RBP-48|RBP-44  |  a[4]   |  a[5]  |
               --------------------
RBP-56|RBP-52  |  a[2]   |  a[3]  |
               --------------------
RBP-64|RBP-60  |  a[0]   |  a[1]  |
               --------------------
RBP-72|RBP-68  |  b[1]   |  b[2]  |
               --------------------
RBP-80|RBP-76  |   i=7   |  b[0]  |
               --------------------

a[7]被寻址为RBP-36b[7]将被寻址为RBP-48 (如果只有数组 b[] 会被分配这么大)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM