gpt4 book ai didi

c - 段错误 : 11 Assembly OSX

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:45 25 4
gpt4 key购买 nike

您好,我对使用 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);
}

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

最佳答案

除了评论中指出的其他错误外,您这里还有一个重要问题:

         "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 函数结尾。这意味着堆栈没有被正确清理,堆栈也没有被恢复。这几乎肯定会导致崩溃。

关于c - 段错误 : 11 Assembly OSX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36273946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com