Почему __int16 и int (32) генерируют различный asm с C ++? - PullRequest
2 голосов
/ 20 ноября 2010

Я недавно начал изучать сборку masm, я разбирал многие из моих программ, просто чтобы посмотреть. Я заметил, что когда вы используете __int16 (слово), его значение сначала копируется в eax, а затем в саму переменную, но с помощью int (dword / 32) оно копируется непосредственно в переменную: здесь разбирается код для обоих

int y = 5;
0040101E  mov         dword ptr [y],5 

    y += 7;
00401025  mov         eax,dword ptr [y] 
00401028  add         eax,7 
0040102B  mov         dword ptr [y],eax 

    __int16 x = 3;
0040102E  mov         eax,3 
00401033  mov         word ptr [x],ax 

    x += 6;
00401037  movsx       eax,word ptr [x] 
0040103B  add         eax,6 
0040103E  mov         word ptr [x],ax 

Я заметил, что __int16 имеет размер 16 ... это половина размера eax, поэтому он сначала помещается в eax, а затем только в топор x?

Кроме того, какой самый быстрый?

Есть ли хорошие сайты, которые вы бы порекомендовали?

Спасибо за ваш вклад

Ответы [ 3 ]

1 голос
/ 20 ноября 2010

Те же результаты действительно были бы получены, если бы инструкция была mov ax,3, но компилятор, вероятно, выбрал mov eax,3, потому что машинный код короче, и в этом конкретном случае эффект тот же. mov ax,3 будет иметь дополнительный префиксный байт, который сообщает процессору, что это 16-битная операция. (В остальном кодировка для двух инструкций идентична.)

Если вы используете Visual C ++, вы можете включить отображение байтов машинного кода в окне разборки и посмотреть, насколько велика каждая инструкция.

В какой-то момент 16-битные инструкции (или, точнее, инструкции, использующие размер слова «прочее» из текущего режима ЦП) были менее эффективными; это может или не может иметь место больше, я не уверен. (Я предполагаю, что эффект от этого будет довольно трудно заметить в целом, и вам придется придумать некоторый фрагмент кода, который сделает это очевидным.)

1 голос
/ 20 ноября 2010

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

TLDR: если у вас нет особых причин, используйте int.

0 голосов
/ 20 ноября 2010

Я придумываю это, как я точно не знаю.

Но кажется, что на современных процессорах работа с eax более эффективна, чем работа с меньшим регистром топора.

Перейдя сначала к eax (в первом назначении), ЦП подпишет расширение константы в 32-битный регистр.

Шансы также хороши, что компилятор выполняет всю свою математику32 бита (работает с регистрами) и прозрачно дает вам останки (то есть топор).

Вот как это выглядит для меня.

...