因此,对于此分配,我必须编写要由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)
有人可以帮助我了解这里发生的事情以及如何修复我的代码吗? 预先感谢。