将字符串放入 EAX 寄存器的 x86 汇编代码
x86 assembly code to put string in EAX register
#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 寄存器?
不清楚赋值的参数是什么,可以做什么等。但是快速而肮脏的方法可能是这样的:
#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;
}
#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 寄存器?
不清楚赋值的参数是什么,可以做什么等。但是快速而肮脏的方法可能是这样的:
#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;
}