-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

この動作に関していくつか質問があります。

  • 正しく使用している場合、この 32 ビット コードを 64 ビット システムで実行することが問題の原因ですか?
  • %esi レジスタに NULL を渡すことについて疑問に思っています。この引数は、再起動システムコールに対して間違っていますか?
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 ビット システムで動作するかどうかはわかりませんが、「動作するはず」だと思います。

機能する場合は、プラグを抜くのと同じように、「プロンプト」の再起動が行われます。「再起動」シェルコマンドと同じではありません! 本当にやりたいことではないと判断した...

于 2013-02-22T18:43:24.937 に答える