2016-09-21 8 views
-1

Допустим, мы имеем линию сборки, как это:переходе от 32 бит до 64 бит в сборке

.loop: 
     cmp %esi, %rcx 

Я знаю, что один регистр используется для 32-битной, а другой для 64-битных. Но можно ли превратить %rcx в 32-разрядный, чтобы я не получал ошибку при попытке запустить код? Я знаю, что могу использовать ecx, но я хочу увидеть, если это возможно использовать %rcx

+1

То, что вы просите сделать, невозможно и не имеет смысла. Однако вы можете использовать% rsi, 64-битный регистр, нижняя половина которого равна% esi. Изменить: чтобы быть ясным, я предлагаю вам выполнить 64-битное сравнение. В противном случае возникает вопрос, что должно сравниться с 32-битным и 64-битным значением? Является ли 32-битное значение неподписанным или подписанным? – icecreamsword

+0

Hi, 32-разрядное значение без знака. – Andrew

+2

Существует 2^64 уникальных значения, которые могут быть представлены в 64 бит. Есть только 2^32 уникальных значения, которые могут быть представлены в 32 битах. Поэтому попытка сохранить 64-битное значение в 32-битной переменной будет потерять данные. Обратное неверно. Как это бывает, всякий раз, когда вы пишете 32-разрядный регистр на AMD64, он равен нулю - до 64 бит. Если вы знаете, что что-то написано в% esi, то% rsi - это 64-битное, ноль-расширенное значение. – icecreamsword

ответ

1

Вместо того, чтобы использовать 32-разрядную% ECX регистре, что вы хотите сделать, это использовать 64-битную% RSi регистра:

.loop: 
    cmp %rsi, %rcx 

Какой бы размер вы ни использовали, ширина регистра должна совпадать. 32-разрядные записи регистров всегда имеют нулевое расширение и записываются в полный 64-разрядный регистр в AMD64. Если вы знаете, что% esi был рассчитан или загружен как 32-битное значение, то% rsi - это то же самое значение, равное нулю, - до 64 бит.

+0

Это именно то, что я искал. Теперь это имеет смысл, я беспокоился, что это невозможно, потому что я не изменил другой регистр на 64-битный эквивалент. – Andrew