1. Binary conversion (machine)

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

new topic     » topic index » view message » categorize

2. Re: Binary conversion (machine)

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

new topic     » goto parent     » topic index » view message » categorize

3. Re: Binary conversion (machine)

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. smile

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

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu