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

IPo*_*Fan 1 c x86 assembly nasm pass-by-reference

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

}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

通过调试,我知道我最终在eax中得到了正确的值。但是以某种方式,我无法使其由C程序打印。您能给我一个解决方法的提示吗?

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

Jes*_*ter 5

您不需要为此的指针。无论如何,如果您(或分配)坚持,则必须1)在C侧初始化所述指针,并2)在asm侧通过该指针写入。

例如

int value;
int* result = &value;
Run Code Online (Sandbox Code Playgroud)

mov ecx, [ebp+12]
mov [ecx], eax
Run Code Online (Sandbox Code Playgroud)

  • 如果不初始化它,并且未初始化的指针碰巧是有效的可写地址,则将覆盖随机存储器。否则会出现故障。 (2认同)