1

所以,对于这个任务,我必须编写一个汇编“函数”,由 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)

有人可以帮助我了解这里发生了什么以及如何修复我的代码吗?提前致谢。

4

0 回答 0