I'm studying the 9front's amd64 kernel, and I'm pretty new to assembler programming, so sorry if my question is too dumb... I cannot understand the FP pseudo register usage. The cpuid function, for example, is implemented as /* * The CPUID instruction is always supported on the amd64. */ TEXT cpuid(SB), $-4 MOVL RARG, AX /* function in AX */ CPUID MOVQ info+8(FP), BP MOVL AX, 0(BP) MOVL BX, 4(BP) MOVL CX, 8(BP) MOVL DX, 12(BP) RET What I miss is where "info" comes from. I cannot Apparently the GAS equivalent is: .align 4 .globl cpuid cpuid: mov %ebp,%eax cpuid mov 0x10(%rsp),%rbp mov %eax,0x0(%rbp) mov %ebx,0x4(%rbp) mov %ecx,0x8(%rbp) mov %edx,0xc(%rbp) retq Thus apparently info+8(FP) becomes 0x10(%rsp) Why? I know that FP is a pseudo register, but shouldn't it be different from SP? And why info's value is 8? Is it the pointer size? Another example: TEXT insb(SB), 1, $-4 MOVL RARG, DX /* MOVL port+0(FP), DX */ MOVQ address+8(FP), DI MOVL count+16(FP), CX CLD REP; INSB RET should be equivalent to .align 4 .globl insb insb: mov %ebp,%edx mov 0x10(%rsp),%rdi mov 0x18(%rsp),%ecx cld rep insb retq Again I cannot find a definition of address and count, but both seem to be be valued as 8, why? Giacomo