【问题标题】:x86 assembly code to put string in EAX registerx86 汇编代码将字符串放入 EAX 寄存器
【发布时间】:2017-03-18 19:45:58
【问题描述】:
#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 寄存器?

【问题讨论】:

  • 您通常不会将strings 移动到寄存器中,但通常会移动字符串的地址。目前尚不清楚您要在这里做什么。
  • @MichaelPetch-我正在尝试使用系统调用的名称来调用系统调用。所以我需要把字符串放到eax寄存器中,稍后在内核代码中使用。
  • 我假设这是一个 xv6 作业?
  • SYS_abcd 定义为什么?
  • 在这种情况下,您必须在某个地方定义SYS_abcd(可能在某处定义#define)。可能是表示系统调用号的常量值。没有看到你如何定义它,我不能说 EAX 应该是什么

标签: assembly x86 system-calls osdev


【解决方案1】:

目前还不清楚赋值的参数是什么,可以做什么等。但是一种快速而肮脏的方式可能是这样的:

#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; 
} 

【讨论】:

  • @JohnSilvester 地址实际上是在 EAX 中传递的,所以它在 proc->tf->eax 中。查看我更新的代码,对您的内核代码进行了一些更改。
  • 工作得像个魅力先生!你是明星。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2021-03-05
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多