x86汇编代码将字符串放入EAX寄存器

时间:2017-03-18 19:45:59

标签: assembly x86 operating-system system-calls

#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寄存器?

1 个答案:

答案 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; 
}