您好我还是使用gcc编译器的汇编语言的新手,现在我正在处理函数。
我的程序会询问用户4 int
个值,将这些值存储在注册eax
,ebx
,ecx
和edx
中,然后调用一个函数来划分( ebx/eax
)。我存储" d"的值分割后因为我了解idiv
使用edx
来存储残留物。然后它减去(eax-ecx
)并乘以(eax*edx
),然后返回寄存器eax
内的值。出于某种原因,我得到了一个分段错误:11。
这是我的代码:
#include <stdio.h>
int a, b, c, d;
int main (void)
{
printf("Dame a: ");
scanf("%d", &a);
printf("Dame b: ");
scanf("%d", &b);
printf("Dame c: ");
scanf("%d", &c);
printf("Dame d: ");
scanf("%d", &d);
__asm( ".intel_syntax noprefix;"
"xor eax, eax;"
"mov eax, dword ptr [_a];"
"xor ebx, ebx;"
"mov ebx, dword ptr [_b];"
"xor ecx, ecx;"
"mov ecx, dword ptr [_c];"
"Call fun1;"
"mov dword ptr [_a], eax;"
"fun1: xor edx, edx;"
"idiv ebx;"
"sub eax, ecx;"
"mov edx, dword ptr [_d];"
"imul eax, edx;"
"ret;"
".att_syntax");
printf("%d\n", a);
}
是否与某些指针错误有关?
答案 0 :(得分:2)
除了评论中指出的其他错误之外,您还有一个重要问题:
"mov ecx, dword ptr [_c];"
"Call fun1;"
"mov dword ptr [_a], eax;"
"fun1: xor edx, edx;"
"idiv ebx;"
"sub eax, ecx;"
"mov edx, dword ptr [_d];"
"imul eax, edx;"
"ret;"
考虑程序流程。您的C代码属于此汇编代码。汇编代码调用它自己的内部函数(不是问题),然后返回到调用之前的指令......仍然没问题。将值移入EAX ...然后您将通过函数返回到返回值。这非常糟糕。
通过落到那个ret
,你绕过整个C函数epilog。这意味着堆栈未正确清理,堆栈也无法恢复。这几乎肯定会导致崩溃。