1. Binary conversion (machine)
- Posted by Don Phillips <Graebel at hotmail.com> Aug 17, 2002
- 455 views
Actually I got bored and started optimizing the byte swap routine the easy way. Directly. However for some reason it just doesnt seem to be working quite right. Someone whos boned up on machine to Eu interfacing want to take a peek at this and see what I did wrong? ========== include machine.e atom mem, SwapBytes sequence Code_Space mem = allocate( 4 ) poke4( mem, 90 ) Code_Space = { #50, -- push eax #B8} & int_to_bytes(mem) & -- mov eax, offset mem { #0F, #C8, -- bswap eax #A3} & int_to_bytes(mem) & -- mov offset mem, eax { #58, -- pop eax #C3 -- ret } SwapBytes = allocate( length(Code_Space) ) poke( SwapBytes, Code_Space ) ? peek4u( mem ) call( SwapBytes ) ? peek4u( mem ) call( SwapBytes ) ? peek4u( mem ) call( SwapBytes ) ? peek4u( mem ) free( SwapBytes ) free( mem ) -- break for debugging atom break ========== Don Phillips
2. Re: Binary conversion (machine)
- Posted by Juergen Luethje <jluethje at gmx.de> Aug 18, 2002
- 445 views
Don <Graebel at hotmail.com> wrote: > Actually I got bored and started optimizing the byte > swap routine the easy way. Directly. However for > some reason it just doesnt seem to be working quite > right. > Someone whos boned up on machine to Eu interfacing > want to take a peek at this and see what I did > wrong? > ========== > include machine.e > atom mem, SwapBytes > sequence Code_Space > mem = allocate( 4 ) > poke4( mem, 90 ) > Code_Space = > { > #50, -- push eax > #B8} & int_to_bytes(mem) & -- mov eax, offset mem > { #0F, #C8, -- bswap eax > #A3} & int_to_bytes(mem) & -- mov offset mem, eax > { #58, -- pop eax > #C3 -- ret > } > SwapBytes = allocate( length(Code_Space) ) > poke( SwapBytes, Code_Space ) > ? peek4u( mem ) > call( SwapBytes ) > ? peek4u( mem ) > call( SwapBytes ) > ? peek4u( mem ) > call( SwapBytes ) > ? peek4u( mem ) > free( SwapBytes ) > free( mem ) > -- break for debugging > atom break > ========== > Don Phillips The following code works for me: -------------------------------------------------------- include machine.e atom mem mem = allocate(4) constant SwapBytes = allocate(15) poke(SwapBytes, { #50, -- 0: push eax #A1,#00,#00,#00,#00, -- 1: mov eax, [mem] (2) #0F, #C8, -- 6: bswap eax #A3,#00,#00,#00,#00, -- 8: mov [mem], eax (9) #58, -- D: pop eax #C3}) -- F: ret poke4(SwapBytes + 2, mem) poke4(SwapBytes + 9, mem) poke4(mem, #90) -- poke4(mem, #12345678) -- better for demonstration printf(1, "%08x\n", peek4u(mem)) call( SwapBytes ) printf(1, "%08x\n", peek4u(mem)) call( SwapBytes ) printf(1, "%08x\n", peek4u(mem)) call( SwapBytes ) printf(1, "%08x\n", peek4u(mem)) free(SwapBytes) free(mem) -------------------------------------------------------- When I first tried to compile the asm code with Pete Eberlein's ASM, I got the following error message: --------------------------------- ASM to Euphoria compiler (32-bit) by Pete Eberlein Dec 29, 2001 --------------------------------- Line 4: Not a valid instruction 'bswap' Mmmm, must be "Line 3" ... Anyway, I had to compile the asm code without the "bswap" instruction, and insert the opcode manually. Don, how did you get the opcode for "bswap eax"? Is there a newer version of ASM.EX? Regards, Juergen
3. Re: Binary conversion (machine)
- Posted by Juergen Luethje <jluethje at gmx.de> Aug 18, 2002
- 438 views
Don <Graebel at hotmail.com> wrote: >> The following code works for me: >> >> -------------------------------------------------------- >> include machine.e >> >> atom mem >> mem = allocate(4) >> >> constant SwapBytes = allocate(15) >> poke(SwapBytes, { >> #50, -- 0: push eax >> #A1,#00,#00,#00,#00, -- 1: mov eax, [mem] (2) >> #0F, #C8, -- 6: bswap eax >> #A3,#00,#00,#00,#00, -- 8: mov [mem], eax (9) >> #58, -- D: pop eax >> #C3}) -- F: ret >> poke4(SwapBytes + 2, mem) >> poke4(SwapBytes + 9, mem) >> >> poke4(mem, #90) >> -- poke4(mem, #12345678) -- better for demonstration >> >> printf(1, "%08x\n", peek4u(mem)) >> call( SwapBytes ) >> printf(1, "%08x\n", peek4u(mem)) >> call( SwapBytes ) >> printf(1, "%08x\n", peek4u(mem)) >> call( SwapBytes ) >> printf(1, "%08x\n", peek4u(mem)) >> >> free(SwapBytes) >> free(mem) >> -------------------------------------------------------- >> >> >> When I first tried to compile the asm code with Pete >> Eberlein's ASM, I got the following error message: >> >> --------------------------------- >> ASM to Euphoria compiler (32-bit) >> by Pete Eberlein Dec 29, 2001 >> --------------------------------- >> Line 4: Not a valid instruction 'bswap' >> >> Mmmm, must be "Line 3" ... >> >> Anyway, I had to compile the asm code without the "bswap" >> instruction, and insert the opcode manually. >> Don, how did you get the opcode for "bswap eax"? Is there >> a newer version of ASM.EX? >> >> Regards, >> Juergen > Ahh, hmm. Same routine but poke4'd the memory location in > directly. Well, it was the decision of ASM.EX to do so. The main difference is, that ASM.EX provided a different opcode for mov eax, [mem] ---------------------------------------------------------------------- -- Here's again your program, with (concerning the asm code) only this -- one byte changed, and it works! include machine.e atom mem, SwapBytes sequence Code_Space mem = allocate( 4 ) poke4( mem, #12345678 ) Code_Space = { #50, -- push eax -- #B8} & int_to_bytes(mem) & -- mov eax, offset mem * old #A1} & int_to_bytes(mem) & -- mov eax, offset mem * new { #0F, #C8, -- bswap eax #A3} & int_to_bytes(mem) & -- mov offset mem, eax { #58, -- pop eax #C3 -- ret } SwapBytes = allocate( length(Code_Space) ) poke( SwapBytes, Code_Space ) printf(1, "%08x\n", peek4u( mem )) call( SwapBytes ) printf(1, "%08x\n", peek4u( mem )) call( SwapBytes ) printf(1, "%08x\n", peek4u( mem )) call( SwapBytes ) printf(1, "%08x\n", peek4u( mem )) free( SwapBytes ) free( mem ) ---------------------------------------------------------------------- > I am going to have to experiment with this a little > more when I have some time. > And to answer your question, I have no idea about ASM.EX =)I didnt even > know it existed. It did almost all the coding automatically. I think it will be worth looking at it. AFAIK the version at http://www.harborside.com/~xseal/euphoria/download.html is newer than the version in the RDS archive. > I have two assembly compilers here I have been making > programs in. Well all I did was create a basic window and bswap'd eax > and sent it through a decompiler to see what codes it was using. Ah, thats a good idea to get unknown opcodes. > Put the rest of it together myself. Got the idea from > euphoria/dos/demo/callmach.ex. > Don Regards, Juergen