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