<pre><code>
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;
</code></pre>
Questions:<br />
<ol>
<li>What's Free Pascal's substitution for $ (used as Hex in FPC, current line address in normal assembler)?</li>
<li>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.</li>
</ol>
<br><hr align="left" width="300">
View this message in context: <a href="http://www.nabble.com/Intel-x86-inline-assembler-problem-tp20572969p20572969.html">Intel x86 inline assembler problem</a><br>
Sent from the <a href="http://www.nabble.com/Free-Pascal---General-f683.html">Free Pascal - General mailing list archive</a> at Nabble.com.<br>