2011-09-06 12 views
5

porządku, więc mam do czynienia z poniższym fragmencie kodu:dziwne wyniki z movzwl,% ax i wartościami ujemnymi

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

Więc to zachowuje się zgodnie z oczekiwaniami, gdy mamy do czynienia z wartościami dodatnimi. Wartość skopiowana do% edx to końcowe 16 bitów% eax (lub% ax).

Jeśli jednak wpiszesz liczbę ujemną, wszystko zaczyna być dziwne i wydaje się, że nie zachowuje się zgodnie z oczekiwaniami.

Na przykład, jeżeli wartość% eax jest -67043552, wówczas wartość skopiowane do% EDX jest 65312.

Jestem całkiem nowy, montażu, przepraszam, jeśli jest to oczywiste, błędna interpretacja z mojej strony. Każda pomoc będzie bardzo ceniona.

+0

['movswl'] (http://www.felixcloutier.com/x86/MOVSX:MOVSXD.html) jest dostępny, gdy chcesz podpisać-przedłużyć wartość dopełnienia 2-podpisowego zamiast zerowego przedłużania binarna wartość bez znaku. (Zobacz także [tag wiki x86] (http://stackoverflow.com/tags/x86/info) . –

+0

Również, jeśli wydrukowałeś swoje liczby jako heks, to byłoby dużo mniej mylące/bardziej oczywiste co się dzieje. –

+0

Ponadto, chyba że potrzebujesz pełnej wartości w '% eax', powinieneś' movzwl 0x8 (% ebp),% edx' bezpośrednio zamiast marnować instrukcję robiąc to osobno. Procesory Intela mogą obsługiwać 'movzx' /' movsx' tylko jako ładunek uop, bez potrzeby ALU. –

Odpowiedz

16

Pamiętaj, że movzwl kopiuje tylko bity w %ax do %edx, wypełniając 16 bitów o wysokiej wartości %edx zerami.

Więc %edx zawsze kończy się liczbę dodatnią mniejszą lub równą 65535.

W szczegółach: -67043552 w hex jest fc00ff20. Więc jeśli jest to %eax, to %ax zawiera ff20. Jeśli przeniesiesz to do %edx z zerowym rozszerzeniem, wtedy %edx otrzyma 0000ff20. To jest 65312.

Powiązane problemy