Странные результаты с movzwl,% ax и отрицательными значениями - PullRequest
5 голосов
/ 06 сентября 2011

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

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

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

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

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

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

1 Ответ

16 голосов
/ 06 сентября 2011

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

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

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

...