Во-первых, вы должны понимать, что вы не можете просто «делать вещи» в сборке и ожидать, что она будет работать. Существует нечто, называемое бинарным интерфейсом приложения, с указанием того, как вести себя программы в операционной системе и, действительно, внутри вашего кода.
Например, в C на большинстве платформ x86-32 существует одно общее правило: eax
должно содержать возвращаемое значение. Также будет установлен набор значений, которые помещаются в стек (называемый фреймом стека для функции). Другое дело, что некоторые регистры должны быть сохранены, в то время как другие (иногда называемые регистры царапин) могут быть оставлены с вашей мусором в них.
Короче говоря, если вы нарушите эти правила, все пойдет не так, и OS пригодится для вас. Это зависит не только от вашего процессора, но и от вашей операционной системы; например, linux и windows на x64
.
Я также должен добавить char program
не является программой, это функция внутри существующей программы.
И, наконец, nop, nop, ret
ничего не делает. Поэтому вы должны выполнить эти инструкции и вернуться, потому что на самом деле вы ничего не сделали для фрейма стека.
нажимной + в отставке == перехода. – ruslik