2013-12-13 5 views
1

Я знаю, что есть некоторые сообщения, говорящие о перевести сборку в C, , но в основном все они нацелены на то, как получить Человеческий читаемый Исходный код C.Как перевести сборку на C со стеком, реализованным в куче?

Так что я хочу достичь, это процесс перевода со стеком, реализованным в куче.

мне не нужно, чтобы сделать код легко читать, переводить только в правовой гр исходного кода или даже псевдо кода (если непосредственно перевести с исходным кодом слишком сложно),

но в этой относительно легкой задаче (совсем не просто), я хочу реализовать стек на куче, как это сделали компиляторы ML и Scheme.

Может ли кто-нибудь дать мне руководство и инструкции по этому поводу?

среда эксперимент должен быть на x86, а сборка генерируется из

gcc -S source 

предположим, что мы имеем исходный код с исходным текстом в этой задаче, это могло помочь?

+0

В зависимости от того, где/когда/как был сгенерирован код языка ассемблера, это может быть невозможно, если оно не отображается на семантику языка C. – Eric

+0

Привет, Эрик, я обновляю свои вопросы. Если у меня есть исходный исходный код C, может ли это помочь? – computereasy

ответ

1

Предполагая x86/x64 здесь ...

указатель стека отслеживается ESP (32-битный) или RSP (64-битных) регистров. В инструкцию ASM можно вставить инструкцию mov ESP, ADDRESS и изменить стек в нужное место. Сначала вам нужно сначала сохранить ESP/RSP в новом стеке, потому что вам это нужно позже.

Сразу после настройки вызова ESP/RSP main() (или любой другой функции C, если на то пошло) в программе C.

После возвращения функции восстанавливает исходное значение ESP/RSP.

+0

Привет, egur, большое спасибо за ваш полезный ответ! Но я все еще смущен некоторыми деталями. Что касается 32-разрядных сред, мне нужно изменить ss register ..? потому что в основном я думаю, что только в сочетании с ss: sp, вы можете найти точный верх стека. – computereasy

+0

А также, если я поместил свой стек в область памяти кучи, как я могу гарантировать, что эта область памяти не будет перекрываться " реальная "память кучи манипулирует функциями, такими как HeapAlloc/HeapFree в будущем? – computereasy

+0

@computereasy - SS больше не используется (32/64 бит), просто ESP/RSP. Поскольку вы выделяете стек, вы контролируете, что происходит с этой памятью. Стек, выделенный ОС, немного сложнее, он не выделяет весь размер стека, вместо этого он выделяет небольшую часть и заканчивает выделение защитной страницей, когда обращается к странице защиты, она получает доступ к большему пространству. Если вы переопределяете распределение стека, убедитесь, что вы выделяете много баранов. – egur

Смежные вопросы