Будут ли аргументы функции передаваться в стеке или в регистре?

StackOverflow https://stackoverflow.com/questions/976581

Вопрос

В настоящее время я анализирую программу, которую написал на ассемблере, и подумывал о перемещении некоторого кода в ассемблере.У меня есть процедура, которая принимает один аргумент, но я не уверен, передается ли он в стек или в регистр.

Когда я открываю свою программу в 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top