原文地址:https://blog.csdn.net/weixin_36016360/article/details/112843378
就是自己做個筆記
通用寄存器(GPR)
在MIPS體系結構中有32個通用寄存器,在匯編程序中可以用編號$0~$31表示,也可以用寄存器的名字表示秋秤,如$sp嗡靡、$t1智政、$ta等酒觅,如圖易阳,堆棧是從內(nèi)存的高地址方向向低地址方向增長的贼陶。編號寄存器名稱寄存器描述
0zero第0號寄存器,其值始終為0
1$at保留寄存器
2~3 $v0~v1values, 保存表達式或函數(shù)返回結果
4-7 $a0~a3 arguments, 作為函數(shù)的前4個參數(shù)
8~15 $t0~$t7 temporaries孩灯,供匯編程序使用的臨時寄存器
16~23 $s0~$s7 saved values闺金,子函數(shù)使用時需要先保存原寄存器的值
24~25 $t8~t9 temporaries, 供匯編程序的臨時寄存器,補充$t0~t7
26~27 $k0~$k1 保留峰档,中斷處理函數(shù)使用
28 $gp global pointer败匹,全局指針
29 $sp stack pointer, 堆棧指針,指向堆棧的棧頂
30 $fp frame pointer, 保存棧指針
31 $ra return address, 返回地址$0:即$zero讥巡,該寄存器總是返回0掀亩,為0這個有用常數(shù)提供了一個簡潔的編碼形式。在MIPS處理器的通用寄存器中欢顷,沒有任何幫助運算判斷的標志寄存器槽棍,要實現(xiàn)相應的功能時,都是通過測試兩個寄存器是否相等完成的抬驴。MIPS編譯器常常會使用slt炼七、beq、bne等指令和由寄存器$0獲得0值產(chǎn)生比較所有的比較條件布持,如相等豌拙、不等、小于等于题暖、大于按傅、大于等于捉超。還可以用add指令創(chuàng)建move偽指令,如"move $t0, $t1; $t0=$t1"實際為“add $t0,$0,$t1; $t0= $t1 + 0"唯绍。使用MIPS偽指令可以簡化任務拼岳。
$1 ($at) : 該寄存器為匯編保留,用做匯編器的暫時變量况芒。
$2~$3($v0~$v1): 用于存放子程序的返回值或非浮點結果惜纸。當這兩個寄存器不夠存放返回值時,編譯器通過內(nèi)存來完成牛柒。
$4~$7($a0~$a3):用于將前4個參數(shù)傳遞給子程序,不夠的用堆棧處理痊乾。$a0~$a3皮壁、$v0~$v1和$ra 一起完成子程序函數(shù)調(diào)用過程,分別用以傳遞參數(shù)哪审、返回結果和存放返回地址蛾魄。當需要使用更多的寄存器時就需要堆棧了。MIPS編譯器總是為參數(shù)在堆棧中留有空間湿滓,以防有參數(shù)需要存儲滴须。
$8~$15($t0~$t7): 一個子函數(shù)可以不用保存并隨意使用這些寄存器。在進行表達式計算時叽奥,這些寄存器是非常好的臨時變量扔水。在使用時需要注意,當調(diào)用一個子函數(shù)時朝氓,這些寄存器的值有可能被子函數(shù)破壞魔市。
$16~$23($s0~$s7): 子函數(shù)必須保證當函數(shù)返回時這些寄存器的內(nèi)容將恢復到函數(shù)調(diào)用以前的值,或者子函數(shù)里不使用這些寄存器或把它們保存在堆棧上并保存在函數(shù)退出時恢復赵哲。這種約定使這些寄存器非常適合作為寄存器變量待德,或者用于存放一些函數(shù)調(diào)用期間必須保存的原值。
$24~$25($t8~$t9): 同$t0~$t7,作為$t0~$t7寄存器補充枫夺。
$26~$27($k0~$k1): 通常被中斷或異常處理程序使用将宪,以保存一些系統(tǒng)參數(shù)。
$28($gp): C語言中有兩種存儲類型橡庞,分別是自動型和靜態(tài)型较坛。自動變量是一個函數(shù)中的局部變量。靜態(tài)變量在進入和退出一個函數(shù)時都是存在的扒最。為了簡化靜態(tài)數(shù)據(jù)的訪問燎潮,MIPS保留了一個寄存器作為全局指針gp在編譯時,數(shù)據(jù)需要在以gp為基指針的64KB范圍內(nèi)扼倘。
$29($sp): MIPS硬件并不直接支持堆棧确封,X86有單獨的PUSH和POP指令除呵,而MIPS沒有單獨的棧操作指令,所有對棧的操作都是統(tǒng)一的內(nèi)存訪問方式爪喘,單這并非不影響MIPS使用堆棧颜曾。在發(fā)生函數(shù)調(diào)用時,調(diào)用者把函數(shù)調(diào)用之后要用的寄存器壓入堆棧秉剑,被調(diào)用者把返回地址寄存器$ra(并非任何時候都保存$ra)和保留寄存器壓入堆棧泛豪。同時,調(diào)整堆棧指針侦鹏,并在返回時從堆棧中恢復寄存器诡曙。
$30($fp): 不同編譯器可能對該寄存器使用方法不同。GNU MIPS C編譯器使用了棧指針(Frame Pointer)略水。SGI的C編譯器則沒有使用棧指針价卤,只是把這個寄存器當成保存寄存器使用($s8),這雖然節(jié)省了調(diào)用和返回開銷渊涝,但增加了代碼生成的復雜度性慎璧。
$31 ($ra): 存放返回地址。MIPS有一個jar(jump-and-link,跳轉并鏈接)指令跨释,在跳轉到某個地址時可把下一條指令的地址放到$ra中胸私,用于支持子程序。例如鳖谈,調(diào)用程序把參數(shù)放到$a0~$a3中岁疼,“jar X"指令跳到X過程,被調(diào)用時需要保存的寄存器為$a0~$a3缆娃、$s0~$s7五续、$gp、$sp龄恋、$fp疙驾、$ra。
————————————————
版權聲明:本文為CSDN博主「小二嘉」的原創(chuàng)文章郭毕,遵循CC 4.0 BY-SA版權協(xié)議它碎,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_36016360/article/details/112843378
匯編常用的指令
注意:$Rd表示目的寄存器显押, $Rs表示源寄存器扳肛,$Rt表示作為中間緩存的寄存器,"imm"表示立即數(shù)乘碑,“MEM[]“表示RAM中的一段內(nèi)存挖息,“offset"表示偏移量。
3.1兽肤、LOAD/STORE指令
LOAD/STORE指令有14條套腹,分別是lb绪抛、lbu、lh电禀、lhu幢码、ll、lw尖飞、lwl症副、lwr、sb政基、sc贞铣、sh、sw沮明、swl和swr辕坝。
以"l"開頭的都是加載指令,以"s"開頭的都是存儲指令珊擂,這些指令用于從存儲器中讀取數(shù)據(jù)圣勒,或者將數(shù)據(jù)保存在存儲器中费变。
3.1.1摧扇、LA(Load Address) 指令用于將一個地址或標簽存入一個寄存器。語法實例備注
la $Rd, Labella $t0, val_1復制val_1表示的地址到$t0寄存器中挚歧,其中val_1是一個Label
3.1.2扛稽、LI(Load Immediate)指令用于將一個立即數(shù)存入一個通用寄存器。語法實例備注
lw $Rt, offset($Rs)lw $s0, 0($sp)"$s0 = MEM[$sp+0]",相當于取堆棧地址偏移0內(nèi)存word長度的值到$s0中
3.1.3滑负、LW(Load Word) 指令用于從一個指定的地址加載一個word類型的值到一個寄存器中在张。語法實例備注
lw $Rt, offset($Rs)lw $s0, 0($sp)"$s0=MEM[$sp+0];",相當于取堆棧地址偏移0內(nèi)存word長度的值到$s0中
3.1.4、SW(Store Word)用于將源寄存器中的值存入指定的地址矮慕。語法實例備注
sw $Rt, offset($Rs)sw $a0,0($sp)"MEM[$sp+0]=$a0;",相當于將$a0寄存器中一個word大小的值存入堆棧帮匾,且$sp自動堆棧
3.1.5、MOVE指令用于寄存器之間值的傳遞痴鳄。語法實例備注
move $Rt, $Rsmove $t5, $t1$t5=$t1;
3.2瘟斜、算術運算指令
MIPS匯編指令的算術運算特點如下:算術運算指令的所有操作數(shù)都是寄存器,不能直接使用RAM地址或間接尋址痪寻。
操作數(shù)大小都為word(4 Byte)螺句。
算術運算指令有21條,分別為add橡类、addi蛇尚、sub、subu顾画、clo取劫、clz匆笤、slt、slti勇凭、sltiu疚膊、sltu、mul虾标、mult寓盗、madd、maddu璧函、msub傀蚌、msubu、div和divu蘸吓,實現(xiàn)了加善炫、減、比較库继、乘箩艺、乘累加、除等運算宪萄。指令格式與實例注釋
add $t0,$t1,$t2"$t0=$t1+$t2;"艺谆,帶符號數(shù)相加
sub $t0,$t1,$t2"$t0=$t2 - $t2;", 帶符號數(shù)相減
addi $t0,$t1,5$t0 = $t1 + 5;
addu $t0,$t1,$t2"$t0 = $t1 + $t2;",無符號數(shù)相加
subu $t0, $t1, $t2"$t0 = $t2 - $t2;",無符號數(shù)相減
mult $t3, $t4"$t3 * $t4", 把64 Bits的積存儲到"Lo,Hi"中,即"(Hi,Lo)=$t3 * $t4;"
div $t5, $t6"$LO=$t5/$t6", $LO為商的整數(shù)部分拜英;"$HI=$t5 mod $t6", $HI為余數(shù)
mfhi $t0$t0 = $HI
mflo $t1$t1 = $LO
以上是MIPS指令基礎静汤。
————————————————
版權聲明:本文為CSDN博主「小二嘉」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議居凶,轉載請附上原文出處鏈接及本聲明虫给。
原文鏈接:https://blog.csdn.net/weixin_36016360/article/details/112843378