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%ebxetc.) 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

questionAnswers(1)

yourAnswerToTheQuestion