如何 return 一个汇编器值到一个 C Int 指针?
How to return an assembler value to a C Int Pointer?
我正在写一个小的ASM/C-Program来计算一个数的除数。我得到以下 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。
您不需要指针。无论如何,如果您(或分配)坚持,您必须 1)在 C 端初始化所述指针和 2)在 asm 端写入该指针。
例如
int value;
int* result = &value;
和
mov ecx, [ebp+12]
mov [ecx], eax
如果你必须使用指针,这并不意味着你需要创建一个额外的指针变量。您可以只传递适当类型的变量的地址。这将消除丢失内存分配的风险。
缺少内存分配是您遇到问题的原因。 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);
我正在写一个小的ASM/C-Program来计算一个数的除数。我得到以下 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。
您不需要指针。无论如何,如果您(或分配)坚持,您必须 1)在 C 端初始化所述指针和 2)在 asm 端写入该指针。
例如
int value;
int* result = &value;
和
mov ecx, [ebp+12]
mov [ecx], eax
如果你必须使用指针,这并不意味着你需要创建一个额外的指针变量。您可以只传递适当类型的变量的地址。这将消除丢失内存分配的风险。
缺少内存分配是您遇到问题的原因。 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);