[fpc-pascal] Intel x86 inline assembler problem

leledumbo leledumbo_cool at yahoo.co.id
Wed Nov 19 04:08:26 CET 2008



procedure DumpRegs;
var
  Reg: array [0..7] of LongWord;
  SReg: array [0..5] of Word;
  EIP: LongWord;
  EFLAGS : LongWord;
begin
  asm
    // save registers while they are not modified by another procedure call.
note that depending
    // on your compiler settings, ebp may already be trashed (stack frame)
    mov dword ptr Reg[4*0],eax
    mov dword ptr Reg[4*1],ecx
    mov dword ptr Reg[4*2],edx
    mov dword ptr Reg[4*3],ebx
    mov dword ptr Reg[4*4],esp // esp is already incorrect since it was
decreased by the amount of stack space the local variables require
    mov eax, 16*4+6*2+4+4
    add dword ptr Reg[4*4],eax // correct esp
    mov dword ptr Reg[4*5],ebp
    mov dword ptr Reg[4*6],esi
    mov dword ptr Reg[4*7],edi
    // save segment registers
    mov word ptr SReg[2*0],ds
    mov word ptr SReg[2*1],es
    mov word ptr SReg[2*2],cs
    mov word ptr SReg[2*3],ss
    mov word ptr SReg[2*4],fs
    mov word ptr SReg[2*5],gs
    // save EFLAGS
    pushfd
    pop dword ptr EFLAGS
    // now get eip.
    //call $+3          -- $ is considered Hex instead of current line
address
    //pop dword ptr EIP -- invalid operand (EIP)
  end;
  WriteStrLn('EAX    = '+HexStr(Reg[0],8));
  WriteStrLn('ECX    = '+HexStr(Reg[1],8));
  WriteStrLn('EDX    = '+HexStr(Reg[2],8));
  WriteStrLn('EBX    = '+HexStr(Reg[3],8));
  WriteStrLn('ESP    = '+HexStr(Reg[4],8));
  WriteStrLn('EBP    = '+HexStr(Reg[5],8));
  WriteStrLn('ESI    = '+HexStr(Reg[6],8));
  WriteStrLn('EDI    = '+HexStr(Reg[7],8));
  WriteStrLn('DS     = '+HexStr(SReg[0],8));
  WriteStrLn('ES     = '+HexStr(SReg[1],8));
  WriteStrLn('CS     = '+HexStr(SReg[2],8));
  WriteStrLn('SS     = '+HexStr(SReg[3],8));
  WriteStrLn('FS     = '+HexStr(SReg[4],8));
  WriteStrLn('GS     = '+HexStr(SReg[5],8));
  WriteStrLn('EFLAGS = '+HexStr(EFLAGS,8));
  WriteStrLn('EIP    = '+HexStr(EIP,8));
end;

Questions:


What's Free Pascal's substitution for $ (used as Hex in FPC, current line
address in normal assembler)?
EIP is recognized by the assembler? How come? AFAIK, it's not visible to the
programmer. Thus, the above EIP should refer to EIP in the local variables
section.

-- 
View this message in context: http://www.nabble.com/Intel-x86-inline-assembler-problem-tp20572969p20572969.html
Sent from the Free Pascal - General mailing list archive at Nabble.com.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20081118/f107ad50/attachment.html>


More information about the fpc-pascal mailing list