【问题标题】:Running i_386 asm on x86_64 : Reboot instruction在 x86_64 上运行 i_386 asm:重启指令
【发布时间】:2013-02-22 17:04:17
【问题描述】:

我正在尝试在我的 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 寄存器,这个参数对于重新启动系统调用是否错误?

【问题讨论】:

    标签: assembly x86-64 behavior


    【解决方案1】:

    需要超级用户才能使用此系统调用。您可以授予文件超级用户权限...作为 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 命令不同!我决定这不是我真正想做的……

    【讨论】:

    • 我已经在使用 sudo。我发现错误正在阅读重新启动的人。我现在使用的 edx 中的标志是 0x1234567,它可以工作!
    猜你喜欢
    • 2013-01-19
    • 2011-09-07
    • 2012-05-21
    • 1970-01-01
    • 2017-01-05
    • 2014-05-01
    • 2017-11-16
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多