Как вернуть значение ассемблера в указатель C Int? - PullRequest
1 голос
/ 23 апреля 2019

Я пишу небольшую 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.Но так или иначе я не могу заставить это быть напечатанным моей программой на Си.Не могли бы вы дать мне подсказку, как решить эту проблему?

При необходимости я использую NASM и GCC.

Ответы [ 2 ]

5 голосов
/ 23 апреля 2019

Вам не нужен указатель для этого.В любом случае, если вы (или назначение) настаиваете, вы должны 1) инициализировать указанный указатель на стороне C и 2) записать этот указатель на стороне asm.

Например:

int value;
int* result = &value;

и

mov ecx, [ebp+12]
mov [ecx], eax
4 голосов
/ 23 апреля 2019

Если вы должны использовать указатель, это не значит, что вам нужно создать дополнительную переменную указателя.Вы можете просто передать адрес переменной правильного типа.Это устранит риск пропущенного выделения памяти.Отсутствие выделения памяти является причиной вашей проблемы.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);
...