이것은 Stackoverflow.com의 질문 에서 복사 한 코드입니다 .
global _main
extern _GetStdHandle@4
extern _WriteFile@20
extern _ExitProcess@4
section .text
_main:
; DWORD bytes;
mov ebp, esp
sub esp, 4
; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
push -11
call _GetStdHandle@4
mov ebx, eax
; WriteFile( hstdOut, message, length(message), &bytes, 0);
push 0
lea eax, [ebp-4]
push eax
push (message_end - message)
push message
push ebx
call _WriteFile@20
; ExitProcess(0)
push 0
call _ExitProcess@4
; never here
hlt
message:
db 'Hello, World', 10
message_end:
이 코드는 올바르게 작동합니다. 오류를 지울 필요가 없습니다. 그러나 그들이하는 일을 이해할 수없는 줄이 있습니다. 아래로 스크롤하십시오.
MOV ebp, esp
좋아요 누구든지 등록 할 내용을 복사 esp
한다고 말할 ebp
수 있지만 초기화되지 않은 레지스터 값을 레지스터에 복사하는 것이 어떻게 가능할까요? 그것은로드 ebp
로모그래퍼 0
(제로)?
SUB esp, 4
여기 esp
에 4
, 그래서 0-4= -4
, 그렇지 않습니까 ?? 그런데 왜이 두 줄의 코드일까요? 대신 결과가 내가 "-4"
Normaly를 할 수있는 결과 라면MOV esp, -4
MOV ebx, eax
그리고, 기능 eax
으로 채워야한다고 생각하는 것은 _GetstdHandle
?
그리고 마지막은 hlt
?
esp는 "초기화"될 수 없습니다. 항상 스택의 맨 위를 가리키고 있습니다. 예를 들어 32 비트 레지스터를 누르면 esp가 자동으로 4 씩 감소합니다.
"sub esp, 4"는 "bytes"변수에 대해 스택에 4 바이트를 할당합니다. 나중에 주석에서 "& bytes"에 해당하는 "lea ax, [ebp-4]"를 볼 수 있습니다.
맞습니다. eax는 _GetStdHandle에서 반환됩니다.
"hlt"는 프로세서를 중지합니다. 그러나 주석이 말했듯이-_ExitProcess가 반환되지 않으므로 실행되지 않습니다. 아이디어는 _ExitProcess가 반환되어야 하는 경우 임의의 코드 실행을 시작하는 것보다 중지하는 것이 더 낫다는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다