[英]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-36而b[7]将被寻址为RBP-48 (如果只有数组 b[] 会被分配这么大)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.