Объркан от знака % и други неща при разглобяването

Разглобих този код

int main{

vector<string> temp;


}

Резултатът е този

LEA ECX, %16I64X DWORD PTR[EBP + temp] 
CALL std::vector<std::basic_string<char, std::char_traits<char>, std::

Въпросите ми са:

  1. Какво прави %16I64X тук.

  2. какво означава редът "std::vector, std::". Знам, че инструкцията CALL извика това, но тази, която беше извикана, няма смисъл. Това I/O пренасочване ли е?

  3. Просто съм объркан от логиката на разглобяването, защото зарежда ефективния адрес и след това го извиква. Очаквам нещо като първо да преместя нещо в конкретен адрес, след което да заредя неговия ефективен адрес и след това да го извикам.

*Тук съм само начинаещ. Благодаря ви за търпението.


person the_transltr    schedule 28.03.2012    source източник
comment
Вероятно %16I64X изглежда така, сякаш казва на асемблера да използва късото от (с 8-битово изместване) на инструкцията lea.   -  person Gunther Piez    schedule 28.03.2012


Отговори (1)


"std::vector..." и т.н. е пълното име на конструктора на vector<string>. "std", защото е деклариран в std-пространството от имена, "basic_string", защото "string" е typedef на basic_string<char> и т.н. Когато използвате шаблони, окончателно генерираните имена често са много дълги и трудни за четене.

Начинът, по който чета този код, е, че LEA ECX зарежда ecx с адреса на променливата "temp", след което това се предава на конструктора, така че обектът да бъде създаден на правилния адрес.

person Ville Krumlinde    schedule 28.03.2012