Будут ли аргументы функции передаваться в стеке или в регистре?
-
13-09-2019 - |
Вопрос
В настоящее время я анализирую программу, которую написал на ассемблере, и подумывал о перемещении некоторого кода в ассемблере.У меня есть процедура, которая принимает один аргумент, но я не уверен, передается ли он в стек или в регистр.
Когда я открываю свою программу в IDA Pro, первой строкой в процедуре является:
ThreadID= dword ptr -4
Если я наведу курсор на объявление, также появится следующее:
ThreadID dd ?
r db 4 dup(?)
который, как я бы предположил, будет указывать на переменную стека?
Однако, когда я открываю ту же программу в OllyDbg, в этом месте стека появляется большое значение, которое было бы несовместимо с любым параметром, который мог быть передан, что наводит меня на мысль, что он передается в регистре.
Кто-нибудь может указать мне правильное направление?
Решение
Способ передачи аргументов функции зависит от ее имени. соглашение о вызовах.Соглашение о вызовах по умолчанию зависит от языка, компилятора и архитектуры.
Я не могу ничего сказать наверняка на основании предоставленной вами информации, однако не следует забывать, что отладчики уровня ассемблера, такие как OllyDbg, и дизассемблеры, такие как IDA, часто используют эвристику для обратного проектирования программы.Лучший способ изучить код, сгенерированный компилятором, — поручить ему писать ассемблерные листинги.Большинство компиляторов имеют возможность сделать это.
Другие советы
Это наверняка локальная переменная.Чтобы проверить аргументы, найдите значения [esp+ XXX].IDA автоматически присваивает им имена [esp+ arg_XXX].
.text:0100346A sub_100346A proc near ; CODE XREF: sub_100347C+44p
.text:0100346A ; sub_100367A+C6p ...
.text:0100346A
.text:0100346A arg_0 = dword ptr 4
.text:0100346A
.text:0100346A mov eax, [esp+arg_0]
.text:0100346E add dword_1005194, eax
.text:01003474 call sub_1002801
.text:01003474
.text:01003479 retn 4
.text:01003479
.text:01003479 sub_100346A endp
А соглашение fastcall, как было описано в комментарии выше, использует регистры для передачи аргументов.Я бы поставил на Microsoft или GCC compiler, поскольку они используются более широко.Поэтому сначала проверьте регистры ECX и EDX.
Microsoft или GCC [2] __fastcall[3] соглашение (оно же __msfastcall) передает первые два аргумента (вычисляются слева направо), которые вписываются в ECX и EDX.Оставшиеся аргументы помещаются в стек справа налево. http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall