Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Weird results with movzwl, %ax and negative values

Alright, so I am dealing with the following snippet of code:

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

So this behaves as expected when dealing with positive values. The value copied into %edx is the trailing 16 bits of %eax (or %ax).

However, if you put a negative number in, everything starts getting weird and it does not seem to be behaving as expected.

For example, if the value of %eax is -67043552, then the value copied into %edx is 65312.

I'm fairly new to assembly, sorry if this is an obvious misinterpretation on my part. Any help would be greatly appreciated.

like image 569
ebensing Avatar asked Sep 06 '11 06:09

ebensing


People also ask

What is Movzwl in assembly?

MOVZWL. Move Zero-Extended Word to Long. Description: For MOVZBW, the low 8 bits of the destination are replaced by the source operand. the top 8 bits are set to 0.


1 Answers

Remember that movzwl copies only the bits in %ax into %edx filling in the high 16 bits of %edx with zeros.

So %edx always ends up with a positive number less than or equal to 65535.

In detail: -67043552 in hex is fc00ff20. So if that is in %eax, then %ax contains ff20. If you move that into %edx with zero-extension, then %edx gets 0000ff20. That's 65312.

like image 123
Ray Toal Avatar answered Oct 05 '22 11:10

Ray Toal