for(;;){
run next instruction
}
enum {
Data = 0x378+0
Status = 0x378+1,
Notbusy = 0x80,
Ctl = 0x378+2,
Strobe = 0x01,
};
lptputc(c)
{
while((inb(Status)&Notbusy) == 0)
;
outb(Data, c)
outb(Ctl, Strobe)
outb(Ctl, 0)
}
| at&t | "C" |
| movl %eax, %edx | |
| movl $0x123, %edx | |
| movl (%ebx), %edx | edx = mem[ebx]; |
| movl 4(%ebx), %edx | edx = mem[ebx+4]; |
| movl 0x123, %edx | edx = mem[0x123]; |
subl $4, %esp movl %eax, (%esp)
movl (%esp), %eax addl $4, %esp
pushl %eip movl $0x12345, %eip
popl %eip
+------------+ | arg 2 | +------------+ | arg 1 | +------------+ | ret %eip | +============+ %ebp-> | saved %ebp | +------------+ | | | | | | | | | | %esp-> | | +------------+
pushl %ebp movl %esp, %ebp
movl %ebp, %esp popl %ebpor
leave
int main(void) { return f(8)+1; }
int f(int x) { return g(x); }
int g(int x) { return x+3; }
_main: prologue pushl %ebp movl %esp, %ebp body pushl $8 call _f addl $1, %eax epilogue movl %ebp, %esp popl %ebp ret _f: prologue pushl %ebp movl %esp, %ebp body pushl 8(%esp) call _g epilogue movl %ebp, %esp popl %ebp ret _g: prologue pushl %ebp movl %esp, %ebp save %ebx pushl %ebx body movl 8(%ebp), %ebx addl $3, %ebx movl %ebx, %eax restore %ebx popl %ebx epilogue movl %ebp, %esp popl %ebp ret
_g: movl 4(%esp), %eax addl $3, %eax ret