PowerPC 汇编指令小结

1. 寄存器模型

  • r0, register 0, is a scratch register.  It's often used for a temporary.
  • r1 is the stack pointer.
  • r2 is reserved for some multithreaded global variable magic.
  • r3 is used to return values (like eax), and as the first argument (like rdi).
  • r4 is the second argument
  • r5-r10 are also argument registers (or generic scratch)
  • r13-r31 are saved registers

2. 内存访问   

li r7, 123
stw r7, 0(r1) ; store register r7 to the stack
lwz r3, 0(r1) ; load register r3 from the stack 
blr

       stw r7, 0(r1) ;存储r7到stack中, 如果用stwu在同时更新栈顶指针-->addi r1, ri, -4

       lwz r3, 0(r1); 将stack 顶的数据加载到r3

       blr ; 转到连接寄存器存储的地址(函数返回地址)

3. 函数调用

     利用b (branch),如b _print_int;bl (Branch and Link)     

mflr r0 ; 将返回到main函数的地址存储在r0寄存器中
stwu r0,-4(r1); 将返回地址(r0)存储到堆栈中,同时更新栈顶指针,addi r1, r1,4

li r3,99
bl _print_int ; "bl" will overwrite LR, so print_int can return here

lwz r0,0(r1); grab main's link register from the stack
addi r1,r1,4 ; restore the stack
mtlr r0 ; restore main's link register
blr ; finally, this works correctly!

   例如:

    

 stwu    sp, -16(sp)       /*开辟16字节的堆栈空间,同时栈顶指向新的地址:sp=sp-16*/      
        mflr    r0   
        stw     r0, 20(sp) /* 将调用函数的返回地址存储在调用堆栈空间中 sp+20  */   
        /* set address of pseudo-system call trap */
        lis     p5, [email protected]
        addi    p5, p5, [email protected]        
      verInvokeSCLocation:   
        trap                      /* pseudo system call */        
        li      p5, 0             /* clear address */
        lwz     r0, 20(sp)     
        mtlr    r0                /*将保存着调用函数返回地址存储到LR寄存器中,同时恢复栈顶指针*/
        addi    sp, sp, 16 
        blr 

PowerPC 汇编指令小结PowerPC 汇编指令小结