x86 Assembly Language - Завершение программы - PullRequest
2 голосов
/ 10 ноября 2011

Я уверен, что это очень тривиально для большинства, но я не очень знаком с языком ассемблера x86.Я просто пытаюсь научить себя.

Я в окнах.И везде, где я читал, мне велели использовать INT 21, чтобы вернуться в операционную систему.Который это выходит из программы, но я получаю сообщение об ошибке: Unhandled exception at 0x003d1313 in Assignment1.exe: 0xC0000005: Access violation reading location 0xffffffff.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 11 ноября 2011

В Windows, если вы используете формальный ассемблер (например, MASM), вы можете просто вызвать следующее:

.386 
.model flat, stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
.data 
.code 
start: 
        invoke ExitProcess,0 
end start

Если вы не используете ассемблер и хотите просто выполнить фрагмент двоичного кода, выполните следующее:

push xxx
push -1
push 0
mov eax, yyy
mov edx, 7FFE0300
call dword ptr ds:[edx]

где xxx - код завершения процесса, а yyy - номер системного вызова для NtTerminateProcess (используйте http://www.pediy.com/document/Windows_System_Call_Table/Windows_System_Call_Table.htm для определения номера вызова для соответствующей ОС. Это 0x172 для Windows 7)

3 голосов
/ 11 ноября 2011

Если ваш стек сбалансирован, самый простой способ выйти из вашей программы -

retn
3 голосов
/ 10 ноября 2011

Ответ полностью зависит от того, какую операционную систему вы используете:)

Вот пример использования int 0x80 в Linux:

movl $1, %eax
movl $0, %ebx
int $0x80

Эта ссылка на Википедию дает вам больше возможностей:

http://en.wikipedia.org/wiki/Exit_%28operating_system%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...