如何将汇编程序值返回给C Int指针?

问题描述 投票:1回答:2

我正在编写一个小型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。

c assembly x86 nasm pass-by-reference
2个回答
5
投票

你不需要一个指针。无论如何,如果你(或赋值)坚持,你必须1)初始化C侧的指针和2)通过asm侧的指针写入。

EG

int value;
int* result = &value;

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

4
投票

如果必须使用指针,这并不意味着您需要创建额外的指针变量。您只需传递适当类型的变量的地址即可。这将消除丢失内存分配的风险。缺少内存分配是导致问题的原因。 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);
© www.soinside.com 2019 - 2024. All rights reserved.