X86_64 Сбой кода сборки и выдача ошибки разбивки стека - PullRequest
0 голосов
/ 16 октября 2018

Итак, для этого назначения мне нужно написать ассемблерную «функцию», которая будет вызываться кодом C.Назначение функции, учитывая целое число и адрес памяти (адрес массива символов, который будет использоваться в качестве строки), преобразовать целое число в строку, начальный адрес которой является заданным адресом памяти.Я на Ubuntu Linux, кстати.

Вот код ассемблера (я пытался сделать это, используя соглашения о вызовах ABI Linux x86_64) (Это в синтаксисе AT & T):

.global dec
.type dec, @function
.text
dec:

######################### Subroutine prologue

push    %rbp            # Save the base pointer
movq    %rsp, %rbp      # Make the stack pointer the new base pointer
push    %rdi            # Stack parameter 1
push    %rsi            # Stack parameter 2

push    %rbx            # Save callee-saved registers
push    %r12
push    %r13
push    %r14
push    %r15


######################### Subroutine body

movq    %rdi, %rax
xor     %rcx, %rcx
addDigit:
cmp     $0, %rax
je      putMem
xor     %rdx, %rdx
mov     $10, %ebx
div     %ebx
addq    $'0', %rdx
pushq   %rdx
inc     %rcx
jmp     addDigit

putMem:
cmp     $0, %rcx
je      endProg
popq    (%rsi)
add     $1, %rsi
dec     %rcx
jmp     putMem

endProg:
movq    $0x0, (%rsi)
movq    -16(%rbp), %rsi
mov     $1, %rax

######################### Subroutine epilogue

popq %r15          # Restore callee-saved registers
popq %r14
popq %r13
popq %r12
popq %rbx

movq %rbp, %rsp    # Reset stack to base pointer.
popq %rbp          # Restore the old base pointer

ret                # Return to caller

А вот мой код C:

extern int dec(int num, char* c);
#include <stdio.h>
int main(){
    char* a = "Test\n";
    dec(0x100, a);
    printf("Num: %s\n", a);
}

Он компилируется без проблем, но когда я пытаюсь запустить, он вызывает ошибки.Я попытался отладить его с помощью GDB, и, по-видимому, проблема возникает, когда я пытаюсь запустить инструкцию

pop     (%rsi)

Итак, я сделал несколько изменений в своем коде C:

extern int dec(int num, char* c);
#include <stdio.h>
int main(){
    char c;
    dec(0x100, &c);
    printf("Num: %s\n", &c);
}

Теперь, когда я пытаюсь запустить его, я получаю это сообщение:

Num: 256
*** stack smashing detected ***: ./teste.out terminated
Aborted (core dumped)

Может ли кто-нибудь помочь мне понять, что здесь происходит и как я могу исправить свой код?Заранее спасибо.

...