# LinuxPPC Assembler - LinuxPPC 2000, Aug 2000 .file "zz.c" # zsvjmp_(buf,status) # int *buf; # int *status; # { # *status = 0; # buf[0] = *status; # setjmp (&buf[1]); # } gcc2_compiled.: .section ".text" .align 2 .globl zsvjmp_ .type zsvjmp_,@function # Addressing: 12(31) means effective address (EA) is r31+12 # lwz 9,12(31) means move value at EA to r9 # REGISTERS: r1 = stack pointer, r31 = frame pointer, r3+ = args # Function always saves r1, r31 on stack. Sets up frame with # required auto storage. Saves LR as well if any functions will # be called. zsvjmp_: # -- Push old r1 on stack; start new stack frame at r1 stwu 1,-32(1) # Store word with update (push on stack) # EA = r1-32; (r1) -> (EA), EA -> r1 # -- Save LR, r31 in stack frame mflr 0 # Move from Link Register: LR -> r0 stw 31,28(1) # Store word: r31 -> r1+28 stw 0,36(1) # Store word: r0 -> r1+36 # -- Save r3 (arg1), r4 (arg2) on stack mr 31,1 # Move register: r1 -> r31 stw 3,8(31) # r3 -> r31+8 stw 4,12(31) # r4 -> r31+12 # -- *status = 0; lwz 9,12(31) # Load word and zero: (r31+12) -> r9 li 0,0 # Load zero: 0 -> r0 stw 0,0(9) # Store: r0 -> r9+0 # -- buf[0] = *status; lwz 9,8(31) # buf -> r9 lwz 11,12(31) # status -> r11 lwz 0,0(11) # *status -> r0 stw 0,0(9) # r0 -> buf[0] # -- setjmp (&buf[1]); lwz 9,8(31) # buf -> r9 addi 0,9,4 # Add immediate; r9+4 -> r0 mr 3,0 # R3 is first arg crxor 6,6,6 # Condition reg XOR: xor(b6,b6) -> b6 bl setjmp # Branch to setjmp; addr(.L2) -> LR .L2: lwz 11,0(1) # load old r1 into r11 lwz 0,4(11) # load old LR into r0 mtlr 0 # restore return addr to LR lwz 31,-4(11) # restore old r31 mr 1,11 # restore old r1 blr # Branch unconditionally (to LR addr) .Lfe1: .size zsvjmp_,.Lfe1-zsvjmp_ .ident "GCC: (GNU) 2.95.2 19991024 (release/franzo)"