Странные результаты с movzwl, %ax и отрицательные значения
-
26-10-2019 - |
Вопрос
Хорошо, поэтому я имею дело со следующим фрагментом кода:
push %ebp
mov %esp,%ebp
push %ebx
mov 0x8(%ebp),%eax
movzwl %ax,%edx
Так что это ведет себя так, как и ожидалось при работе с положительными ценностями. Стоимость, скопированное в %EDX, - это 16 бит % %EAX (или %AX).
Однако, если вы вкладываете отрицательное число, все начинает становиться странным, и, похоже, это не ведет себя, как ожидалось.
Например, если значение %EAX составляет -67043552, то значение, скопированное в %EDX, составляет 65312.
Я довольно новичок в собрании, извините, если это очевидное неверное толкование с моей стороны. Любая помощь будет очень оценена.
Решение
Помните это movzwl
копирует только биты в %ax
в %edx
заполнение в высоких 16 кусочках %edx
с нулями.
Так %edx
Всегда заканчивается положительным числом меньше или равным 65535.
В деталях: -67043552
в Гексе есть fc00ff20
. Анкет Так если это в %eax
, тогда %ax
содержит ff20
. Анкет Если вы перенесете это в %edx
с нулевой растяжкой, затем %edx
получает 0000ff20
. Анкет Это 65312.