digitalmars.D - asm help with div/idiv
- parabolis (27/27) Jul 31 2004 I have poured over several documents and am at a loose end. I
I have poured over several documents and am at a loose end. I need help with making div and idiv work the way I expect them to. I keep getting a Win32 error when I try to use the following code: ================================================================ typedef uint up4; up4 up4_div( up4 lhs, up4 rhs ) { up4 res; assert( rhs != 0 ); asm { xor EAX, EAX; // dividend bottom 32-bits to 0 mov EDX, lhs; // dividend top 32-bits to lhs div rhs; // divide by rhs mov res, EAX; // return quotient } return res; } void main(char[][] args ) { up4 a = cast(up4)0xA0000001; up4 b = cast(up4)0xC0000000; up4_div( b, a ); } Output: Error: Win32 Error ================================================================ I am expecting a result of ((lhs / rhs) * 2^32). Am I missing something simple?
Jul 31 2004
I don't get it either. Even that doesn't work for the same reason: up4 up4_div( up4 lhs, up4 rhs ) { asm { pusha; mov AX, 1; div AX; popa; } return 0; }
Jul 31 2004
Try running obj2asm over it and look at the result. "parabolis" <parabolis softhome.net> wrote in message news:ceghrm$15de$1 digitaldaemon.com...I have poured over several documents and am at a loose end. I need help with making div and idiv work the way I expect them to. I keep getting a Win32 error when I try to use the following code: ================================================================ typedef uint up4; up4 up4_div( up4 lhs, up4 rhs ) { up4 res; assert( rhs != 0 ); asm { xor EAX, EAX; // dividend bottom 32-bits to 0 mov EDX, lhs; // dividend top 32-bits to lhs div rhs; // divide by rhs mov res, EAX; // return quotient } return res; } void main(char[][] args ) { up4 a = cast(up4)0xA0000001; up4 b = cast(up4)0xC0000000; up4_div( b, a ); } Output: Error: Win32 Error ================================================================ I am expecting a result of ((lhs / rhs) * 2^32). Am I missing something simple?
Jul 31 2004
The div instruction is generating the exception. Perhaps it's overflowing. "parabolis" <parabolis softhome.net> wrote in message news:ceghrm$15de$1 digitaldaemon.com...I have poured over several documents and am at a loose end. I need help with making div and idiv work the way I expect them to. I keep getting a Win32 error when I try to use the following code: ================================================================ typedef uint up4; up4 up4_div( up4 lhs, up4 rhs ) { up4 res; assert( rhs != 0 ); asm { xor EAX, EAX; // dividend bottom 32-bits to 0 mov EDX, lhs; // dividend top 32-bits to lhs div rhs; // divide by rhs mov res, EAX; // return quotient } return res; } void main(char[][] args ) { up4 a = cast(up4)0xA0000001; up4 b = cast(up4)0xC0000000; up4_div( b, a ); } Output: Error: Win32 Error ================================================================ I am expecting a result of ((lhs / rhs) * 2^32). Am I missing something simple?
Jul 31 2004
Walter wrote:The div instruction is generating the exception. Perhaps it's overflowing.Yes you are correct. I am certain it is the div instruction. I had not idea an overflow would cause an exception however...
Jul 31 2004
Walter wrote:The div instruction is generating the exception. Perhaps it's overflowing.Thanks again. I did a search on idiv and found the following. http://www.jorgon.freeserve.co.uk/TestbugHelp/UseofIDIV.htm If the result of the divide is larger than the data size of the destination again the processor will halt (in Windows an exception code 0C0000095h occurs). If you have any links to well done ducmentation for x86 assembly then I could use them. The only substantial documentation I have is the "Intel 80386 Programmer's Reference 1986."
Jul 31 2004
"parabolis" <parabolis softhome.net> wrote in message news:cegnpm$17rd$1 digitaldaemon.com...If you have any links to well done ducmentation for x86 assembly then I could use them. The only substantial documentation I have is the "Intel 80386 Programmer's Reference 1986."You can download the Intel instruction set manuals in PDF from Intel's web site. That's what I use.
Jul 31 2004