Детали о внедрении инструкции по ТРЕБОВАНИЮ/RET в QEMU (x86_64)

find . -type f -not \( -name f2 -o -name f5 \) -delete

должен это сделать.

-delete аналогичен -exec rm -f '{}' + , но короче и даже эффективнее. Сначала запустите его без него, чтобы убедиться, что он удаляет только те файлы, которые вы действительно хотите удалить.

1
28.06.2018, 12:20
1 ответ

Значение в next_eipизвлекается из стека:

ot = gen_pop_T0(s);

В качестве побочного -эффекта обновляется cpu_T0, который затем используется для прыжка;см. реализациюgen_pop_T0:

TCGMemOp d_ot = mo_pushpop(s, s->dflag);

gen_lea_v_seg(s, mo_stacksize(s), cpu_regs[R_ESP], R_SS, -1);
gen_op_ld_v(s, d_ot, cpu_T0, cpu_A0);

return d_ot;

Вот как RETизвлекает значение, которое было переданоCALL:

tcg_gen_movi_tl(cpu_T0, next_eip);
gen_push_v(s, cpu_T0);

При интерпретации инструкции RETэмулятор не может полагаться на внутренние знания :, он должен вести себя точно так же, как инструкция RET, извлекая адрес возврата из стека. (В реальном -мировом коде существует много случаев, когда RETследует за JMPс ручным -установленным -вверх стеком, а не CALL, или CALLникогда не в результате получается RETили код, изменяющий адрес возврата для RETпутем изменения значения в стеке. )Это то, что делает реализация QEMU RET:она извлекает адрес возврата из стека(gen_pop_T0)и обрабатывает его.

1
28.01.2020, 00:33

Теги

Похожие вопросы