私はアセンブリプログラミングにかなり慣れていません。GCC (Linux) で x86 プラットフォームを使用しています。
C から次のように呼び出したい関数があります。
myfunc ( unsigned char * s1, unsigned char * s2, int someint );
この関数は、s1 と s2 のメモリ位置を取得してそれらを比較し、インクリメントと比較などを行いながら、いくつかの処理を行います。これは memcmp のようなものですが、私はもっとやっています。
私の質問:アセンブリ関数にポインタを渡すと? では、「このメモリ アドレスに格納されている値を教えてください」と言うにはどうすればよいでしょうか。
これが私がこれまでに持っているものです:
スタックから最初の関数 arg ("s1") を取得するには、次のようにします (someaddress は 32 ビット整数で、私は 32 ビット プロセッサで作業しています)。
movl 8(%esp), %ecx
movl %ecx, someaddress
(またはなど)に入れsomevar
、で printf すると、そのアドレスと、渡した unsigned char ポインタ " " のアドレスが同じであることがわかります。しかし、私が実際に行ったことは、メモリアドレスを取得し、それを整数に変換してから、その整数をいくつかのアドレスに入れたことだと思います。%eax
%ebx
%p
s1
たとえば、次のようにすると:
movl pos1, %eax
movl pos2, %ebx
cmp (%eax),(%ebx)
「エラー: `cmp' のメモリ参照が多すぎます」というメッセージが表示されます。「あなたが台無しにした」以外は、それが何を意味するのか完全にはわかりません;-)
そう...
- ポインターを渡し、ポインターとして保持する方法は?
- アセンブリでそのポインタの値を使用する方法は? (例えば、
*ptr
C のように)
LEA オペランドを見たいですか?
私は Richard Blum の "Professional Assembly Programming" をガイドとして使用していますが、Blum はこのケースを扱っていないようです。
アップデート
勉強になる回答ありがとうございます!
残念ながら、私はまだ逆参照できません。
簡単な例を次に示します。アセンブリ関数はポインターを受け取り、それをエコー バックする必要があります。代わりに私は得る:
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
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;
}
組み立てプログラム:
.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