分段错误:11装配OSX

时间:2016-03-29 01:36:43

标签: c macos gcc assembly x86

您好我还是使用gcc编译器的汇编语言的新手,现在我正在处理函数。 我的程序会询问用户4 int个值,将这些值存储在注册eaxebxecxedx中,然后调用一个函数来划分( 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);
}

是否与某些指针错误有关?

1 个答案:

答案 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。这意味着堆栈未正确清理,堆栈也无法恢复。这几乎肯定会导致崩溃。