누군가가이 NASM 프로그램의 작동 방식을 설명해 줄 수 있습니까?

리 샤브

이것은 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

여기 esp4, 그래서 0-4= -4, 그렇지 않습니까 ?? 그런데 왜이 두 줄의 코드일까요? 대신 결과가 내가 "-4"Normaly를 할 수있는 결과 라면MOV esp, -4

MOV ebx, eax

그리고, 기능 eax으로 채워야한다고 생각하는 것은 _GetstdHandle?

그리고 마지막은 hlt?

Dan Byström
  1. esp는 "초기화"될 수 없습니다. 항상 스택의 맨 위를 가리키고 있습니다. 예를 들어 32 비트 레지스터를 누르면 esp가 자동으로 4 씩 감소합니다.

  2. "sub esp, 4"는 "bytes"변수에 대해 스택에 4 바이트를 할당합니다. 나중에 주석에서 "& bytes"에 해당하는 "lea ax, [ebp-4]"를 볼 수 있습니다.

  3. 맞습니다. eax는 _GetStdHandle에서 반환됩니다.

  4. "hlt"는 프로세서를 중지합니다. 그러나 주석이 말했듯이-_ExitProcess가 반환되지 않으므로 실행되지 않습니다. 아이디어는 _ExitProcess가 반환되어야 하는 경우 임의의 코드 실행을 시작하는 것보다 중지하는 것이 더 낫다는 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

누군가이 코드의 기능을 설명해 줄 수 있습니까?

분류에서Dev

누군가 스택을 사용하여이 프로그램의 작업을 설명 할 수 있습니까?

분류에서Dev

누군가 셀프 조인이 어떻게 작동하는지 설명해 줄 수 있습니까?

분류에서Dev

누군가 JS 프로토 타입이 중복되지 않는 방법을 설명해 줄 수 있습니까?

분류에서Dev

누군가이 API 코드가 어떤 언어로 작성되었는지 설명해 줄 수 있습니까?

분류에서Dev

ORACLE SQL : 누군가가이 둘의 차이점을 설명해 줄 수 있습니까?

분류에서Dev

누군가가이 프로그램을 Ubuntu에 설치하도록 도와 줄 수 있습니까?

분류에서Dev

누군가 이러한 부트 스트랩 클래스의 작동 방식을 설명 할 수 있습니까?

분류에서Dev

누군가이 leetcode 문자열 조작 질문을 설명해 줄 수 있습니까?

분류에서Dev

누군가이 C ++ 줄을 설명 할 수 있습니까?

분류에서Dev

누군가가 자바에서 센티넬이하는 일을 설명해 줄 수 있습니까? 아니면 어떻게 작동합니까?

분류에서Dev

누군가 내 프로그램의 꼬임을 해결하도록 도와 줄 수 있습니까?

분류에서Dev

누군가이 부울 대수 방정식을 설명해 줄 수 있습니까?

분류에서Dev

누군가 for 루프가 작동하는 방식과 목록 이해없이 어떻게 보이는지에 대해 자세히 설명 할 수 있습니까?

분류에서Dev

Js Number.parseInt 함수의 이상한 동작, 누군가 그것을 설명 할 수 있습니까?

분류에서Dev

누군가이 루비 구문이 어떻게 작동하는지 설명해 줄 수 있습니까?

분류에서Dev

누군가이 파이썬 프로그램에서 *의 사용을 설명 할 수 있습니까?

분류에서Dev

누군가이 자바 프로그램의 알고리즘을 설명 할 수 있습니까?

분류에서Dev

누군가이 C ++ 프로그램의 출력을 설명 할 수 있습니까?

분류에서Dev

누군가가 펄 에서이 정규식을 설명해 줄 수 있습니까?

분류에서Dev

누군가 내 서버 / 클라이언트가 연결을 설정하는 방식으로 작동하지 않는 이유를 설명 할 수 있습니까?

분류에서Dev

누군가가 datepicker 에서이 코드 줄을 설명 할 수 있습니까?

분류에서Dev

누군가가 웹 페이지의 링크를 클릭하는 Selense 명령을 말해 줄 수 있습니까?

분류에서Dev

누군가 stty가 무엇을하는지 설명해 줄 수 있습니까?

분류에서Dev

누군가이 코드 줄이 무엇을 의미하는지 설명 할 수 있습니까?

분류에서Dev

누군가이 find 메서드 동작을 설명 할 수 있습니까?

분류에서Dev

누군가이 반올림 동작을 설명 할 수 있습니까?

분류에서Dev

누군가이 사전 동작을 설명 할 수 있습니까?

분류에서Dev

LLVM IR-누군가이 동작을 설명 할 수 있습니까?

Related 관련 기사

  1. 1

    누군가이 코드의 기능을 설명해 줄 수 있습니까?

  2. 2

    누군가 스택을 사용하여이 프로그램의 작업을 설명 할 수 있습니까?

  3. 3

    누군가 셀프 조인이 어떻게 작동하는지 설명해 줄 수 있습니까?

  4. 4

    누군가 JS 프로토 타입이 중복되지 않는 방법을 설명해 줄 수 있습니까?

  5. 5

    누군가이 API 코드가 어떤 언어로 작성되었는지 설명해 줄 수 있습니까?

  6. 6

    ORACLE SQL : 누군가가이 둘의 차이점을 설명해 줄 수 있습니까?

  7. 7

    누군가가이 프로그램을 Ubuntu에 설치하도록 도와 줄 수 있습니까?

  8. 8

    누군가 이러한 부트 스트랩 클래스의 작동 방식을 설명 할 수 있습니까?

  9. 9

    누군가이 leetcode 문자열 조작 질문을 설명해 줄 수 있습니까?

  10. 10

    누군가이 C ++ 줄을 설명 할 수 있습니까?

  11. 11

    누군가가 자바에서 센티넬이하는 일을 설명해 줄 수 있습니까? 아니면 어떻게 작동합니까?

  12. 12

    누군가 내 프로그램의 꼬임을 해결하도록 도와 줄 수 있습니까?

  13. 13

    누군가이 부울 대수 방정식을 설명해 줄 수 있습니까?

  14. 14

    누군가 for 루프가 작동하는 방식과 목록 이해없이 어떻게 보이는지에 대해 자세히 설명 할 수 있습니까?

  15. 15

    Js Number.parseInt 함수의 이상한 동작, 누군가 그것을 설명 할 수 있습니까?

  16. 16

    누군가이 루비 구문이 어떻게 작동하는지 설명해 줄 수 있습니까?

  17. 17

    누군가이 파이썬 프로그램에서 *의 사용을 설명 할 수 있습니까?

  18. 18

    누군가이 자바 프로그램의 알고리즘을 설명 할 수 있습니까?

  19. 19

    누군가이 C ++ 프로그램의 출력을 설명 할 수 있습니까?

  20. 20

    누군가가 펄 에서이 정규식을 설명해 줄 수 있습니까?

  21. 21

    누군가 내 서버 / 클라이언트가 연결을 설정하는 방식으로 작동하지 않는 이유를 설명 할 수 있습니까?

  22. 22

    누군가가 datepicker 에서이 코드 줄을 설명 할 수 있습니까?

  23. 23

    누군가가 웹 페이지의 링크를 클릭하는 Selense 명령을 말해 줄 수 있습니까?

  24. 24

    누군가 stty가 무엇을하는지 설명해 줄 수 있습니까?

  25. 25

    누군가이 코드 줄이 무엇을 의미하는지 설명 할 수 있습니까?

  26. 26

    누군가이 find 메서드 동작을 설명 할 수 있습니까?

  27. 27

    누군가이 반올림 동작을 설명 할 수 있습니까?

  28. 28

    누군가이 사전 동작을 설명 할 수 있습니까?

  29. 29

    LLVM IR-누군가이 동작을 설명 할 수 있습니까?

뜨겁다태그

보관