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.
['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) . –
Również, jeśli wydrukowałeś swoje liczby jako heks, to byłoby dużo mniej mylące/bardziej oczywiste co się dzieje. –
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. –