Thread overview |
---|
July 31, 2004 asm help with div/idiv | ||||
---|---|---|---|---|
| ||||
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? |
July 31, 2004 Re: asm help with div/idiv | ||||
---|---|---|---|---|
| ||||
Posted in reply to parabolis | 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; } |
July 31, 2004 Re: asm help with div/idiv | ||||
---|---|---|---|---|
| ||||
Posted in reply to parabolis | 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? > |
July 31, 2004 Re: asm help with div/idiv | ||||
---|---|---|---|---|
| ||||
Posted in reply to parabolis | 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? > |
July 31, 2004 Re: asm help with div/idiv | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | 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...
|
July 31, 2004 Re: asm help with div/idiv | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | 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." |
July 31, 2004 Re: asm help with div/idiv | ||||
---|---|---|---|---|
| ||||
Posted in reply to parabolis | "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. |
Copyright © 1999-2021 by the D Language Foundation