Странные результаты с movzwl, %ax и отрицательными значениями

Хорошо, я имею дело со следующим фрагментом кода:

push   %ebp
mov    %esp,%ebp   
push   %ebx
mov    0x8(%ebp),%eax 
movzwl %ax,%edx

Так что это ведет себя как ожидалось, когда дело касается положительных ценностей. Значение, скопированное в%edx, является последними 16 битами%eax (или%ax).

Однако, если вы введете отрицательное число, все начинает становиться странным, и, похоже, оно не ведет себя так, как ожидалось.

Например, если значение% eax равно -67043552, то значение, скопированное в%edx, равно 65312.

Я довольно новичок в сборке, извините, если это явное неверное истолкование с моей стороны. Любая помощь будет принята с благодарностью.

1 ответ

Решение

Помни что movzwl копирует только биты в %ax в %edx заполняя высокие 16 бит %edx с нулями.

Так %edx всегда заканчивается положительным числом, меньшим или равным 65535.

В деталях: -67043552 в шестнадцатеричном виде fc00ff20, Так что, если это в %eax, затем %ax содержит ff20, Если вы переместите это в %edx с нулевым расширением, то %edx получает 0000ff20, Это 65312.

Другие вопросы по тегам