【发布时间】: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