c - 尝试从 C 调用汇编函数时出现段错误(核心转储)

标签 c assembly x86-64

运行这个程序后,我在使用 Ubuntu 14.04 时遇到了一个错误“段错误(核心转储)”,有人可以告诉我这是什么类型的错误以及如何解决它吗?这是代码:

#include<stdlib.h>
#include<stdio.h>

typedef struct {
  char hex[17];
  char dezimal[21];
}Stu;

extern Stu* _structfunc(int n);
int main(int argc, char *argv[])
{
        Stu* a = _structfunc(123456);
        printf("%s,%s",a->hex,a->dezimal);
        free (a);
        return 0;
} 
LEN_HEX equ 16
LEN_DEZ equ 10
LEN_STRUCT equ LEN_HEX + 1 + LEN_DEZ + 1
SECTION .data
base10 dq 10
base16 dq 16
SECTION .text
global _structfunc
extern malloc
extern free
_structfunc:
        push rbp
        mov rbp,rsp
        push rbx ;save the previous value in rdi 
        push rdi ;s.o.
        mov rdi,LEN_STRUCT
        call malloc ;adress in rax
        mov rbx,rax
        mov rax,[rsp]
        mov rcx,LEN_HEX
hex:
        mov rdx,0
        div qword [base16]
        cmp rdx,10
        jae hex_charactor
        add rdx,0x30
        jmp hex_end
hex_charactor:
        add rdx,0x37
hex_end:
        mov [rbx+rcx-1],dl
        loop hex
        mov byte [rbx+LEN_HEX],0
        mov rax,[rsp]
        mov rcx, LEN_DEZ
dez:
        mov rdx,0
        div qword [base10]
        add rdx,0x30
dez_end:
        mov [rbx+LEN_HEX+1+rcx-1],dl
        loop dez
        mov byte [rbx+LEN_STRUCT-1],0
        add rsp,8
        pop rbx
        pop rbp
        ret

该函数应返回一个结构体地址,其中包括十六进制形式的 123456 和十进制形式的 123456

最佳答案

段错误意味着它尝试访问无效地址。

原因是它没有在 ret 之前加载带有返回值(来自 rbx)的 rax。

通常,您会使用调试器来确定哪一行代码失败以及无效地址是什么,以便追踪无效地址的来源。

关于c - 尝试从 C 调用汇编函数时出现段错误(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56721589/

相关文章:

c - 无需指定 'lib' 前缀即可在 gcc 中链接静态库

c - 将结构与其中的结构 union 打包

c - 函数声明与原型(prototype)的替代 (K&R) C 语法

assembly - 在堆栈帧中推送返回值

c - Intel 指令的 LOCK 前缀。重点是什么?

c++ - 二进制补码形式所需的最少位数

linux - 从命令行创建文件

assembly - 带段寄存器的 x86-64 MOV 指令上的 REX.W 前缀

c - 无法找到 yylex 中 ^D 错误的解决方案

assembly - 如果没有 CMP,JE 指令如何工作?