如果將自己限制為僅16條指令,那么應(yīng)該選擇哪一條,以及如何在不掉隊(duì)的情況下進(jìn)行管理?
在我從頭開(kāi)始構(gòu)建4位HRRG(Heath Robinson,Rube Goldberg)計(jì)算機(jī)的項(xiàng)目的一篇專欄中,我們介紹了CPU寄存器和指令集。您可能還記得,由于我們只有4位數(shù)據(jù)總線(以及12位地址總線),因此我們選擇了只有2 ^ 4 = 16條指令以及2 ^ 4 = 16個(gè)CPU寄存器。
HRRG的CPU寄存器和指令。(來(lái)源:馬克斯·麥克菲爾德(Max Maxfield)
為了確保我們都敲打同一鼓音,讓我們提醒自己,六個(gè)通用寄存器R0至R5用于存儲(chǔ)數(shù)據(jù)值并“累加”任何算術(shù)或邏輯運(yùn)算的結(jié)果。狀態(tài)寄存器S0和S1主要用于存儲(chǔ)任何算術(shù)或邏輯運(yùn)算的狀態(tài)結(jié)果,例如,相減的結(jié)果是否為零。
程序計(jì)數(shù)器(PC)用于跟蹤C(jī)PU在程序中的當(dāng)前位置。堆棧指針(SP)用于跟蹤堆棧的頂部。索引寄存器(IX)主要用于保存計(jì)數(shù)值或用于訪問(wèn)內(nèi)存的偏移量。中斷向量(IV)用于保存稱為中斷服務(wù)路由(ISR)的特殊子程序類型的內(nèi)存地址。
引入堆棧指針
我們將考慮所有這些小寄存器流氓如何在以后的專欄中詳細(xì)介紹它們的魔力,但是如果萬(wàn)一這對(duì)您來(lái)說(shuō)是新手,則簡(jiǎn)要描述一下SP的操作可能是一個(gè)好主意。
我們大多數(shù)人都去過(guò)自助餐廳,在該餐廳中,一堆餐盤(pán)堆疊在基于彈簧的機(jī)構(gòu)上。假設(shè)您是負(fù)責(zé)將印版裝入機(jī)械裝置的人。我們還假設(shè)板編號(hào)為(1、2、3…),并且是一名強(qiáng)迫癥工程師,這是將前三個(gè)板裝入機(jī)械裝置的順序,如下所示:
基于Spring的自助餐廳板塊存儲(chǔ)機(jī)制(來(lái)源:Max Maxfield)
現(xiàn)在,假設(shè)有一個(gè)顧客進(jìn)來(lái),伸手去拿盤(pán)子。當(dāng)然,它們將檢索您添加到堆棧頂部的最后一塊盤(pán)子(在我們的示例中為3)。在計(jì)算方面,這種形式的存儲(chǔ)和檢索將被歸類為后進(jìn)先出(LIFO)過(guò)程。
好吧,我們的SP的工作方式與此類似。在程序開(kāi)始時(shí),我們將使用內(nèi)存中某個(gè)區(qū)域的某個(gè)位置的地址加載SP,而該內(nèi)存將不會(huì)用于其他任何用途。隨后,每次執(zhí)行PUSH操作時(shí),CPU會(huì)將指定的數(shù)據(jù)寫(xiě)入SP當(dāng)前指向的存儲(chǔ)位置(“堆棧頂部”),然后遞增SP使其指向下一個(gè)空閑位置。相比之下,每次執(zhí)行POP操作時(shí),CPU都會(huì)先將SP遞減以指向堆棧頂部的數(shù)據(jù),然后從堆棧中讀取該數(shù)據(jù)并將其存儲(chǔ)在我們告訴它的任何位置。
引入6502
出于以下討論的目的,我們將使用MOS技術(shù)6502提供比較的基礎(chǔ)。6502于1975年推出,具有8位數(shù)據(jù)總線和16位地址總線,其寄存器包括一個(gè)8位累加器寄存器(A),兩個(gè)8位索引寄存器(X和Y),一個(gè)7位寄存器。位處理器狀態(tài)標(biāo)志寄存器(P),8位堆棧指針(S)和16位程序計(jì)數(shù)器(PC)。
與HRRG不同,在HRRG中,我們可以用所需的任何值加載12位SP,而6502的8位SP在加電時(shí)會(huì)自動(dòng)加載$ 00(請(qǐng)記住,我們使用“ $”字符表示十六進(jìn)制值),堆棧的起始地址固定為$ 0100。這意味著6502的堆棧地址空間被限制為跨越256個(gè)地址,從$ 0100到$ 01FF。
盡管與今天的微處理器產(chǎn)品相比,6502看起來(lái)很簡(jiǎn)單,但是在推出之初它就被認(rèn)為是非常了不起的,尤其是它的價(jià)格合理(1975年為25美元)。許多人繼續(xù)基于此處理器創(chuàng)建令人驚嘆的項(xiàng)目,例如此基于6502的虛擬現(xiàn)實(shí)(VR)系統(tǒng)。并且6502的新形式不斷出現(xiàn)在現(xiàn)場(chǎng),例如MOnSter 6502 CPU。
此外,與HRRG不同,在HRRG中,我們可以向12位中斷向量(IV)加載所需的任何值,而6502則硬接線以在內(nèi)存地址$ FFFE和$ FFFF中查找以檢索其16位中斷向量,其中這個(gè)2字節(jié)的值將由用戶加載到內(nèi)存中(當(dāng)我們說(shuō)“由用戶”時(shí),我們的意思是“由用戶程序”)。
在2 ^ 8 = 256種可能的操作碼(指令)中,原始6502使用151將其組織為56條指令(取決于指令),一種或多種尋址模式。根據(jù)指令和尋址方式的不同,6502操作碼可能需要零個(gè),一個(gè)或兩個(gè)字節(jié)作為操作數(shù)。因此6502機(jī)器指令的長(zhǎng)度從1到3個(gè)字節(jié)不等。
MOV(加載和存儲(chǔ))
6502允許用戶將值從存儲(chǔ)器加載到其累加器(A)和其索引寄存器(X和Y)中。同樣,它允許用戶將這些寄存器中的值存儲(chǔ)到內(nèi)存中。所有這些都需要六個(gè)指令,如下所示:
LDA(加載累加器)
LDX(加載X寄存器)
LDY(加載Y寄存器)
STA(存儲(chǔ)累加器)
STX(存儲(chǔ)X寄存器)
STY(存儲(chǔ)Y寄存器)
相比之下,HRRG具有單個(gè)MOV指令,根據(jù)其操作數(shù),該指令可用于從寄存器到寄存器,寄存器到內(nèi)存,內(nèi)存到寄存器以及內(nèi)存到內(nèi)存中移動(dòng)(復(fù)制)數(shù)據(jù)。此外,這些說(shuō)明適用于HRRG的所有寄存器(即使這樣做沒(méi)有任何意義,請(qǐng)參見(jiàn)下文)。
INC(遞增)和DEC(遞減)
6502允許用戶在指定的存儲(chǔ)位置或其索引寄存器(X和Y)中對(duì)值進(jìn)行遞增(加1)和遞減(從中減去1)。為此,它需要執(zhí)行以下六個(gè)指令:
INC(增加存儲(chǔ)單元的內(nèi)容)
INX(增加X(jué)寄存器的內(nèi)容)
INY(增加Y寄存器的內(nèi)容)
DEC(減少存儲(chǔ)單元的內(nèi)容)
DEX(減少X寄存器的內(nèi)容)
DEY(遞減Y寄存器的內(nèi)容)
“如何增加或減少累加器的內(nèi)容?”我聽(tīng)到你哭了。好吧,為了用6502做到這一點(diǎn),您將必須執(zhí)行常規(guī)的加法或減法運(yùn)算,如本專欄的稍后部分所述。
相比之下,HRRG的INC和DEC指令可用于增加內(nèi)存位置以及CPU的4位和12位寄存器中任何一個(gè)的內(nèi)容。
“什么?任何寄存器-甚至程序計(jì)數(shù)器?”我聽(tīng)到你緊張地尖叫。是的,即使似乎沒(méi)有必要,您也可以在任何寄存器上使用這些指令。例如,增加程序計(jì)數(shù)器(PC)通常被認(rèn)為是一件壞事,但是HRRG允許在機(jī)器代碼和底層硬件中這樣做。
我們可能會(huì)在匯編器中標(biāo)記某些“傻瓜”(我們將在以后的專欄中討論),但是如果用戶決定忽略并繞過(guò)匯編器發(fā)出的任何警告和/或錯(cuò)誤消息,那么就這樣吧,因?yàn)椋╝)在沒(méi)有大量異常和特殊情況的情況下,更易于設(shè)計(jì)可工作的硬件,(b)用戶可能會(huì)想到我們沒(méi)有想到的狡猾的使用模型,并且(c)我們不是“明智的警察”(除了還有其他事情,我沒(méi)有合適的褲子)。
ADDC和SUBB(加減法)
在簡(jiǎn)單計(jì)算機(jī)上考慮加法時(shí),通常會(huì)考慮將兩個(gè)數(shù)字加起來(lái),例如3 + 2 =5。問(wèn)題是我們可以表示的數(shù)字大小為受我們的數(shù)據(jù)總線和數(shù)據(jù)字段的寬度限制。例如,在HRRG的情況下,可以使用單個(gè)4位半字節(jié)表示0到15范圍內(nèi)的無(wú)符號(hào)數(shù)或-8到+7范圍內(nèi)的有符號(hào)數(shù)。
這顯然是一個(gè)限制。幸運(yùn)的是,我們可以使用多個(gè)半字節(jié)來(lái)表示我們的值。例如,在HRRG的情況下,可以使用一對(duì)4位半字節(jié)來(lái)表示0到255范圍內(nèi)的無(wú)符號(hào)數(shù)或-128到+127范圍內(nèi)的有符號(hào)數(shù)。
假設(shè)我們想將兩個(gè)2點(diǎn)值加在一起。在這種情況下,我們將從添加兩個(gè)最低有效的半字節(jié)(LSN)開(kāi)始。根據(jù)它們的值,這將導(dǎo)致將0或1值存儲(chǔ)在進(jìn)位(C)狀態(tài)標(biāo)志中。當(dāng)我們添加下一個(gè)對(duì)點(diǎn)時(shí),我們還需要包括(添加)進(jìn)位標(biāo)志的內(nèi)容。
一些早期的8位處理器提供了兩條加法指令,例如ADD(“無(wú)進(jìn)位加法”)和ADDC(“有進(jìn)位加法”)。其他用戶(例如6502)僅提供“帶進(jìn)位加法”版本,并且要由用戶來(lái)實(shí)現(xiàn)“無(wú)帶進(jìn)位加法”,方法是先將0的進(jìn)位標(biāo)志裝入然后執(zhí)行加法。
同樣的事情也適用于減法。在這種情況下,某些早期的8位處理器提供了兩條減法指令,例如SUB(“無(wú)借位減法”)和SUBB(“無(wú)借位減法”)。諸如6502之類的其他軟件僅提供“帶借位減法”版本,并且要由用戶來(lái)實(shí)現(xiàn)“無(wú)帶借物減法”,方法是先將進(jìn)位標(biāo)志裝入1,然后執(zhí)行減法。
“等等,我們沒(méi)有借用狀態(tài)標(biāo)志,”我聽(tīng)到你在抱怨。沒(méi)錯(cuò),但是在減法的情況下,進(jìn)位(C)標(biāo)志承擔(dān)借位(B)標(biāo)志的作用。基于唯一的物理標(biāo)志是進(jìn)位標(biāo)志,一些設(shè)計(jì)人員傾向于說(shuō)“減去/不攜帶進(jìn)位”,并使用諸如SUBC助記符之類的東西,但是,在我看來(lái),這最終導(dǎo)致了更多的混亂,而不是值得的。
最重要的是6502提供了以下兩個(gè)說(shuō)明:
ADC(帶進(jìn)位加)
SBC(帶進(jìn)位減)
此外,這些指令僅允許您將指定存儲(chǔ)位置的內(nèi)容添加/累加到累加器的內(nèi)容中,結(jié)果存儲(chǔ)在累加器中。
同樣,HRRH提供以下兩個(gè)說(shuō)明:
ADDC(帶進(jìn)位加)
SUBB(帶借位減)
但是,這些指令允許執(zhí)行寄存器到寄存器,寄存器到內(nèi)存,內(nèi)存到寄存器以及內(nèi)存到內(nèi)存的加法和減法。(在我的下一篇專欄中,我們將考慮使用ADDC和SUBB指令來(lái)實(shí)現(xiàn)其ADD和SUB對(duì)應(yīng)項(xiàng)的各種方式。)
ROLC和RORC(旋轉(zhuǎn)和移位)
可能有八個(gè)基本的旋轉(zhuǎn)和移位操作,我們可以為其分配助記符,如下所示:
ROL(向左旋轉(zhuǎn))
ROR(向右旋轉(zhuǎn))
ROLC(通過(guò)進(jìn)位標(biāo)志向左旋轉(zhuǎn))
RORC(通過(guò)進(jìn)位標(biāo)志向右旋轉(zhuǎn))
LSHL(邏輯左移)
ASHL(算術(shù)左移)
LSHR(邏輯右移)
ASHR(算術(shù)右移)正確的)
請(qǐng)記住,不同的CPUS的設(shè)計(jì)人員對(duì)這種事情使用各種不同的助記符。我上面顯示的那些對(duì)我來(lái)說(shuō)最有意義。現(xiàn)在,如果我們決定(但沒(méi)有決定)在我們的4位HRRG中實(shí)現(xiàn)所有這8條指令,則其動(dòng)作的圖形表示如下所示:
各種可能的移位和旋轉(zhuǎn)操作的動(dòng)作(來(lái)源:Max Maxfield)
對(duì)于ROL(向左旋轉(zhuǎn)),所有位都向左移動(dòng)一位;同樣,從概念上講“掉落到末端”的最高有效位(MSB)被復(fù)制到最低有效位(LSB)和進(jìn)位標(biāo)志。相比之下,在ROR(向左旋轉(zhuǎn))的情況下,所有位都向右移一位;同樣,從概念上講“從末端掉下來(lái)”的LSB也被復(fù)制到MSB和進(jìn)位標(biāo)志中。
除了將進(jìn)位標(biāo)志的原始內(nèi)容復(fù)制到LSB之外,ROLC(通過(guò)進(jìn)位向左旋轉(zhuǎn))與ROL非常相似。同樣,除了進(jìn)位標(biāo)志的原始內(nèi)容被復(fù)制到MSB中外,RORC(從進(jìn)位向右旋轉(zhuǎn))與ROR非常相似。
LSHL(邏輯左移)操作與ROL(左旋轉(zhuǎn))和ROLC(左移通過(guò)貓)操作非常相似,不同之處在于將0復(fù)制到LSB中。同樣,LSHR(邏輯右移)操作與ROR(右移)和RORC(右移進(jìn)位)操作非常相似,不同之處在于將0復(fù)制到了MSB中。
ASHL(算術(shù)左移)操作在功能上與LSHL(邏輯左移)相同-兩者均導(dǎo)致將0復(fù)制到LSB中-因此,沒(méi)有設(shè)計(jì)者會(huì)費(fèi)心將它們作為單獨(dú)的指令在CPU中實(shí)現(xiàn)。另一方面,在編寫(xiě)程序時(shí),我們可能更喜歡使用兩種不同的助記符作為注釋形式,以提醒自己(和其他讀者)我們?cè)诓东@代碼時(shí)的想法。
最后,ASHR(算術(shù)右移)與LSHR(邏輯右移)類似,不同之處在于MSB(符號(hào)位)被自身復(fù)制回去(另請(qǐng)參見(jiàn)“C / C ++>移位運(yùn)算符的工作方式”)。
對(duì)于HRRG(僅限16條指令),我們決定只實(shí)施八個(gè)基本旋轉(zhuǎn)和移位中的兩個(gè):
ROLC(通過(guò)進(jìn)位標(biāo)志向左旋轉(zhuǎn))
RORC(通過(guò)進(jìn)位標(biāo)志向右旋轉(zhuǎn))
我們選擇這兩項(xiàng)的原因是,很容易將它們用作實(shí)現(xiàn)其他指令功能的基礎(chǔ)。(在下一篇專欄中,我們將考慮使用ROLC和RORC指令來(lái)實(shí)現(xiàn)其ROL,ROR,LSHL,LSHR,ASHR和ASHR對(duì)應(yīng)項(xiàng)的各種方式。)
AND,OR,XOR和CMP(邏輯運(yùn)算)
這些指令的工作方式與該星球上幾乎所有其他處理器上的指令工作方式相似,因此我們?cè)谶@里不會(huì)花太多時(shí)間。只需說(shuō)6502的AND(邏輯與),EOR(異或)和ORA(異或)僅允許您對(duì)累加器的內(nèi)容執(zhí)行操作,并在內(nèi)存中保存另一個(gè)值,并將結(jié)果存儲(chǔ)在蓄能器。相比之下,HRRG的AND,OR和XOR等效項(xiàng)支持寄存器到寄存器,寄存器到內(nèi)存以及內(nèi)存到寄存器操作。
對(duì)于HRRG的CMP(比較指令),它也支持寄存器到寄存器,寄存器到內(nèi)存,內(nèi)存到寄存器和內(nèi)存到內(nèi)存操作,將比較的兩個(gè)值視為是無(wú)符號(hào)的二進(jìn)制值。
CLR和SET(位操作)
一些處理器提供了一組指令,可用于清除或設(shè)置狀態(tài)寄存器中的各個(gè)位。例如,6502支持七種這樣的指令:
CLC(清除進(jìn)位標(biāo)志)
CLD(清除十進(jìn)制模式標(biāo)志)
CLI(清除中斷禁止標(biāo)志)
CLV(清除溢出標(biāo)志)
SEC(設(shè)置進(jìn)位標(biāo)志)
SED(設(shè)置十進(jìn)制模式標(biāo)志)
SET(設(shè)置中斷禁止標(biāo)志)
HRRG沒(méi)有提供任何這些說(shuō)明,但是如果提供了這些說(shuō)明,它們的經(jīng)濟(jì)學(xué)原理將如下所示(正如我們所看到的,這是我瘋狂的原因):
CLRN(清除負(fù)標(biāo)志)
CLRZ(清除零標(biāo)志)
CLRC(清除進(jìn)位標(biāo)志)
CLRO(清除溢出標(biāo)志)
CLRI(清除中斷屏蔽標(biāo)志)
SETN(設(shè)置負(fù)標(biāo)志)
SETZ(設(shè)置零標(biāo)志)
SETC(設(shè)置進(jìn)位標(biāo)志)
SETO(設(shè)置溢出標(biāo)志)
SETI(設(shè)置中斷屏蔽標(biāo)志)
SETH(設(shè)置停止標(biāo)志)
觀察到?jīng)]有CLRH(清除暫停標(biāo)志)。這是因?yàn)橐坏和?biāo)志設(shè)置為1,重置它的唯一方法就是觸發(fā)一個(gè)中斷(假設(shè)中斷屏蔽標(biāo)志設(shè)置為1)或重置機(jī)器。
關(guān)鍵是我們可以使用AND和OR邏輯運(yùn)算來(lái)實(shí)現(xiàn)所有這些指令。假設(shè)我們想將進(jìn)位標(biāo)志(狀態(tài)寄存器S0中的位2)清除為0,我們可以通過(guò)將S1的內(nèi)容與%1011進(jìn)行“與”操作(請(qǐng)記住,我們使用'%'字符來(lái)表示二進(jìn)制值)來(lái)實(shí)現(xiàn)。同樣,如果要將進(jìn)位標(biāo)志設(shè)置為1,可以通過(guò)將狀態(tài)寄存器S0的內(nèi)容與%0100進(jìn)行邏輯或運(yùn)算來(lái)實(shí)現(xiàn)。
綜上所述,在編寫(xiě)匯編代碼時(shí)最好有位操作指令對(duì)我們可用,因此我們將在下一節(jié)中討論如何使用匯編器將它們添加到庫(kù)中。
推入和彈出(或拉出)
這些指令用于將值壓入堆棧并再次彈出(或拉出)它們。在6502的情況下,有6條與堆棧相關(guān)的指令(請(qǐng)記住,正如我們前面所討論的),6502的8位堆棧指針本身在上電時(shí)會(huì)自動(dòng)加載$ 00。
TSX(將堆棧指針的值傳輸?shù)剿饕拇嫫鱔)
TXS(將索引寄存器X的內(nèi)容傳輸?shù)蕉褩V羔槪?/p>
PHA(將累加器的內(nèi)容推送到堆棧)
PHP(將處理器狀態(tài)寄存器的內(nèi)容推送到棧上)
PLA(將棧頂上的值拉到累加器中)
PLP(將棧頂上的值拉到處理器狀態(tài)寄存器中)
對(duì)于HRRG,我們只有兩個(gè)說(shuō)明:
PUSH(將所選寄存器或存儲(chǔ)器位置的內(nèi)容推入堆棧)
POP(將堆棧頂部的值彈出到所選寄存器或存儲(chǔ)器位置)
HRRG的指令可用于任何CPU的寄存器或存儲(chǔ)器位置。此外,HRRG的MOV指令提供(并超過(guò)了)6502的TSX和TXS指令的功能。
JMP,JSR和相關(guān)指令
JMP(無(wú)條件跳轉(zhuǎn))指令允許CPU跳轉(zhuǎn)到程序的另一部分。JSR指令告訴CPU跳轉(zhuǎn)到子例程。JSR通常的工作方式是用戶將所有相關(guān)信息壓入堆棧,然后調(diào)用JSR。反過(guò)來(lái),CPU將程序計(jì)數(shù)器(PC)中的返回地址壓入堆棧,然后跳轉(zhuǎn)到子例程。
仍在談?wù)撨@通常的工作方式,在子例程的末尾,使用RTS(從子例程返回)指令將返回地址從堆棧頂部彈出到程序計(jì)數(shù)器(PC)中,然后將我們返回主程序。程序。
還值得注意的是,中斷服務(wù)程序(ISR)的作用有點(diǎn)類似于子程序,因?yàn)樵撝袛鄬?dǎo)致CPU在服務(wù)該中斷之前將返回地址推入堆棧的頂部。在ISR的末尾,使用RTI(中斷返回)指令將返回地址彈出堆棧頂部,然后將我們返回主程序。
6502擁有以下所有四個(gè)說(shuō)明:
JMP(無(wú)條件跳轉(zhuǎn))
JSR(跳轉(zhuǎn)到子程序)
RTS(從子程序返回)
RTI(從中斷返回)
處理器還將支持一堆指令,這些指令將根據(jù)狀態(tài)標(biāo)志的狀態(tài)觸發(fā)跳轉(zhuǎn)(或分支)。例如6502提供了八種這樣的指令,如下所示:
BCC(科若進(jìn)位標(biāo)志清除)
BCS(科若進(jìn)位標(biāo)志組)
BEQ(如果科零標(biāo)志集)
BMI(分公司如果負(fù)數(shù)標(biāo)記組)
BNE(分公司如果零標(biāo)志清除)
BPL(分公司如果負(fù)數(shù)標(biāo)記清除)
BVC(
BVS(如果設(shè)置了溢出標(biāo)志則分支)(如果設(shè)置了溢出標(biāo)志則分支)
與6502的JMP和JSR指令允許CPU在其16位地址空間內(nèi)跳轉(zhuǎn)到任何地方不同,這些分支指令使用帶符號(hào)的8位相對(duì)地址將控制權(quán)轉(zhuǎn)移到位于前127個(gè)字節(jié)(后)和128個(gè)字節(jié)內(nèi)的目標(biāo)。分支指令后(之前)的字節(jié)數(shù)。程序往往會(huì)進(jìn)行很多跳轉(zhuǎn),例如循環(huán)循環(huán),因此在時(shí)鐘有限的日子里,使用1字節(jié)的分支地址而不是2字節(jié)的跳轉(zhuǎn)地址可能會(huì)節(jié)省大量的時(shí)間和空間。速度,處理器周期和內(nèi)存位置。
對(duì)于HRRG,我們只有兩個(gè)與跳轉(zhuǎn)有關(guān)的指令:
JMP(無(wú)條件跳轉(zhuǎn))
JSR(跳轉(zhuǎn)到子例程)
我們沒(méi)有RTS或RTI指令-通過(guò)簡(jiǎn)單地從棧頂檢索返回地址并將其使用POP指令加載到程序計(jì)數(shù)器(PC)中,可以達(dá)到相同的效果。
事實(shí)是,實(shí)現(xiàn)JMP指令的方式意味著我們可以使用它來(lái)實(shí)現(xiàn)與具有以下指令集相同的效果:
JMP(無(wú)條件跳轉(zhuǎn))
JMPN(無(wú)條件跳轉(zhuǎn),或“從不跳轉(zhuǎn)”)*
JPN(如果為負(fù),則跳轉(zhuǎn);如果N標(biāo)志為1)
JPNN(如果為非負(fù),則跳轉(zhuǎn);如果N標(biāo)志為0),
JPZ(如果為零,則跳轉(zhuǎn);如果Z標(biāo)志為1)
JPNZ(如果不為零則跳躍;如果Z標(biāo)志為0)
JPC(如果進(jìn)位則跳躍;如果C標(biāo)志為1)
JPNC(如果不進(jìn)位則跳躍;如果C標(biāo)志為0)
JPO(如果溢出則跳躍;如果O標(biāo)志為1)
JPNO(如果不溢出則跳轉(zhuǎn);如果O標(biāo)志為0)
JPI(如果中斷屏蔽則跳轉(zhuǎn);如果I標(biāo)志為1)**
JPNI(如果沒(méi)有中斷屏蔽則跳轉(zhuǎn);如果I標(biāo)志為0)**
JPH(如果暫停則跳轉(zhuǎn);如果H標(biāo)志為1)***
JPNH(如果不停止則跳轉(zhuǎn);如果H標(biāo)志為0)**
注意* JMPN(“永不跳轉(zhuǎn)”)可用于調(diào)試目的。
注意**基于I標(biāo)志為0或1或H標(biāo)志為0的狀態(tài)進(jìn)行的跳轉(zhuǎn)不是特別有用,因?yàn)?a href="http://www.nxhydt.com/v/tag/1730/" target="_blank">程序員已經(jīng)知道這些標(biāo)志包含的內(nèi)容(與N,Z,C和O不同)標(biāo)志,其值取決于算術(shù)和邏輯運(yùn)算的結(jié)果)。但是,它們是通過(guò)執(zhí)行HRRG的JMP指令的方式來(lái)實(shí)現(xiàn)的。
注意*** JPH(如果H標(biāo)志為1,則跳轉(zhuǎn))是完全沒(méi)有意義的,這是因?yàn)橐坏┏绦驅(qū)⒋藰?biāo)志設(shè)置為1,CPU就會(huì)停止操作,并且只能通過(guò)觸發(fā)中斷來(lái)重置該標(biāo)志(假定中斷屏蔽標(biāo)志設(shè)置為1)或通過(guò)重置機(jī)器,因此此處僅出于完整性考慮而包含此指令。
對(duì)于大多數(shù)處理器,JSR(跳轉(zhuǎn)到子例程)指令的行為與JMP(無(wú)條件跳轉(zhuǎn))指令的行為類似;也就是說(shuō),沒(méi)有與JPN,JPNN等等效的JSR。但是,由于HRRG的指令體系結(jié)構(gòu),我們可以使用JSR來(lái)實(shí)現(xiàn)與以下指令相同的效果:
JSR(無(wú)條件JSR)
JSRN(無(wú)條件JSR)*
JSN(JSR如果為負(fù);如果N標(biāo)志為1)
JSNN(JSR如果不是負(fù);如果N標(biāo)志為0)
JSZ(JSR如果為零;如果Z標(biāo)志為1)
JSNZ(如果不是零,則為JSR;如果Z標(biāo)志為0;則為JSR);如果是
JSC,如果是進(jìn)位;如果C標(biāo)志為1;則為
JSNC;如果不是,則為JSR;如果C標(biāo)志為0,則為
JSO;如果是溢出,則為JSR;如果O標(biāo)志為1,
則為JSNO。(如果沒(méi)有溢出,則為JSR;如果O標(biāo)志為0,則為JSR)
JSI(如果是中斷屏蔽,則為JSR;如果I標(biāo)志為1))**
JSNI(如果不是中斷屏蔽,則為JSR;如果I標(biāo)志為0)**
JSH(如果暫停,則為JSR;如果H標(biāo)志是1)***
JSNH(如果不停止,則為JSR;如果H標(biāo)志為0)**
注意*,**和***;對(duì)于上述各種跳轉(zhuǎn)指令,適用相同的警告。
編輯:hfy
-
寄存器
+關(guān)注
關(guān)注
31文章
5325瀏覽量
120052 -
cpu
+關(guān)注
關(guān)注
68文章
10829瀏覽量
211194
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論