Results 1 to 10 of 19

Thread: Converting ASM to Pascal

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    OK, so from you routines i see you are needing to deal with low level access, so converting to high level pascal would not be a good idea. What you will need to do is make your integers be nativeint, ie. _EAX, _EDX etc... also change them to _RAX, _RCX etc

    replace your registers for mov to RAX, RCX etc e.g. mov rax, _RAX, the stack on 64-bit is also 16 byte aligned so you can push int64 directly on the stack for stdcall (however i don't recommend it as if the called function is not 64-bit and they do not clean the stack correctly, since they will expect stack on 4 byte alignment this could be a disaster). else you can still use the pascal functions StrLCopy etc for the memory copy to stack it will probably be more efficient.

    some other things to note, for Adr if the called function is fastcall, it will not alter esp for passed params since it does not use the stack, in this case you would need to correct the stack yourself.
    Last edited by Colin; 18-03-2013 at 05:39 PM.
    Download the Ziron Assembler
    Get free hosting for Ziron related fan-sites and Ziron projects, contact me in private message.

  2. #2
    Ok, thanks, but I have no clue what you are talking about. The complete code is not by me but by someone else, I just wanted the program to compile with 64 bit Freepascal ...
    Best regards,
    Cybermonkey

  3. #3
    if the functions that are called by "CallFunction" are 32-bit libraries functions etc, then you should not have a problem to compile this on 64-bit pascal, but if you re-compile the libs it calls into 64-bit then you will have a-lot of work ahead.

    What i would suggest is to rename this function to CallFunctionX86(... and make sure all pointers and variables used are 32-bit standard, e.g. pointer should be 32-bit pointer (i don't use freepascal dunno which you will need to use)

    then you can create a new function CallFunctionX64(

    This would be similar but using 64-bit variables and registers.
    Last edited by Colin; 18-03-2013 at 05:51 PM.
    Download the Ziron Assembler
    Get free hosting for Ziron related fan-sites and Ziron projects, contact me in private message.

  4. #4
    Ok, but I learned that "mov EAX" etc. isn't available on 64 bit processors, is it?
    Best regards,
    Cybermonkey

  5. #5
    it is, eax is 32-bit part of RAX, maybe TASM or pascal assembler does not support mov with 32-bit regs (eax, ecx etc) in 64-bit mode (if so that is flawed)

    so if mov eax, _EAX does not work try either:

    movd eax, _EAX

    or

    mov rax, dword _EAX
    Last edited by Colin; 18-03-2013 at 06:12 PM.
    Download the Ziron Assembler
    Get free hosting for Ziron related fan-sites and Ziron projects, contact me in private message.

  6. #6
    It is even worse, "push esi" isn't known either. I added the compiler directive {$asmmode intel}. Now the problems are:
    Chip.pas(2041,13) Error: Asm: [push reg32] invalid combination of opcode and operands
    Chip.pas(2042,13) Error: Asm: [push reg32] invalid combination of opcode and operands
    Chip.pas(2066,12) Error: Asm: [pop reg32] invalid combination of opcode and operands
    Chip.pas(2067,12) Error: Asm: [pop reg32] invalid combination of opcode and operands
    Another problem causes this piece of code (it's obviously Pascal, but i don't know to solve it either):
    Code:
          args.outVal.n.sbuf:=basicstring(resvalue);
          basicstring(resvalue):=''
    Error:
    Chip.pas(2076,27) Error: Illegal type conversion: "LongInt" to "AnsiString"
    Chip.pas(2077,7) Error: Illegal type conversion: "LongInt" to "AnsiString"
    With a 32 bit FPC it compiles ... BTW, the complete source of Chip.pas can be found on: http://xmojmr.ohmygod.cz/software/Chip/Chip.pas.htm
    Best regards,
    Cybermonkey

  7. #7
    I guess the assembler does some checking for stack alignment to prevent problems with other 64-bit libs, this is an issue with the assembler unless it has an override option, maybe try

    Code:
    [32BIT]
    push edi
    push .. etc
    as for the other code, does basicstring return a pchar/pointer? if so try

    Code:
    basicstring(resvalue)^ := ''
    better still:

    Code:
    var
      p: PAnsiChar;
    Code:
    p := basicstring(resvalue);
    args.outVal.n.sbuf := p;
    p^ := ''
    Last edited by Colin; 18-03-2013 at 08:02 PM.
    Download the Ziron Assembler
    Get free hosting for Ziron related fan-sites and Ziron projects, contact me in private message.

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •