#define SYS_abcd abcd
#define SYSCALL1(name) \
.globl name; \
name: \
mov $SYS_ ## name, %eax; \
int $T_SYSCALL1; \
ret
SYSCALL1(abcd)
我用来处理它的系统调用代码如下:
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 :(得分: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;
}