第二章 運(yùn)算方法與運(yùn)算器_第1頁(yè)
已閱讀1頁(yè),還剩105頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第2章 指令:計(jì)算機(jī)的語(yǔ)言,計(jì)算機(jī)中的信息分為:,數(shù)值型數(shù)據(jù),數(shù)據(jù)信息,控制信息,,,非數(shù)值型數(shù)據(jù),2.1 數(shù)據(jù)信息的表示方法,數(shù)值型數(shù)據(jù)的完整表示:采用什么進(jìn)位計(jì)數(shù)制(逢幾進(jìn)位)如何使符號(hào)數(shù)字化(機(jī)器數(shù)的編碼方法)如何處理小數(shù)點(diǎn)位置(定點(diǎn)表示、浮點(diǎn)表示),2.1.1進(jìn)位計(jì)數(shù)制及轉(zhuǎn)換,一. 基本概念 r進(jìn)制 一般的,在r進(jìn)制下,數(shù),,,該位數(shù)字(0~r-1),基數(shù):指該進(jìn)位制中允許選用的基本數(shù)碼的個(gè)數(shù),,權(quán):權(quán)的大小是

2、以基數(shù)為底,該位數(shù)字所在位置的序號(hào)為指數(shù)的整數(shù)次冪。,所代表的數(shù)值可以表示為:,例:,2.1.1進(jìn)位計(jì)數(shù)制及轉(zhuǎn)換,二. 各種數(shù)制之間的轉(zhuǎn)換1.十進(jìn)制轉(zhuǎn)換為二進(jìn)制整數(shù) :規(guī)則:連續(xù)“除以2取余,直到商為0”例1:(116)10 = ( )2,2.1.1進(jìn)位計(jì)數(shù)制及轉(zhuǎn)換,例1:(116)10 = ( )2 (116)10 = ( 1110100 )2例2:29D =( )B,11

3、101,2.1.1進(jìn)位計(jì)數(shù)制及轉(zhuǎn)換,小數(shù):規(guī)則:連續(xù)“乘以2取整,直到小數(shù)部分為0”例1: 0.8125D =( )B0.8125 × 2 = 1.625 ……10.625 × 2 = 1.25 ……10.25 × 2 = 0.5 ……00.5 × 2 = 1 ……1因此:0.8125D =(0. 11

4、01 )B例2:0.375D =( )B,0.011,2.1.1進(jìn)位計(jì)數(shù)制及轉(zhuǎn)換,2. 二進(jìn)制轉(zhuǎn)化為十進(jìn)制規(guī)則:按權(quán)相加例1:,例2:,2.1.2 機(jī)器數(shù)的編碼格式,機(jī)器數(shù)是指數(shù)在計(jì)算機(jī)中的表示形式,一般是采用某種編碼形式表示帶符號(hào)的二進(jìn)制數(shù)。真值是指機(jī)器數(shù)所對(duì)應(yīng)的實(shí)際數(shù)值。常用的機(jī)器數(shù)形式有:原碼、補(bǔ)碼、反碼。,2.1.2 機(jī)器數(shù)的編碼格式,一. 原碼表示法(符號(hào)和幅值表示法) 規(guī)定:最高位為符

5、號(hào)位(0為正,1為負(fù)),其余有效數(shù)值部分用二進(jìn)制的絕對(duì)值表示。,2.1.2 機(jī)器數(shù)的編碼格式,注意:1)0可分+0和-0。 +0 為 0.0…0 -0為 1.0…02)符號(hào)位和數(shù)值無(wú)關(guān),不能作為數(shù)值的一部分直接參與運(yùn)算,在運(yùn)算中要額外增加一步處理。3)原碼表示的數(shù)取不到端點(diǎn) 小數(shù): |X|<1 整數(shù):|X|<2n,2.1.2 機(jī)器數(shù)的編碼格式,二. 補(bǔ)碼表示法1.模,

6、,13,,-2,模為12,例:11-2 = ?11- 2 = 11+10 = 21 21-12 = 9,2.1.2 機(jī)器數(shù)的編碼格式,2. 補(bǔ)碼定義 [X]補(bǔ) = M + X (mod M),定點(diǎn)小數(shù)的補(bǔ)碼可定義為:,定點(diǎn)整數(shù)的補(bǔ)碼可定義為:,2.1.2 機(jī)器數(shù)的編碼格式,3. 補(bǔ)碼的性質(zhì)符號(hào)位是數(shù)值的一部分,可以與尾數(shù)一起直接參與運(yùn)算,不需要單獨(dú)處理。所有負(fù)數(shù)的最高有效位都

7、是1,硬件只需檢測(cè)該位就可判斷是正數(shù)還是負(fù)數(shù)。 數(shù)0只有一種表示,即00……0。補(bǔ)碼可以取到負(fù)方向最值。,2.1.2 機(jī)器數(shù)的編碼格式,4. 原碼與補(bǔ)碼的互換正數(shù):補(bǔ)碼表示與原碼表示相同負(fù)數(shù):原碼的符號(hào)位保持不變,其余各位取反,末位再加1。例:,[X]原 =1.1010,變反: 1.0101,末位加1: 1,,[X]補(bǔ) =1.0110,2.1.2 機(jī)器數(shù)的編碼格式,5.二進(jìn)制補(bǔ)碼轉(zhuǎn)換十進(jìn)制數(shù)32位二進(jìn)制補(bǔ)碼可按

8、如下公式轉(zhuǎn)換:,例:以下32位二進(jìn)制補(bǔ)碼對(duì)應(yīng)的十進(jìn)制數(shù)是多少? 1111 1111 1111 1111 1111 1111 1111 11002解:1111 1111 1111 1111 1111 1111 1111 11002= –1×231 + 1×230 + … + 1×22 +0×21 +0×20= –2,147,483,648 + 2,147,483,644 = –41

9、0,…,,2.1.2 機(jī)器數(shù)的編碼格式,6.二進(jìn)制補(bǔ)碼的相關(guān)操作:1)對(duì)二進(jìn)制補(bǔ)碼數(shù)取反(正數(shù),負(fù)數(shù)),2.1.2 機(jī)器數(shù)的編碼格式,例:對(duì)210 求反(字長(zhǎng)32位)解: 210=0000 0000 0000 0000 0000 0000 0000 00102 1111 1111 1111 1111 1111 1111 1111 11012 +

10、 12———————————————————————————————————————— = 1111 1111 1111 1111 1111 1111 1111 11102 = -210,2.1.2 機(jī)器數(shù)的編碼格式,2)符號(hào)擴(kuò)展用于將一個(gè)n位表示的二進(jìn)制數(shù)轉(zhuǎn)化成一個(gè)多于n位表示的數(shù)。將最高有效位(符號(hào)位)以復(fù)制的方

11、式填 滿高位部分。,2.1.2 機(jī)器數(shù)的編碼格式,三. 反碼表示法反碼表示規(guī)則:正數(shù)的反碼:與原碼相同負(fù)數(shù)的反碼:符號(hào)位為1,尾數(shù)由原碼按位取反。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,根據(jù)數(shù)據(jù)中小數(shù)點(diǎn)位置是否固定,將數(shù)的格式分為定點(diǎn)表示和浮點(diǎn)表示。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,一.定點(diǎn)表示法(小數(shù)點(diǎn)位置不變)(1)小數(shù)點(diǎn)位置事先隱含約定(2)若小數(shù)點(diǎn)固定在符號(hào)位之后,則該數(shù)是一個(gè)純小數(shù)。 例如 N=0.110

12、101001(3)若把小數(shù)點(diǎn)定在最末位之后,這時(shí)表示一個(gè)純整數(shù)(定點(diǎn)整數(shù))。 例如 N=01011010,2.1.3 數(shù)值數(shù)據(jù)的表示方法,二. 浮點(diǎn)表示法1. 通用浮點(diǎn)數(shù)表示形式: 任何一個(gè)二進(jìn)制數(shù)N都可以表示為 N=(-1)S×F×2E其中S表示浮點(diǎn)數(shù)的符號(hào)(1表示負(fù)數(shù)),F(xiàn)稱為數(shù)N的尾數(shù),表示數(shù)N的全部有效數(shù)據(jù),其值在0和1之間。 E是一個(gè)二進(jìn)制整數(shù),稱為數(shù)N的

13、指數(shù)(或稱為階碼),指明該數(shù)的小數(shù)點(diǎn)位置,表示數(shù)據(jù)的大小范圍。如:N=(-1)0×0.1011010×2011 N=(-1)1×0.1110010×2-1,2.1.3 數(shù)值數(shù)據(jù)的表示方法,MIPS中浮點(diǎn)數(shù)的表示如下:?jiǎn)尉雀↑c(diǎn)數(shù):32位,其中,S為浮點(diǎn)數(shù)的符號(hào)位,指數(shù)域?yàn)?位寬(包括指數(shù)的符號(hào)位),尾數(shù)域?yàn)?3位寬。浮點(diǎn)數(shù)表示法可擴(kuò)大數(shù)值的表示范圍,但依然

14、可能會(huì)因數(shù)太大而不能表示。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,雙精度浮點(diǎn)數(shù):兩個(gè)32位,其中,S為浮點(diǎn)數(shù)的符號(hào)位,指數(shù)域?yàn)?1位寬(包括指數(shù)的符號(hào)位),尾數(shù)域?yàn)?2位寬。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,幾個(gè)相關(guān)概念: 科學(xué)計(jì)數(shù)法:十進(jìn)制小數(shù)點(diǎn)左邊只有一位整數(shù)的記數(shù)法。規(guī)格化數(shù): 一個(gè)采用科學(xué)記數(shù)法表示的數(shù),若沒(méi)有前導(dǎo)零且小數(shù)點(diǎn)左邊只有一位整數(shù),則可稱為規(guī)格化數(shù)。如: 1.010×10-9 √ 0

15、.110×10-9 × 10.010×10-9 ×二進(jìn)制規(guī)格化浮點(diǎn)數(shù) 尾數(shù)部分的小數(shù)點(diǎn)左邊只保留一位非零數(shù)。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,采用規(guī)格化科學(xué)記數(shù)法的優(yōu)點(diǎn):-簡(jiǎn)化了浮點(diǎn)數(shù)的數(shù)據(jù)交換-簡(jiǎn)化了浮點(diǎn)算術(shù)算法-提高了用一個(gè)字存儲(chǔ)的數(shù)的精度偏移(移碼)表示法在浮點(diǎn)數(shù)加減中,將兩數(shù)的指數(shù)調(diào)整為相同。若指數(shù)用補(bǔ)碼表示,不易比較其大小。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,為

16、更直觀比較指數(shù)的大小,可用移碼表示浮點(diǎn)數(shù)的指數(shù)。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,移碼定義: [E]移 = E+Bias E為指數(shù)的真值,Bias 為偏階,通常 Bias= 2n ,其中,n為指數(shù)的數(shù)碼位位數(shù), 2n 是符號(hào)位的位權(quán)。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,2. IEEE 754浮點(diǎn)標(biāo)準(zhǔn): N=(-1)S×(1+Fraction)×2(Exponent-Bias)

17、注: IEEE 754 標(biāo)準(zhǔn)隱藏規(guī)格化二進(jìn)制數(shù)的前導(dǎo)位1,因此,F(xiàn)raction只是尾數(shù)域的值,其值在0和1之間,真正有效位的值為: 1+Fraction 。Exponent是指數(shù)域的值,Exponent-Bias指明該數(shù)的小數(shù)點(diǎn)位置,表示數(shù)據(jù)的大小范圍。IEEE 754規(guī)定: 單精度浮點(diǎn)數(shù)的偏階為127,即:Bias=127 雙精度浮點(diǎn)數(shù)的偏階為1023,即:Bias=1023,2.1.3 數(shù)值數(shù)據(jù)的表示方法

18、,N=(-1)S×(1+Fraction)×2(Exponent-Bias)在MIPS中的表示:,單精度:,雙精度:,2.1.3 數(shù)值數(shù)據(jù)的表示方法,注意:由于0 沒(méi)有前導(dǎo)位1,它的指數(shù)保留為0,所以硬件就不會(huì)將前導(dǎo)位1加到尾數(shù)上。因此,0 的表示為000……02。其它數(shù)的表示依然采用前面的形式。,2.1.3 數(shù)值數(shù)據(jù)的表示方法,3. 例1:分別用IEEE 754 的單精度和雙精度格式來(lái)表示-0.7510。

19、解:先將-0.7510轉(zhuǎn)換為二進(jìn)制小數(shù)形式: N = -0.7510 = -0.112 科學(xué)記數(shù)表示為: N = -0.112 × 20 規(guī)格化的科學(xué)記數(shù)表示為: N = -1.12 × 2-1,2.1.3 數(shù)值數(shù)據(jù)的表示方法,N = -1.12 × 2-1由于單精度表達(dá)式為:N=(-

20、1)S×(1+Fraction)×2(Exponent-Bias) 所以:Fraction = (1.1 - 1 )2= 0.12 Exponent = -1 + 127 = 126最終,單精度二進(jìn)制格式為:,2.1.3 數(shù)值數(shù)據(jù)的表示方法,N = -1.12 × 2-1由于雙精度 中:Bias = 1023 所以:Fraction = (1.1 - 1 )2=

21、 0.12 Exponent = -1 + 1023 = 1022最終,雙精度二進(jìn)制格式為:,2.1.3 數(shù)值數(shù)據(jù)的表示方法,例2:將X = 23×(-13/16))用IEEE 754的單精度浮點(diǎn)格式來(lái)表示。,解: X = 23×(-0.8125)10= 23×(-0.1101)2規(guī)格化的科學(xué)記數(shù)表示為:X = -1.1012 × 22Frac

22、tion = (1.101 - 1 )2= 0.1012Exponent = 2+ 127 = 129,2.1.3 數(shù)值數(shù)據(jù)的表示方法,X = -1.1012 × 22Fraction = (1.101 - 1 )2= 0.1012Exponent = 2+ 127 = 129所以,單精度二進(jìn)制格式為:,2.1.4 字符的表示,一. ASCII碼“美國(guó)標(biāo)準(zhǔn)信息交換代碼”(American Standard Cod

23、e for Information Interchange),簡(jiǎn)稱ASCII碼。使用8位的字節(jié)來(lái)表示字符。 (見(jiàn)課本P72 圖2-15)二. Unicode Unicode是大多數(shù)人類(lèi)語(yǔ)言中字母的通用編碼。通常采用16位來(lái)表示一個(gè)字符。 (見(jiàn)課本P74 圖2-16),2.2 MIPS指令集,2.2.1 基本概念:一. 指令集一個(gè)給定的計(jì)算機(jī)體系結(jié)構(gòu)所包含的指令集合。常見(jiàn)的指令集:MIPS,ARMv7,

24、ARMv8,Intel x86二. 存儲(chǔ)程序概念 多種類(lèi)型的指令和數(shù)據(jù)均以數(shù)字形式存儲(chǔ)于存儲(chǔ)器中。,2.2.2 MIPS的操作數(shù),一. 相關(guān)規(guī)定:MIPS算術(shù)運(yùn)算指令的操作數(shù)必須來(lái)自寄存器。寄存器大?。?2位。寄存器個(gè)數(shù):32個(gè)。寄存器的表示:$s0, $s1, … 表示C程序中的變量所對(duì)應(yīng)的寄存器。 $t0, $t1, … 表示將程序編譯為MIPS指令時(shí)所需的臨時(shí)寄存器。 (其它各寄存器的表示及功能見(jiàn)課

25、本P71圖2-14),2.2.2 MIPS的操作數(shù),例: 使用寄存器編譯C賦值語(yǔ)句 C code f = ( g + h ) – ( i + j ) ; MIPS code add $t0, $s1, $s2 # $t0 contains g + h add $t1, $s3, $s4 # $t1 contains i + j

26、 sub $s0, $t0, $t1 # f gets $t0 - $t1,2.2.2 MIPS的操作數(shù),二. 存儲(chǔ)器操作數(shù)用于存放復(fù)雜的數(shù)據(jù)結(jié)構(gòu) (如數(shù)組和結(jié)構(gòu))編址方式: 按字節(jié)編址,一個(gè)字占4個(gè)字節(jié)。通過(guò)數(shù)據(jù)傳送指令實(shí)現(xiàn)存儲(chǔ)器和寄存器之間數(shù)據(jù)的傳送。 -取數(shù)(load)指令:lw -存數(shù)(store)指令:sw,2.2.2 MIPS的

27、操作數(shù),例1:使用取/存數(shù)指令進(jìn)行編譯C code: A[12] = h + A[8] ; // A is an array of 100 words ( Assume: h ---- $s2 base address of A ---- $s3 ) MIPS code: lw $t0 , 32($s3) # temporary reg $

28、t0 gets A[8] add $t0, $s2, $t0 # temporary reg $t0 gets h + A[8] sw $t0, 48($s3) # stores h + A[8] back into A[12],2.2.2 MIPS的操作數(shù),討論:如何編譯?,g = h + A[i],( Assume: g, h, i -- $s1, $s

29、2, $s4 base address of A -- $s3 ),2.2.2 MIPS的操作數(shù),例2:Compiling using a variable array indexC code: g = h + A[i] ; // A is an array of 100 words( Assume: g, h, i -- $s1, $s2, $s4 base address of A -- $s3 )

30、MIPS code: add $t1, $s4, $s4 # temp reg $t1 = 2 * i add $t1, $t1, $t1 # temp reg $t1 = 4 * i add $t1, $t1, $s3 # $t1 = address of A[i] (4 * i + $s3) lw $t0 , 0($t1)

31、 # temp reg $t0 = A[i] add $s1, $s2, $t0 # g = h + A[i],2.2.2 MIPS的操作數(shù),寄存器溢出(spilling)將不常使用的變量(或稍后才使用的變量)存回到存儲(chǔ)器中的過(guò)程。實(shí)現(xiàn):使用取數(shù)/存數(shù)指令,2.2.2 MIPS的操作數(shù),三. 常數(shù)或立即數(shù)操作數(shù)程序中經(jīng)常會(huì)在某個(gè)操作中使用到常數(shù),如:將數(shù)組的下標(biāo)加1,用以指向下一個(gè)數(shù)組元

32、素。例:使寄存器$s3的內(nèi)容加4 。 - 方法一 常數(shù)被事先存放在存儲(chǔ)器中。 假設(shè) AddrConstants4 是常數(shù)4 在內(nèi)存中相對(duì)于$ s1的偏移地址。lw $t0, AddrConstant4($s1) # $t0=constant 4add $s3, $s3, $t0 #$s3=$s3+$t0($t0==4),2.2.2 MIPS的操作數(shù),- 方法二 在算術(shù)指令中直接

33、提供一個(gè)常數(shù)。 addi $s3, $s3, 4#$s3= $s3+ 4 優(yōu)點(diǎn):速度快,能耗低,小結(jié),MIPS operands,MIPS assembly language,2.2.3 MIPS指令的表示,計(jì)算機(jī)中所有的信息都表示成二進(jìn)制位串。 寄存器對(duì)應(yīng)的數(shù)(編號(hào))$s0 ~ $s7 對(duì)應(yīng)16 ~ 23$t0 ~ $t7 對(duì)應(yīng) 8 ~ 15 例:將以下MIPS語(yǔ)言指令翻譯成機(jī)器指令 MIPS code

34、 add $t0, $s1, $s2 Decimal version of machine code | 0 | 17 | 18 | 8 | 0 | 32 | Binary version of machine code | 000000 | 10001 | 10010 |

35、 01000 | 00000 | 100000 | 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits,一. MIPS指令格式,op:指令的基本操作,通常稱為操作碼rs: 第一個(gè)源操作數(shù)寄存器rt: 第二個(gè)源操作數(shù)寄存器rd: 用于存放操作結(jié)果的目的寄存器shamt: 位移量funct: 功能。一般稱為功能碼,用于指明op

36、字段中操作的特定變式。,Region: ±215,指令長(zhǎng)度相同,都為32位。,,2.2.3 MIPS指令的表示,例:Translating assembly into machine instruction C code: A[300] = h + A[300] ; ( Assume: h ---- $s2 base address of A ---- $t1 )MIPS as

37、sembly code:lw $t0, 1200($t1) # temporary reg $t0 gets A[300]add $t0, $s2, $t0 # temporary reg $t0 gets h + A[300]sw $t0, 1200($t1) # stores h + A[300] back into A[300]MIPS machine language

38、 code:Decimal version : address/ op rs rt rd shamt funct | 35 | 9 |

39、 8 | 1200 | | 0 | 18 | 8 | 8 | 0 | 32 | | 43 | 9 | 8 |

40、 1200 |,寄存器對(duì)應(yīng)的數(shù)(編號(hào))$s0 ~ $s7 對(duì)應(yīng)16 ~ 23$t0 ~ $t7 對(duì)應(yīng) 8 ~ 15,2.2.3 MIPS指令的表示,MIPS machine language code:Decimal version : address/

41、 op rs rt rd shamt funct | 35 | 9 | 8 | 1200 | | 0

42、 | 18 | 8 | 8 | 0 | 32 | | 43 | 9 | 8 | 1200 |Binary version | 100011

43、 | 01001 | 01000 | 0000 0100 1011 0000 | | 000000 | 10010 | 01000 | 01000 | 00000 | 100000 | | 101011 | 01001 | 01000 | 0000 0100 1011 0000 |

44、 注意:第一條和最后一條指令唯一的不同僅在于操作碼!各指令的op碼和funct碼的值請(qǐng)參看附錄A :p419-p434,2.2.3 MIPS指令的表示,二.兩個(gè)重要準(zhǔn)則:指令用數(shù)的形式表示。和數(shù)據(jù)一樣,程序存儲(chǔ)在存儲(chǔ)器中,并且可以讀寫(xiě)。,2.2.4 邏輯操作,C、Java和MIPS中的邏輯操作,2.2.4 邏輯操作,一. 移位(shift)1. 邏輯左移(sll):將一個(gè)字里面的所有位向左移動(dòng),并在空出來(lái)的位上填充0

45、。左移i位相當(dāng)于乘以 2i2. 邏輯右移(srl):將一個(gè)字里面的所有位向右移動(dòng),并在空出來(lái)的位上填充0。右移i位相當(dāng)于除以 2i,,2.2.4 邏輯操作,3. 指令格式 [R型]例: sll $t2, $s0, 4#reg $t2=reg $s0<<4 bit對(duì)應(yīng)的機(jī)器語(yǔ)言:,,在移位指令中表示位移量,寄存器對(duì)應(yīng)的數(shù)(編號(hào))$s0 ~ $s7 對(duì)應(yīng)16 ~ 23$t0 ~ $t7 對(duì)應(yīng) 8 ~ 15,2

46、.2.4 邏輯操作,二. 按位與(AND) 按位進(jìn)行與操作,僅當(dāng)兩個(gè)操作位均為1時(shí)結(jié)果才為1。例:$t2:0000 0000 0000 0000 0000 1101 0000 0000 $t1:0000 0000 0000 0000 0011 1100 0000 0000 and $t0, $t1, $t2#reg $t0 = reg $t1 & reg $t2Result:0000 0000

47、 0000 0000 0000 1100 0000 0000,2.2.4 邏輯操作,三. 按位或(OR) 按位進(jìn)行或操作,當(dāng)兩個(gè)操作位中任意一位為1時(shí)結(jié)果就為1。例:$t2: 0000 0000 0000 0000 0000 1101 0000 0000 $t1: 0000 0000 0000 0000 0011 1100 0000 0000 or $t0, $t1, $t2#reg $t0=r

48、eg $t1 | reg $t2Result: 0000 0000 0000 0000 0011 1101 0000 0000,2.2.4 邏輯操作,四. 按位取反(NOT)僅有一位操作數(shù),將1變成0,0變成1。MIPS中用或非(NOR)指令取代NOT。 - A NOR 0 =NOT(A OR 0)=NOT(A) - 保持三操作數(shù)格式例:$t1: 0000 0000 0000 00

49、00 0011 1100 0000 0000 $t3: 0000 0000 0000 0000 0000 0000 0000 0000 nor $t0, $t1, $t3#reg $t0=~(reg $t1 | reg $t3)Result: 1111 1111 1111 1111 1100 0011 1111 1111,2.2.4 邏輯操作,五. 立即數(shù)與(andi)和立即數(shù)或(ori)指令

50、 指令格式:I型,2.2.5 決策指令,分支指令 [I型] beq register1, register2, L1 相等則分支 bne register1, register2, L1 不相等則分支 例1:將以下if 語(yǔ)句編譯成條件分支指令 C code: if ( i = = j ) goto L1 ; f =

51、 g + h ; L1: f = f - i ; ( Assume: f ~ j ---- $s0 ~ $s4 ) MIPS assembly code: beq $s3, $s4, L1 # go to L1 if i equals j add $s0, $s1, $s2 # f =

52、g + h ( skipped if i equals j ) L1: sub $s0, $s0, $s3 # f = f - i ( always executed ),2.2.5 決策指令,例2:將以下if-then-else 語(yǔ)句編譯成條件分支指令 ( Assume: f ~ j ---- $s0 ~ $s4 )C code: if ( i

53、 = = j ) f = g + h ; else f = g - h ; MIPS assembly code: bne $s3, $s4, Else # go to Else if i ≠ j add $s0, $s1, $s2 # f = g + h ( Executed if i = = j if) j

54、 Exit # go to Exit Else: sub $s0, $s1, $s2 # f = g - h ( Executed if i ≠ j  else) Exit: # the first instruction of the next C …

55、… statement,2.2.5 決策指令,一. While 循環(huán)語(yǔ)句例:編譯以下 while 循環(huán)語(yǔ)句 ( Assume: i ~ k---- $s3 ~ $s5 base of save ---- $s6 ) C code: while ( save[i] = = k ) i = i + j ; MIPS assembly cod

56、e: Loop: add $t1, $s3, $s3 # temp reg $t1 = 2 * i add $t1, $t1, $t1 # temp reg $t1 = 4 * i add $t1, $t1, $s6 # $t1 =

57、address of save[i] lw $t0, 0($t1) # temp reg $t0 = save[i] bne $t0, $s5, Exit # go to Exit if save[i] != k add $s3, $s3,

58、$s4 # i = i + j j Loop # go to Loop Exit:,2.2.5 決策指令,小于則置位指令(slt)[R型] 如果第一個(gè)寄存器小于第二個(gè)寄存器,則將第三個(gè)寄存器設(shè)置為1,否則設(shè)置為0。如:slt $t0, $s3, $s4 # $t0=1 if $

59、s3 < $s4 立即數(shù)版小于則置位指令(slti)[I型] 如:slti $t0, $s2, 10 # $t0=1 if $s2 < 10無(wú)符號(hào)整數(shù)版小于則置位指令(sltu) 如:sltu $t0, $s3, $s4 # $t0=1 if $s3 < $s4,2.2.5 決策指令,例:有符號(hào)比較和無(wú)符號(hào)比較假設(shè): $s0:1111 1111 11

60、11 1111 1111 1111 1111 11112 $s1:0000 0000 0000 0000 0000 0000 0000 00002執(zhí)行以下兩條指令后,求寄存器$t0和$t1 中的值。 slt $t0, $s0, $s1 sltu $t1, $s0, $s1 答案: $t0:1 $t1:0,2.2.5 決策指令,二. case/sw

61、itch語(yǔ)句用于根據(jù)某個(gè)變量的值選擇不同分支之一。實(shí)現(xiàn)方法:將多個(gè)指令序列分支的地址編碼為一張表(轉(zhuǎn)移地址表或轉(zhuǎn)移表),程序只需索引該表即可跳轉(zhuǎn)到恰當(dāng)?shù)闹噶钚蛄小?2.2.5 決策指令,寄存器跳轉(zhuǎn)指令[R型]jr $r 轉(zhuǎn)移地址表,,$t4,,,,$r←($t4+4*K),,,2.2.5 決策指令,例:使用轉(zhuǎn)移地址表(jump address table)編譯switch語(yǔ)句 ( Assume: f ~ k --

62、-- $s0 ~ $s5 $t2 contains 4 ) C code: switch ( k ) { case 0 : f = i + j ; break ; /* k = 0 */ case 1 : f = g + h ; break ; /* k =

63、 1 */ case 2 : f = g - h ; break ; /* k = 2 */ case 3 : f = i - j ; break ; /* k = 3 */ },L0: add $s0, $s3, $s4

64、 # k = 0 so f gets i + j j Exit # end of this case so go to Exit L1: add $s0, $s1, $s2 # k = 1 so f gets g + h j Exit

65、 # end of this case so go to Exit L2: sub $s0, $s1, $s2 # k = 2 so f gets g - h j Exit # end of this case so go to Exit L3: sub $s0, $s3, $s4 # k

66、 = 3 so f gets i - j Exit: # end of switch statement,MIPS assembly code: slt $t3, $s5, $zero # test if k = 4, go to Exit add

67、 $t1, $s5, $s5 # temp reg $t1 = 2 * k (0<=k<=3) add $t1, $t1, $t1 # temp reg $t1 = 4 * k add $t1, $t1, $t4 # $t1 = address of Ju

68、mpTable[k] lw $t0, 0($t1) # temp reg $t0 = JumpTable[k] jr $t0 # jump based on register $t0,jump address table $t1= $t4+4 * k:,L0

69、:addressL1:addressL2: addressL3:address,,,,,2.2.5 決策指令,一個(gè)重要概念:基本塊:沒(méi)有分支(可能出現(xiàn)在末尾者除外)并且沒(méi)有分支目標(biāo)/分支標(biāo)簽(可能出現(xiàn)在開(kāi)始者除外)的指令序列。 順序執(zhí)行的語(yǔ)句序列,其中只有一個(gè)入口和一個(gè)出口 -只有一個(gè)入口,表示程序中不會(huì)有其它任何地方能通過(guò)分支指令進(jìn)入到此基本塊中。 -只有一個(gè)出口,表示程序只有最后一條指令能導(dǎo)致進(jìn)入到其

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論