непонятный POP

Тема в разделе "WASM.BEGINNERS", создана пользователем eme, 22 апр 2007.

  1. eme

    eme New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2007
    Сообщения:
    5
    Код (Text):
    1. XOR AL,AL
    2. MOV BH,10
    3. MOV CH,05
    4. MOV CL,10
    5. MOV DH,10
    6. MOV DL,3E
    7. MOV AH,06
    8. INT 10
    9. PUSH CX
    10. MOV CX,0004
    11. CALL 011A         :0113
    12. LOOP 0113
    13. INT 20
    14. MOV BL,CL         :011A
    15. POP CX             : после этого извлечения в СХ оказываюся непонятные значения -\
    16. ADD BH,10
    17. ADD CH,01
    18. ADD CL,01
    19. SUB DH,01
    20. SUB DL,01
    21. INT 10
    22. PUSH CX
    23. MOV CL,BL
    24. RET
    25. RET
    почему ?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а ты как думаешь что будет в cx после выполнения call/pop?
    Мне почему-то кажется, что адрес возврата (0116 по идее, если я правильно помню, что длина CALL XXXX 3 байта)
     
  3. eme

    eme New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2007
    Сообщения:
    5
  4. eme

    eme New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2007
    Сообщения:
    5
    непонял ответа -\
    сразу после строчки pop CX в нём оказывается какой то мусор, хотя должно быть значение занесённое в стек ранее.
    при чём тут call ?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    eme
    call сохраняет в стеке адрес возврата. потом ты его извлекаешь оттуда через pop cx. а уже на слово дальше будет твой сохраненный ранее cx. че непонятного то?

    +ко всему:
    Это унесет процессор ойойой куда.. ты, кажется, не понял, как работают CALL и RET
     
  6. eme

    eme New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2007
    Сообщения:
    5
    я смотрел под отладчиком, там вроде всё нормально, 2 пуша 2 попа, и мой push CX как раз на верхушке должен был быть во время извлечения его оттуда.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А ты в курсе, что call & ret используют стек? Тебе объяснять что-то, судя по всему, бесполезно. Читай учебник. Тебе одно, ты - другое
     
  8. eme

    eme New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2007
    Сообщения:
    5
    CALL "адрес" - продолжает выполнение кода с "адреса"
    RET - продолжает выполнение сразу за CALL'ом, как я понял
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    CALL XXXX запихивает в стек адрес следующей команды и передает управление на XXXX.
    RET вынимает из стека адрес и передает по нему управление.

    Поэтому сохранять в стеке значения вперемешку с вызовами подпрограмм нежелательно. Если и делать так, что адресовать стек напрямую через mov cx, ss:[sp+2]
     
  10. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    кстате код нирабоий :)
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    eme
    Это JMP просто передаёт управление на заданный адрес, а CALL сперва в стек помещает адрес следующей инструкции (значение IP), а потом уже перадаёт управление как JMP. Упрощённо можно сказать, что

    CALL x

    можно заменить на

    PUSH y
    JMP x
    y:

    А RET всего лишь достаёт из стека адрес возврата и присваивает его регистру IP. Можно было бы сказать, что RET = POP IP, если бы инструкция POP IP существовала.

    Кстати, про RET и CALL очень подробно описано в 7й главе "Введение в крэкинг с нуля, используя OllyDbg", но для 32-бит.

    Вообще, Great всё это уже обьяснил.