2017-03-18 135 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; 
} 

這個宏,處理的時候,就會把「ABCD」 EAX寄存器。但不知何故,我得到了一個垃圾值。有沒有不同的方式將字符串移動到EAX寄存器?

+0

您通常不會將'strings'移動到一個寄存器中,但通常會移動一個字符串的地址。目前還不清楚你想在這裏做什麼。 –

+0

@ MichaelPetch - 我試圖使用系統調用的名稱撥打系統調用。所以我需要把字符串放在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) 

這定義內存中的字符串和地址的字符串被用作要在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

工作就像一個魅力先生!你是明星。謝謝! –

相關問題