数组是否以C / C ++的相反顺序存储?

时间:2015-01-05 12:43:10

标签: c++ c arrays assembly nasm

我想在Assembly中创建一个4元素数组:

; Create an array of 4 elements
push BYTE 'a'
push BYTE 'b'
push BYTE 'c'
push BYTE 'd'

我想到了数组以相反的顺序存储在C / C ++中(第一个元素的内存地址最低,最后一个元素的内存地址最高),所以为了确保我的假设是正确的,我做了以下测试:

#include <stdio.h>

int main()
{
    char arr[4] = {'a', 'b', 'c', 'd'};

    printf("Address: %d Value: %c\n", arr + 0, *(arr + 0));
    printf("Address: %d Value: %c\n", arr + 1, *(arr + 1));
    printf("Address: %d Value: %c\n", arr + 2, *(arr + 2));
    printf("Address: %d Value: %c\n", arr + 3, *(arr + 3));

    return 0;
}

输出结果符合预期:

Address: 3603656 Value: a
Address: 3603657 Value: b
Address: 3603658 Value: c
Address: 3603659 Value: d

这是否意味着我应该像这样在Assembly中创建数组:

; Create an array of 4 elements
push BYTE 'd'
push BYTE 'c'
push BYTE 'b'
push BYTE 'a'

并假设它的第一个元素是&#39; a&#39;的地址。或者像以前一样没有问题而不是递增1来到下一个元素我只减1?


修改: 我的意思是相对于堆栈(向下增长)的反向顺序。

1 个答案:

答案 0 :(得分:0)

你不是在这里创建数组。 PUSH和POP是针对堆栈执行的,堆栈的通用规则是: Last in First out

如果要创建数组,则只需使用系列mov命令:

mov <mem>,<const>  // x86 instruction   

或使用数据定义指令

Array DW 'a', 'b', 'c', 'd'