Итак, для этого назначения мне нужно написать ассемблерную «функцию», которая будет вызываться кодом 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)
Может ли кто-нибудь помочь мне понять, что здесь происходит и как я могу исправить свой код?Заранее спасибо.