简体   繁体   中英

How to return an assembler value to a C Int Pointer?

I am writing a small ASM/C-Program for calculating the number of dividers of a number. I got the following C function:

#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;

}

where I receive a result from the following assembler programm:

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

From Debugging, I know, that I end up with the right value in eax. But somehow I cannot get it to be printed by my C programm. Could you give me a hint on how to solve this?

If neccessary, I am using NASM and GCC.

You do not need a pointer for this. Anyway, if you (or the assignment) insist, you must 1) initialize said pointer on the C side and 2) write through that pointer on the asm side.

Eg

int value;
int* result = &value;

and

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

If you must use a pointer, this does not mean you need to create an extra pointer variable. You can just pass the address of a variable of proper type. This would eliminate the risk of missing memory allocation. Missing memory allocation is the reason for your problem. result does not point to valid memory.

Instead of

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

you could use this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM