2017-03-18 1 views
1
#define SYS_abcd abcd 

#define SYSCALL1(name) \ 
    .globl name; \ 
    name: \ 
    mov $SYS_ ## name, %eax; \ 
    int $T_SYSCALL1; \ 
    ret 

SYSCALL1(abcd) 

私はそれがどのように見える処理するために使用したシステムコールのコード:x86アセンブリコードはEAXレジスタに文字列を入れて

char ptr="abcd"; 
char arg; 
arg = (char*)proc->tf->eax; 
cprintf(arg); 
if(strncmp(ptr, arg, strlen(ptr)) == 0) 
    proc->tf->eax = 1; 
else { 
    cprintf("unknown call:"); 
    proc->tf->eax = -1; 
} 

このマクロは、処理されたときに、EAXレジスタに「ABCD」を入れます。しかし、どういうわけか私はゴミ値を得ています。文字列をEAXレジスタに移動する別の方法はありますか?

+0

あなたは通常、文字列をレジスタに移動しませんが、通常は文字列のアドレスを移動します。ここで何をしようとしているのかは不明です。 –

+0

@ MichaelPetch-I mシステムコールの名前を使用してシステムコールを呼び出そうとしています。ですから、文字列をeaxレジスタに入れて、後でカーネルコードで使用する必要があります。 –

+0

これはxv6の割り当てだと思いますか? –

答えて

0

割り当てのパラメータは、何等行うことができているかそれは不明だが、間に合わせの方法は、このようなものになることがあります。これは、メモリ内の文字列を定義し

#define SYSCALL1(name) \ 
    .globl name; \ 
    name: \ 
    mov $SYS_STR_ ## name, %eax; \ 
    int $T_SYSCALL1; \ 
    ret; \ 
    SYS_STR_ ## name: .asciz #name; 

SYSCALL1(abcd) 

アドレスその文字列のうちの1つが、渡されるパラメータとして、EAXに使用されます。

置換した後、生成されたコードは次のようになります。システムコールを表す文字列のアドレスを渡す

.globl abcd; 
abcd: 
    mov $SYS_STR_abcd, %eax; 
    int $T_SYSCALL1; 
    ret; 

SYS_STR_abcd: .asciz "abcd"; 

非常に効率的ではありませんが、ために求められているもののように見えるん。

システムコールを処理するシステムコールコードには、何らかの作業が必要な場合があります。何かのように:

char *ptr="abcd"; 
char *arg = (char*)proc->tf->eax; 
cprintf(arg); 
if(strcmp(ptr, arg) == 0) 
    proc->tf->eax = 1; 
else { 
    cprintf("unknown call:"); 
    proc->tf->eax = -1; 
} 
+0

@JohnSilvesterアドレスは実際には_EAX_に渡されるので、それは 'proc-> tf-> eax'にあります。カーネルコードをいくつか変更して、私の更新されたコードを見てください。 –

+1

魅力的なように働いた!君はスター。ありがとう! –

関連する問題