X86_64汇编代码段错误,并给出堆栈粉碎错误

时间:2018-10-16 16:48:17

标签: linux string assembly segmentation-fault stack-smash

因此,对于此分配,我必须编写要由C代码调用的程序集“函数”。该函数的用途是,给定一个整数和一个内存地址(用作字符串的char数组的地址),将整数转换为字符串,起始地址是给定的内存地址。 我在Ubuntu Linux上。

这是汇编代码(我尝试使用Linux x86_64 ABI调用约定进行编写)(采用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)

有人可以帮助我了解这里发生的事情以及如何修复我的代码吗? 预先感谢。

0 个答案:

没有答案