Код (Text): XOR AL,AL MOV BH,10 MOV CH,05 MOV CL,10 MOV DH,10 MOV DL,3E MOV AH,06 INT 10 PUSH CX MOV CX,0004 CALL 011A :0113 LOOP 0113 INT 20 MOV BL,CL :011A POP CX : после этого извлечения в СХ оказываюся непонятные значения -\ ADD BH,10 ADD CH,01 ADD CL,01 SUB DH,01 SUB DL,01 INT 10 PUSH CX MOV CL,BL RET RET почему ?
а ты как думаешь что будет в cx после выполнения call/pop? Мне почему-то кажется, что адрес возврата (0116 по идее, если я правильно помню, что длина CALL XXXX 3 байта)
непонял ответа -\ сразу после строчки pop CX в нём оказывается какой то мусор, хотя должно быть значение занесённое в стек ранее. при чём тут call ?
eme call сохраняет в стеке адрес возврата. потом ты его извлекаешь оттуда через pop cx. а уже на слово дальше будет твой сохраненный ранее cx. че непонятного то? +ко всему: Это унесет процессор ойойой куда.. ты, кажется, не понял, как работают CALL и RET
я смотрел под отладчиком, там вроде всё нормально, 2 пуша 2 попа, и мой push CX как раз на верхушке должен был быть во время извлечения его оттуда.
А ты в курсе, что call & ret используют стек? Тебе объяснять что-то, судя по всему, бесполезно. Читай учебник. Тебе одно, ты - другое
CALL "адрес" - продолжает выполнение кода с "адреса" RET - продолжает выполнение сразу за CALL'ом, как я понял
CALL XXXX запихивает в стек адрес следующей команды и передает управление на XXXX. RET вынимает из стека адрес и передает по нему управление. Поэтому сохранять в стеке значения вперемешку с вызовами подпрограмм нежелательно. Если и делать так, что адресовать стек напрямую через mov cx, ss:[sp+2]
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 всё это уже обьяснил.