Passando um ponteiro para uma função de montagem
Eu sou bastante novo na programação de montagem. Estou usando a plataforma x86 com GCC (Linux).
Eu tenho uma função que eu quero chamar de C como:
myfunc ( unsigned char * s1, unsigned char * s2, int someint );
A função pega os locais de memória s1 e s2 e os compara, depois incrementa e compara, etc., fazendo algum processamento à medida que avança. É como o memcmp, mas estou fazendo mais.
Minha pergunta: se eu passar um ponteiro para uma função de montagem? E então como digo "me dê o valor armazenado neste endereço de memória"?
Aqui está o que eu tenho até agora:
Para tirar a primeira função arg ("s1") da pilha, eu faço isso (someaddress é um número inteiro de 32 bits e estou trabalhando em um processador de 32 bits):
movl 8(%esp), %ecx
movl %ecx, someaddress
Se eu colocarsomevar
para dentro%eax
(ou%ebx
etc.) e, em seguida, imprima-o com%p
, Vejo que o endereço e o endereço do ponteiro de caracteres não assinado "s1
"Eu passei a mesma coisa. Mas suspeito que o que realmente fiz foi pegar o endereço de memória, convertê-lo em um número inteiro e depois colocá-lo em algum endereço.
Por exemplo, se eu fizer isso:
movl pos1, %eax
movl pos2, %ebx
cmp (%eax),(%ebx)
Recebo "Erro: muitas referências de memória para` cmp '". Não tenho muita certeza do que isso significa, exceto "você estragou tudo" ;-)
Assim...
como passar um ponteiro e mantê-lo como ponteiro?como usar o valor do referido ponteiro na montagem? (por exemplo, como*ptr
em C)Eu quero olhar para o operando LEA?
Estou usando a "Programação de montagem profissional" de Richard Blum como meu guia, mas Blum parece não cobrir este caso.
Atualizar
Muito obrigado pela sua resposta aprendida!
Infelizmente, ainda não sou capaz de desreferenciar.
Aqui está um exemplo simplificado. A função de montagem pega um ponteiro e deve repeti-lo. Em vez disso, recebo:
first_ptr points to 81 (should be 81) <-- from C program
the value is -1543299247 <-- printf called from within assembler
the value is -6028513 <-- printf called from within assembler
my function returned -6028513 <-- return value printed from C program
Programa C:
#include <stdio.h>
#include <string.h>
int main (void) {
unsigned char first;
unsigned char * first_ptr;
first = 'Q';
first_ptr = &first;
printf ("first_ptr points to %i (should be 81)\n",*first_ptr);
printf ("my function returned %i\n", myfunc(first_ptr));
return 0;
}
Programa de montagem:
.section .data
msg:
.asciz "the value is %i\n"
.section .bss
.lcomm str, 8
.section .text
.type myfunc, @function
.globl myfunc
myfunc:
# save stack
pushl %ebp
movl %esp, %ebp
# save string arg from stack to "str"
movl 8(%esp), %ecx
movl %ecx, str
# let's try printing the ecx dereference
pushl (%ecx)
pushl $msg
call printf
# put the value of str on the stack
# and call printf
pushl (str)
pushl $msg
call printf
# now return the character at pos1
movl (str), %eax
# restore the stack
movl %ebp, %esp
popl %ebp
ret