【问题标题】:Are arrays stored in reverse order in C/C++?数组在 C/C++ 中是否以相反的顺序存储?
【发布时间】:2015-03-03 00:08:26
【问题描述】:

我想在 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'

并假设它的第一个元素是'a'的地址。或者像以前那样做没有问题,而不是增加 1 以获得下一个元素,我只是减少 1?


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

【问题讨论】:

  • C 被转换为汇编,那么为什么要更改插入数组的顺序?如果在您将第一个添加到 Assembly 中的数组中,您应该保持相同的顺序
  • 数组存储顺序与堆栈增长方向不同。数组不是通过在汇编语言中将字节推入堆栈来创建的。你能改写你的问题吗?
  • 我不明白如何将第一个元素放在最低地址将被视为“反转”。您似乎只是将数组的概念与堆栈混淆了。
  • @Michael 所以我应该像上一个例子一样在Assembly中初始化一个数组,并让第一个元素的地址是'a'的地址?
  • @John 为什么要使用 PUSH 指令初始化数组?

标签: c++ c arrays assembly nasm


【解决方案1】:

你不是在这里创建数组。堆栈执行 PUSH 和 POP,堆栈的通用规则是:后进先出

如果你想创建数组,那么你可以简单地使用一系列mov命令:

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

或使用数据定义指令

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

【讨论】:

  • 好吧,实际上我正在同时创建和初始化数组。我的意思是我应该如何在 Assembly: sub esp, 4 中创建一个数组?
  • @John 是的。然后你可以使用 MOV 指令对其进行初始化。
  • PUSH imm8 可能比一系列MOVs 更紧凑(导致代码更小),如果这很重要的话。更紧凑(期望非常短的数组)可能是在某处(即foo: db 1,2,3,4,...)拥有数组数据的副本并使用rep movs 将数据复制到堆栈。
  • @John PUSH 也是正确的,只要顺序一致即可。
  • 另外...当心 Nasm 语法 push byte 'a'。操作数存储为一个字节,但单个字节不存储在堆栈中(没有这样的指令!)。
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 2015-05-05
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多