MIPS彙編語言——3.C語言轉化
C語言的賦值語句編譯成MIPS
f=(g+h)-(i+j)
add t0,g,hadd t1,i,jsub f,t0,t1
用存數、取數指令進行編譯
A[12]=h+A[8]
lw $t0,32($s3) #$t0=A[8]add $to,$to,$s2 #$t0=h+A[8]sw $to,48($s3)
將if-then-else編譯成條件分支指令
if(i==j) f=g+h;else f=g-h;
Tips:對於if-then-else,採用bne ...,...,else更方便
bne i,j,elseadd f,g,hj exit#很重要!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!else: sub,f,g,hexit: ...
while循環
while(save[i]==k) i+=1;
loop: sll $t1,i,2 #$t1=i*4 add $t1,$t1,$s6 #$s6是基地址 lw $t0,0($t1) #$to=save[i] bne $t0,k,Exit #若save[i]!=k則退出循環 addi i,i,1 #若save[i]==k則執行i+=1 j loop #在循環的末尾,程序跳到循環的開始,並增加exit標籤Exit:
不調用其他過程的子程序
int leaf_example(int g,int h,int i,int j){ int f; f=(g+h)-(i+j); return f;}
假設j,h,i,j對應$a0,$a1,$a2,$a3,f對應$s0
leaf example: addi $sp,$sp,-12 sw $t1,8($sp) sw $t0,4($sp) sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 sub $s0,$t0$t1 add $v0,$s0,$zero lw $s0,0($sp) lw $t0,4($sp) lw $t1,8($sp) addi %sp,$sp,12 jr $ra
編譯一個遞歸過程
int fact(int n){ if(n<1) return 1; else return n*fact(n-1)
參數n對應寄存器$a0,棧中保存兩個寄存器,一個是返回地址,另一個是$a0(N)
fact: addi $sp,$sp,-8 sw $ra,4($sp) sw $a0,0($sp) slti $t0,$a0,1 #i<1? beq $t0,$zero,L1 #if i>=1,goto L1 #if i<1 addi $v0,$zero,1 addi $sp,$sp,8 jr,$ra #有關jr $ra:子程序中的return之後需要jr $ra(本應lw $a0,$ra後再退出,但是這裡$a0,$ra沒有變化,因此跳過了) #if i>=1L1:addi $a0,$a0,-1 jal fact #call fact(n-1) lw $a0,0($sp) lw $ra,4($sp) addi $sp,$sp,8 #值得注意的是,return n*fact(n-1)過程裡面的fact(n-1)的值是退棧完成之後再以v0為代表而計算的 mul $v0,$v0,$a0 jr $ra #return to caller。 #子程序的return結束後要jr $ra,返回主程序
C語言,字元串複製
void strcpy(char x[],char y[]){ int i; i=0; while((x[i]=y[i])!=
