在x86_64上运行i_386 asm:重新启动指令

时间:2013-02-22 17:04:18

标签: assembly x86-64 behavior

我正在尝试在64位上运行一些asm行(Ubuntu 12.04) 只是为了执行reboot syscall。 我可以编译它,但是当没有任何事情发生时。

以下是代码:

section .text
        global _start

_start:
    mov eax,88
    mov ebx,0xfee1dead
    mov ecx,672274793
    mov edx,0x89abcdef
    mov esi,0
    int 0x80

我使用以下方法编译它:

nasm -f elf reboot.asm

然后我用:

链接它
ld -m elf_i386 -s -o reboot reboot.o

我对此行为有一些疑问:

  • 如果我正确使用它,在64位系统上运行这个32位代码问题的根源?
  • 我想知道将NULL传递给%esi寄存器,这个参数对于重启系统调用是错误的吗?

1 个答案:

答案 0 :(得分:0)

需要超级用户才能使用此系统调用。您可以以root身份提供文件超级用户权限,“chown root:root myfile”,“chmod + s myfile”。

您可能希望在int 80h之后检查错误代码(如果有)...

int 80h
test eax, eax
jns good ; shouldn't happen for sys_reboot
neg eax
mov ebx, eax
mov eax, 1 ; __NR_exit
int 80h

int 80h test eax, eax jns good ; shouldn't happen for sys_reboot neg eax mov ebx, eax mov eax, 1 ; __NR_exit int 80h 现在通过“echo $?”,您应该能够看到错误号。在errno.h中查找。

我认为在esi中零是可以的。 Dunno,如果它能在64位系统上工作 - “应该”,我想。

如果有效,则会导致“提示”重启 - 与拔插头一样。它与“rebo​​ot”shell命令不同!我觉得这不是我想做的......