【发布时间】:2014-09-10 17:50:09
【问题描述】:
我有一个 C 函数,它为一个数组分配了一些内存,该数组将被填充到某个 N 以内的自然数。
让我们说,
N = 10;
array = calloc(N, sizeof(int));
然后我调用我编写的汇编函数,但是我似乎无法访问数组字段。我设法找到位于 8(%ebp) 处的 N 的值,并且我已与 GDB 核对它确实等于 C 代码中设置的 N。
但是,当我尝试访问数组中的第一个元素并将其移动到例如 %esi 时,该值不是应为的零。
我使用下面的代码来做
movl 12(%ebp), %esi
编辑;在调用汇编函数之前,我当然会用自然数填充数组。我只是不想在这里输入 for 循环。
据我了解,括号取消引用数组的第一个元素,并将其复制到 esi,但是,当我在 GDB 中此代码之后设置的断点上使用信息寄存器时,esi 仅包含一个巨大的负数。
那么,我如何访问预先调用并传递给汇编函数的数组?是否不能取消引用并复制该单个元素?
这是调用汇编函数的 C 函数
int main(int argc, char *argv[]){
int n = 10;
int *array = calloc(n, sizeof(int));
int i, j;
// Populate array up to N
for(i = 0; i < n; i++){
array[i] = 2 + i;
}
printf("Array: %d \n", sizeof(array));
// Run sievs
sievs_assembly(n, array);
// print prime
print_prime(array, n);
// Free mem
free(array);
return EXIT_SUCCESS;
}
我不想发布整个程序集文件,因为它是一个学校项目,我不寻求帮助解决评估,只寻求具体问题。如何取消对数组项的引用。
函数原型是
extern void sievs_assembly(int n, int *a);
我认为由于指针 *a 是一个 int 数组,并且第一个参数 N 位于 8(%ebp),所以第一个数组元素将是 12(%ebp)。
如果仅执行 movl 12(%ebp), %esi 还不够,我该如何获得该值
【问题讨论】:
-
你没有展示你的功能,甚至没有展示它的原型。我将假设您正在传递一个指针,因此您需要取消引用。
12(%ebp)仅取消引用ebp以获取参数,它不会取消引用指针本身。 -
我将编辑并发布所有内容。原型是 func(int n, int *a)
-
如何取消对指针本身的引用?
-
到目前为止,您已经将指针加载到
%esi,要取消引用它,请执行movl (%esi), %esi。旁注:根据标准调用约定,您必须保留esi(以及其他),因此请确保这样做。 -
是的,例如使用
movl $42, (%esi)。这是假设esi仍然持有指针,即。你还没有在那里加载一个值。
标签: c assembly gnu-assembler