Ошибка сегментации (ядро сброшено) при попытке вызвать функции сборки из C - PullRequest
0 голосов
/ 23 июня 2019

после запуска этой программы я получил ошибку 'Ошибка сегментации (сброшено ядро)'. Я использую 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

1 Ответ

1 голос
/ 23 июня 2019

Ошибка сегментации означает, что она пыталась получить доступ к неверному адресу.

Причина в том, что он не загружает rax возвращаемым значением (из rbx) перед ret.

Обычно вы используете отладчик, чтобы определить, какая строка кода завершилась неудачно и что такое недопустимый адрес, чтобы отследить, откуда пришел недопустимый адрес.

...