-1

我试图在我的 64 位(Ubuntu 12.04)上运行一些 asm 行,只是为了执行重启系统调用。我可以编译它,但是运行时什么也没发生。

这是代码:

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 寄存器,这个参数对于 reboot 系统调用是否错误?
4

1 回答 1

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

现在通过执行“echo $?”,您应该能够看到错误号。在 errno.h 中查找。

我认为esi中的零是可以的。不知道它是否可以在 64 位系统上运行——“应该”,我想。

如果它有效,这将导致“提示”重新启动 - 与拔掉插头相同。它与“rebo​​ot”shell 命令不同!我决定这不是我真正想做的...

于 2013-02-22T18:43:24.937 回答