将字符串放入 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; 
}