X86和ARM的内存安排

本文探讨了X86和ARM体系在内存安排上的差异,包括栈的增长方向、函数参数及自动变量的存储方式。在ARM体系中,栈从高地址向低地址增长,函数参数先存入寄存器再按从左到右顺序入栈,自动变量从高地址向低地址存储。而在X86系统(如Ubuntu和Cygwin环境)中,尽管栈同样从高地址向低地址增长,但函数参数处理有所不同,Ubuntu中是从右到左入栈,而Cygwin中则是先存寄存器再从左到右入栈,自动变量则从低地址向高地址存储。结论指出,两者栈的增长方向一致,但参数处理和自动变量存储方向存在差异。
摘要由CSDN通过智能技术生成

程序

#include <stdio.h>
//int g1 = 0, g2 = 0, g3 = 0;
void  func(int p1, int p2, int p3)
{
    int v1 = p1, v2 = p2, v3 = p3;
    printf("局部变量地址:\n");
    printf("v1:%lu\n", (unsigned long)&v1);
    printf("v2:%lu\n", (unsigned long)&v2);
    printf("v3:%lu\n",(unsigned long) &v3);
    printf("\n");
    printf("参数地址:\n");
    printf("p1:%lu\n", (unsigned long)&p1);
    printf("p2:%lu\n", (unsigned long)&p2);
    printf("p3:%lu\n", (unsigned long)&p3);
    printf("\n");
}
int main(int argc, char const *argv[])
{
    int x = 0;
    int y = 1;
    int z = 2;
    printf("main函数中局部变量地址:\n");
    printf("x:%lu\n", (unsigned long)&x);
    printf("y:%lu\n", (unsigned long)&y);
    printf("z:%lu\n", (unsigned long)&z);
    func(1,2,3);
    return 0;
}

arm体系

arm输出

输入如下命令:

arm-linux-gcc  hello.c -o hello -fomit-frame-pointer  -O0
arm-linux-objdump -d  hello > hello.txt 

mini210开发板(Linux)输出:

main函数中局部变量地址: //栈,占4个字节,高地址到低地址
x:3198381100
y:3198381096
z:3198381092

局部变量地址:         //栈,占4个字节,高地址到低地址
v1:3198381068
v2:3198381064
v3:3198381060
                //间隔8个字节
参数地址:       //栈,占4个字节,高地址到低地址
p1:3198381052
p2:3198381048
p3:3198381044

反汇编

00008454 <func>:
    8454:   e52de004    push    {lr}        ; (str lr, [sp, #-4]!)
    8458:   e24dd024    sub sp, sp, #36 ; 0x24
    845c:   e58d000c    str r0, [
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值