2013-02-22 2 views
-1

Я пытаюсь запустить несколько строк asm на своих 64-битных (Ubuntu 12.04) Просто для выполнения перезагрузки системы перезагрузки. Я могу скомпилировать его, но при запуске ничего не происходит.Запуск i_386 asm на x86_64: инструкция перезагрузки

Вот код:

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-разрядной системе, возникновение проблемы?
  • Мне интересно пропустить NULL в регистр% esi, является ли этот аргумент неправильным для перезагрузки syscall?

ответ

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 

Теперь, делая «эхо $?», Вы должны быть в состоянии увидеть номер ошибки. Посмотрите его в errno.h.

Я думаю, что ноль в esi в порядке. Dunno, если он будет работать на 64-битной системе - «должен», я думаю.

Если это сработает, это приведет к «быстрой» перезагрузке - так же, как потянуть вилку. Это НЕ то же самое, что команда «reboot» shell! Я решил, что это не совсем то, что я хотел сделать ...

+0

Я уже использовал sudo. Я обнаружил, что ошибка была прочитана человеком перезагрузки. флаг в edx i теперь используется 0x1234567, и он работает! – Tezirg

Смежные вопросы