【问题标题】:How to return an assembler value to a C Int Pointer?如何将汇编程序值返回给 C Int 指针?
【发布时间】:2019-04-23 14:41:27
【问题描述】:

我正在编写一个小的 ASM/C 程序来计算一个数字的除数。我得到了以下 C 函数:

#include <stdio.h>
extern void getDivisorCounter(int value, int* result);

int main(int argc, char** argv) {

    int number;
    printf("Please insert number:\n");
    scanf("%d", &number);

    int* result;

    getDivisorCounter(number, result);

    printf("amount of div: %d\n", *result);

    return 0;

}

我从以下汇编程序收到结果:

section .text

global getDivisorCounter

getDivisorCounter:

    push    ebp
    mov     ebp, esp

    mov     ecx, [ebp+8]

    mov     eax, 0
    push    ebx

    for_loop:

        mov     ebx, ecx

        jmp checking

        adding:
            add     ebx, ecx

        checking:
            cmp     ebx, [ebp+8]
            jg      looping
            jl      adding
            inc     eax

        looping:
            loop for_loop

    mov     [ebp+12], eax
    pop     ebx
    pop     ebp

    ret

通过调试,我知道,我最终在 eax 中得到了正确的值。但不知何故,我的 C 程序无法打印它。 你能告诉我如何解决这个问题吗?

如有必要,我正在使用 NASM 和 GCC。

【问题讨论】:

  • 您将未初始化的指针传递给函数。不清楚为什么你使用指针而不是简单地返回一个值。
  • 我的任务是这样做:p 没有得到函数初始化的指针?
  • 在 C 中,您按值传递变量。除非您获得传递的该变量的地址,否则您不能从被调用函数中更改调用者范围内的变量。你需要为那个指针变量做一些内存分配......

标签: c assembly x86 nasm pass-by-reference


【解决方案1】:

你不需要一个指针。无论如何,如果您(或作业)坚持,您必须 1)在 C 端初始化所述指针,2)在 asm 端写入该指针。

例如

int value;
int* result = &value;

mov ecx, [ebp+12]
mov [ecx], eax

【讨论】:

  • 非常感谢 :) 有趣的是,甚至不需要初始化。重要的部分是附加的 ASM 代码。
  • 如果你不初始化它,如果你的未初始化指针恰好是一个有效的可写地址,你将覆盖随机内存。否则你会出错。
【解决方案2】:

如果你必须使用指针,这并不意味着你需要创建一个额外的指针变量。您可以只传递正确类型的变量的地址。这将消除丢失内存分配的风险。 缺少内存分配是您的问题的原因。 result 没有指向有效的内存。

代替

int  val;
int *result = &val;  // <<== note the mandatory initialization of your pointer.
getDivisorCounter(number, result);
printf("amount of div: %d\n", val);

你可以用这个:

int result;
getDivisorCounter(number, &result);
printf("amount of div: %d\n", result);

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多