2017-03-18 136 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

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

相关问题