教學(xué)課件-匯編語言程序設(shè)計(jì)-郭顯久_第1頁
教學(xué)課件-匯編語言程序設(shè)計(jì)-郭顯久_第2頁
教學(xué)課件-匯編語言程序設(shè)計(jì)-郭顯久_第3頁
教學(xué)課件-匯編語言程序設(shè)計(jì)-郭顯久_第4頁
教學(xué)課件-匯編語言程序設(shè)計(jì)-郭顯久_第5頁
已閱讀5頁,還剩491頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

匯編語言程序設(shè)計(jì)第1章概述第2章8086CPU匯編程序設(shè)計(jì)環(huán)境第3章8086微處理器的指令系統(tǒng)第4章8086匯編語言第5章8086匯編語言基本程序設(shè)計(jì)第6章輸入/輸出程序設(shè)計(jì)第7章32位匯編語言

第1章概述1.1微型計(jì)算機(jī)發(fā)展過程1.2微型計(jì)算機(jī)特點(diǎn)1.3微型計(jì)算機(jī)系統(tǒng)1.4計(jì)算機(jī)語言

1.5計(jì)算機(jī)中數(shù)和字符的表示1.1微型計(jì)算機(jī)發(fā)展過程

微型計(jì)算機(jī)(Microcomputer),簡稱μC或MC,是指以微處理器為核心,配上由大規(guī)模集成電路制作的存儲器、輸入/輸出接口電路及系統(tǒng)總線所組成的計(jì)算機(jī)(簡稱微型機(jī),又稱微型電腦)。自從1971年美國Intel公司發(fā)明了第一臺微處理器以來,已經(jīng)經(jīng)歷了四十年的歷史,微機(jī)計(jì)算機(jī)的發(fā)展非常迅速,對于微型計(jì)算機(jī)的發(fā)展,一般以字長和典型的微處理器芯片(Microprocessor)作為劃分標(biāo)志,將微型計(jì)算機(jī)的發(fā)展劃分為五個(gè)階段。1.1微型計(jì)算機(jī)發(fā)展過程第一個(gè)階段(1971~1973)主要是字長為4位的微型機(jī)和字長為8位的低檔微型機(jī)。指令系統(tǒng)比較簡單,運(yùn)算功能較差,速度較慢,計(jì)算機(jī)語言采用的是機(jī)器語言或簡單的匯編語言。第二個(gè)階段(1973~1978)主要是字長為8位的中、高檔微型機(jī)。除采用機(jī)器語言和匯編語言外,還配有BASIC,F(xiàn)ORTRAN,PL/M等高級語言及其相應(yīng)的解釋程序和編譯程序,并在后期開始配上操作系統(tǒng)。第三個(gè)階段(1978~1985)主要是字長為16位的微型機(jī)。具有豐富的指令系統(tǒng),采用多級中斷系統(tǒng)、多重尋址方式、多種數(shù)據(jù)處理形式、段式寄存器結(jié)構(gòu)、乘除運(yùn)算硬件,電路功能大為增強(qiáng),并都配備了強(qiáng)有力的系統(tǒng)軟件。

1.1微型計(jì)算機(jī)發(fā)展過程第四個(gè)階段(1985~2000)主要是字長為32位的微型機(jī)。增加了面向多媒體數(shù)據(jù)處理和網(wǎng)絡(luò)應(yīng)用的擴(kuò)展指令,微機(jī)的功能已經(jīng)達(dá)到甚至超過超級小型計(jì)算機(jī),多任務(wù)、多用戶的作業(yè)。第五個(gè)階段(2000~)出現(xiàn)了字長為64位的微處理器芯片。采用全新指令架構(gòu)IA-64,沿用了x86指令體系(一般將自8086以來一直延續(xù)的這種指令體系通稱為x86指令體系),能夠很好的兼容原來的IA-32結(jié)構(gòu)的個(gè)人微機(jī)系統(tǒng),具有一定的普及性。

1.2微型計(jì)算機(jī)特點(diǎn)微型計(jì)算機(jī)本質(zhì)上與其它計(jì)算機(jī)并無太多的區(qū)別,除了具有一般計(jì)算機(jī)運(yùn)算速度快,計(jì)算精度高,有記憶能力和邏輯判斷能力為,還有微型計(jì)算機(jī)自己的特點(diǎn):(1)體積小,重量輕;(2)價(jià)格低;(3)可靠性高,結(jié)構(gòu)靈活(4)應(yīng)用面廣;(5)功能強(qiáng),性能優(yōu)越。1.3微型計(jì)算機(jī)系統(tǒng)微型計(jì)算機(jī)系統(tǒng)包括硬件系統(tǒng)和軟件系統(tǒng)兩大部分

計(jì)算機(jī)系統(tǒng)硬件系統(tǒng)軟件系統(tǒng)主機(jī)外設(shè)外存儲器:軟盤、硬盤、光盤、優(yōu)盤等輸入設(shè)備:鍵盤、鼠標(biāo)、麥克風(fēng)、掃描儀等輸出設(shè)備:顯示器、打印機(jī)、繪圖儀、音響等操作系統(tǒng):DOS、Windows、UNIX、Linux等語言處理程序:C、VisualBasic、Java等數(shù)據(jù)庫管理系統(tǒng):Oracle、SQLServer、Access等實(shí)用程序:系統(tǒng)優(yōu)化和維護(hù)軟件、殺毒軟件等通用應(yīng)用軟件:辦公自動化軟件、游戲軟件等專用應(yīng)用軟件:為不同企業(yè)專門開發(fā)設(shè)計(jì)的軟件中央處理器(CPU)運(yùn)算器控制器只讀存儲器(ROM)隨機(jī)存儲器(RAM)高速緩沖存儲器(Cache)內(nèi)存系統(tǒng)軟件應(yīng)用軟件1.3微型計(jì)算機(jī)系統(tǒng)微型計(jì)算機(jī)系統(tǒng)包括硬件系統(tǒng)和軟件系統(tǒng)兩大部分1.3.1計(jì)算機(jī)硬件系統(tǒng)1.中央處理器中央處理器由運(yùn)算器和控制器兩大部分構(gòu)成。運(yùn)算器可實(shí)現(xiàn)算術(shù)運(yùn)算、邏輯運(yùn)算和其它操作2.存儲器存儲器是計(jì)算機(jī)記憶或暫存數(shù)據(jù)的部件。存儲器分為內(nèi)存儲器(內(nèi)存)和外存儲器(外存)兩種。內(nèi)存儲器(主存儲器),簡稱內(nèi)存(主存),通常用內(nèi)存儲器存放待執(zhí)行或正在運(yùn)行的程序、數(shù)據(jù)等。這些信息均以二進(jìn)制代碼的形式保存在存儲器中。主存儲器通常使用半導(dǎo)體存儲器,半導(dǎo)體存儲器最基本的存儲單位為存儲元,每一個(gè)基本存儲元電路可以存放一位二進(jìn)制代碼,而由若干個(gè)基本存儲元電路構(gòu)成一個(gè)存儲單元,每個(gè)存儲單元可以存放一位或多位存儲元(如1、2、8、16等),每個(gè)存儲單元都有自己的編號,稱為地址,地址也是采用二進(jìn)制表示的。1.3微型計(jì)算機(jī)系統(tǒng)內(nèi)存又分為RAM和ROM,RAM稱為隨機(jī)存取存儲器,工作時(shí)可隨時(shí)寫入和讀出;ROM稱為只讀存儲器,工作時(shí)只能讀出信息。我們通常稱內(nèi)存容量大小主要指RAM而言。RAM斷電時(shí)內(nèi)部的信息不保存,而ROM斷電時(shí)內(nèi)部的信息不變。外存儲器(輔助存儲器),簡稱外存(輔存),常見的外存儲器有磁盤、磁帶、光盤、優(yōu)盤等,大量的、需要永久保存的信息一般都存放在外存中,外存保持信息的方式與內(nèi)存不同。3.輸入輸出(I/O)設(shè)備輸入設(shè)備是給計(jì)算機(jī)輸入信息的設(shè)備。

輸入設(shè)備的作用是將各種形式的信息轉(zhuǎn)換為計(jì)算機(jī)所能識別的形式。目前常用的輸入設(shè)備有鍵盤,鼠標(biāo),掃描儀等。輸出設(shè)備的作用是將計(jì)算機(jī)處理的結(jié)果轉(zhuǎn)換為人或其它設(shè)備所能識別的形式。如顯示器,打印機(jī),繪圖儀,投影儀等1.3微型計(jì)算機(jī)系統(tǒng)1.3.2計(jì)算機(jī)軟件系統(tǒng)

。軟件系統(tǒng)是指為運(yùn)行、管理和維護(hù)計(jì)算機(jī)而編制的各種程序、數(shù)據(jù)和文檔的總稱。程序是完成某一任務(wù)的指令或語句的有序集合;數(shù)據(jù)是程序處理的對象和處理的結(jié)果;文檔是描述程序操作及使用的相關(guān)資料。計(jì)算機(jī)軟件按其功能分為應(yīng)用軟件和系統(tǒng)軟件兩大類。1.系統(tǒng)軟件系統(tǒng)軟件是指控制計(jì)算機(jī)的運(yùn)行,管理計(jì)算機(jī)的各種資源。系統(tǒng)軟件通常包括:操作系統(tǒng)、語言處理程序、數(shù)據(jù)庫管理系統(tǒng)、實(shí)用程序。2.應(yīng)用軟件通用應(yīng)用軟件是軟件公司或用戶為解決某類應(yīng)用問題而專門研制的軟件。例如,AutoCAD繪圖軟件包、通用財(cái)務(wù)管理軟件包、Office軟件包等。1.4計(jì)算機(jī)語言

計(jì)算機(jī)語言(ComputerLanguage)指用于人與計(jì)算機(jī)之間通訊的語言。機(jī)語言的種類非常的多,總的來說可以分成機(jī)器語言,匯編語言,高級語言三大類。前兩種語言是面向機(jī)器的,一般稱為低級語言。后一種是面向程序設(shè)計(jì)人員的,一般稱為高級語言。1.4.1機(jī)器語言

計(jì)算機(jī)的硬件設(shè)備的組成由一系列的各種門電路、觸發(fā)器、寄存器、計(jì)數(shù)器、譯碼器等電路構(gòu)成,這些電路工作時(shí)具有兩種狀態(tài),即低電平和高電平,分別用“0”和“1”表示。而計(jì)算機(jī)所使用的就是由“0”和“1”組成的二進(jìn)制數(shù),處理的是二進(jìn)制信息,二進(jìn)制是計(jì)算機(jī)語言的基礎(chǔ)。寫出一串串由“0”和“1”組成的指令序列交由計(jì)算機(jī)執(zhí)行,這種語言,就是機(jī)器語言。

1.4計(jì)算機(jī)語言

例1.1計(jì)算機(jī)要完成100+256的運(yùn)算,其機(jī)器語言代碼為:二進(jìn)制代碼:101110000110010000000000000001010000000000000001101000110000000000100000十六進(jìn)制代碼:B86400050001A30020用機(jī)器語言編寫的程序有以下優(yōu)點(diǎn):(1)計(jì)算機(jī)能直接識別、執(zhí)行;(2)算法刻畫細(xì)致; (3)程序緊湊,占內(nèi)存空間少,執(zhí)行速度最快;(4)能充分發(fā)揮計(jì)算機(jī)的硬件功能。缺點(diǎn):(1)機(jī)器語言難記,程序難編,易錯(cuò),調(diào)試?yán)щy;(2)通用性差。1.4計(jì)算機(jī)語言

1.4.2

匯編語言用一些簡潔的英文字母、符號串來替代一個(gè)特定的指令的二進(jìn)制串,比如,用“ADD”代表加法,“MOV”代表數(shù)據(jù)傳送等等,這種程序設(shè)計(jì)語言就稱為匯編語言,即第二代計(jì)算機(jī)語言。然而計(jì)算機(jī)是不認(rèn)識這些符號的,這就需要一個(gè)專門的程序,專門負(fù)責(zé)將這些符號翻譯成二進(jìn)制數(shù)的機(jī)器語言,這種翻譯程序被稱為匯編程序。例1.2

計(jì)算機(jī)要完成100+256的運(yùn)算,其匯編語言指令為:

MOVAX,100 ADDAX,256 MOV[2000],AX1.4計(jì)算機(jī)語言

匯編語言與機(jī)器語言比較起來,具有以下優(yōu)點(diǎn):(1)程序編制容易、出錯(cuò)機(jī)會少、調(diào)試容易;(2)算法刻畫細(xì)致;(3)程序緊湊,占內(nèi)存空間少,執(zhí)行速度快;(4)能充分發(fā)揮計(jì)算機(jī)的硬件功能。缺點(diǎn):(1)計(jì)算機(jī)不能直接識別、執(zhí)行,必修經(jīng)過匯編為機(jī)器語言程序;(2)通用性差。1.4計(jì)算機(jī)語言

1.4.3高級語言

這種語言接近于數(shù)學(xué)語言或人的自然語言,同時(shí)又不依賴于計(jì)算機(jī)硬件,編出的程序能在所有機(jī)器上通用。如:FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、JAVA等。高級語言的優(yōu)點(diǎn):(1)程序編制容易、出錯(cuò)機(jī)會少、調(diào)試容易;(2)容易表達(dá)算法;(3)通用性強(qiáng)。1.4計(jì)算機(jī)語言

高級語言的缺點(diǎn):(1)計(jì)算機(jī)不能直接識別、執(zhí)行,必修經(jīng)過編譯為機(jī)器語言程序;(2)占內(nèi)存空間大,執(zhí)行速度慢;(3)不能充分發(fā)揮計(jì)算機(jī)的硬件功能。1.5計(jì)算機(jī)中數(shù)和字符的表示

1.5.1

計(jì)算機(jī)中有符號數(shù)的表示。1.機(jī)器數(shù)和真值-”號,這種符號數(shù)值化之后表示的數(shù)稱之為機(jī)器數(shù),即計(jì)算機(jī)把有符號數(shù)給數(shù)值化了, 例如:

N1=+1011010N1=-1011010在計(jì)算機(jī)表示時(shí),用“0”替換“+”號,用“1”替換“-”號,則上面數(shù)值表示為:

N1=01011010N1=11011010將機(jī)器數(shù)所代表的真正數(shù)值稱為原來數(shù)值的真值。機(jī)器數(shù)在計(jì)算機(jī)內(nèi)有不同的表示方法,常見的機(jī)器數(shù)有三種表示方法:即原碼、反碼和補(bǔ)碼。1.5計(jì)算機(jī)中數(shù)和字符的表示

2.原碼在用二進(jìn)制原碼表示的數(shù)中,最高位為符號位,符號位后表示該數(shù)的絕對值。(1)對于正數(shù):X=+113,X=+1110001B [+113]原=01110001B(2)對于負(fù)數(shù):X=-113,X=-1110001B [-113]原=11110001B其中最高位為符號位,若字長為8位,后面的7位是數(shù)值(若字長為16位,則后面15位為數(shù)值)。原碼表示時(shí),+113和-113的數(shù)值位相同,符號位不同。1.5計(jì)算機(jī)中數(shù)和字符的表示

說明:①0的原碼有兩種表示法:

[+0]原=00000000B [-0]原=10000000B②n位(包括符號位在內(nèi))原碼的表示范圍為:1-2n-1~2n-1-1。例如8位原碼表示的范圍為:-127~+127。原碼表示方法簡單易懂,與真值之間轉(zhuǎn)換方便。1.5計(jì)算機(jī)中數(shù)和字符的表示

3.反碼在反碼表示中,最高位為符號位,正數(shù)的反碼與原碼相同,負(fù)數(shù)的反碼為其正數(shù)原碼按位求反。(1)對于正數(shù):X=+113,X=+1110001B

[+113]反=01110001B(2)對于負(fù)數(shù):X=-113,X=-1110001B[-113]反=10001110B1.5計(jì)算機(jī)中數(shù)和字符的表示

說明:①0的反碼有兩種表示法:[+0]反=00000000B[-0]反=11111111B②n位反碼表示的范圍為:1-2n-1~2n-1-1;例如8位反碼表示的范圍為:-127~+127。③符號位為1時(shí),其后不是該數(shù)的絕對值。例如反碼11100101B的真值為-27,而不是-101。1.5計(jì)算機(jī)中數(shù)和字符的表示

4.補(bǔ)碼在補(bǔ)碼表示中,最高位為符號位,正數(shù)的補(bǔ)碼與原碼相同;負(fù)數(shù)的補(bǔ)碼為其正數(shù)原碼按位求反再加1。(1)對于正數(shù):X=+113,X=+1110001B

[+113]補(bǔ)=01110001B(2)對于負(fù)數(shù):X=-113,X=-1110001B [-113]補(bǔ)=10001111B1.5計(jì)算機(jī)中數(shù)和字符的表示

說明:①0的補(bǔ)碼只有一種表示法:[+0]=[-0]=00000000B;②n位補(bǔ)碼所能表示的范圍為-2n-1~2n-1-1;例如8位補(bǔ)碼表示的范圍為-128~+127。③八位機(jī)器數(shù)中:[-128]補(bǔ)=10000000B,[-128]原,[-128]反不存在。④符號位為1時(shí),其后不是該數(shù)的絕對值。例如:補(bǔ)碼11110010B的真值為-14,而不是-114。有符號數(shù)采用補(bǔ)碼表示時(shí),就可以將減法運(yùn)算轉(zhuǎn)換為加法運(yùn)算。因此計(jì)算機(jī)中有符號數(shù)均以補(bǔ)碼表示。1.5計(jì)算機(jī)中數(shù)和字符的表示

計(jì)算機(jī)引入了補(bǔ)碼編碼后,帶來了以下幾個(gè)優(yōu)點(diǎn):(1)減法轉(zhuǎn)化成了加法:這樣大大簡化了運(yùn)算器硬件電路的設(shè)計(jì),加減法可用同一硬件電路進(jìn)行處理。(2)運(yùn)算時(shí),符號位與數(shù)值位同等對待,都按二進(jìn)制參加運(yùn)算;符號位產(chǎn)生的進(jìn)位丟掉不管,其結(jié)果是正確的,這大大簡化了運(yùn)算規(guī)則。1.5計(jì)算機(jī)中數(shù)和字符的表示

1.5.2無符號整數(shù)我們把最高有效位也作為數(shù)值處理,這樣的數(shù)稱之為無符號整數(shù)。8位無符號數(shù)表示的范圍為:0~255,16位無符號數(shù)表示的范圍為:0~65535,n位無符號數(shù)表示的范圍為0~2n-1。計(jì)算機(jī)中最常用的無符號整數(shù)是表示存儲單元的地址和外設(shè)的地址。1.5.3

BCD(BinaryCodedDecimal)碼把由四位二進(jìn)制數(shù)表示一位十進(jìn)制數(shù)的編碼稱為BCD碼,也稱為二-十進(jìn)制編碼。最常用的BCD編碼,就是使用“0”至“9”這十個(gè)數(shù)值的二進(jìn)碼來表示。這種編碼方式,稱之為8421BCD碼。

除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法,以適應(yīng)不同的需求。這些編碼,大致可以分成有權(quán)碼和無權(quán)碼兩種:有權(quán)(每一位都有權(quán)值)BCD碼,如:8421、2421、5421等。無權(quán)BCD碼,如:余3碼、余3循環(huán)碼,格雷碼等。常見的BCD碼與十進(jìn)制數(shù)的表示如表所示

十進(jìn)制數(shù)8421碼5421碼2421碼余3碼余3循環(huán)碼000000000000000110010100010001000101000110200100010001001010111300110011001101100101401000100010001110100501011000101110001100601101001110010011101701111010110110101111810001011111010111110910011100111111001010例1.5把十進(jìn)制32578轉(zhuǎn)換為8421BCD碼表示。

(32578)10=(00110010010101111000)BCDBCD表示有兩種基本形式:壓縮的BCD碼和非壓縮的BCD。1.壓縮的BCD碼它是一種用四位二進(jìn)制數(shù)表示十進(jìn)制數(shù)。首先是用四位二制數(shù)表示個(gè)數(shù),然后用四位二進(jìn)制數(shù)表示十位,然后百位…。例如:251需要三個(gè)四位二進(jìn)制數(shù)表示。1表示為0001;5表示為0101;2表示為0010。最后251的BCD數(shù)據(jù)表示為001001010001。2.非壓縮BCD非壓縮的BCD碼用8位二進(jìn)制數(shù)表示一個(gè)十進(jìn)制數(shù)位,其中低4位是BCD碼,高4位是0。例如:十進(jìn)制數(shù)78表示成壓縮的BCD碼為0000011100001000。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法1.5計(jì)算機(jī)中數(shù)和字符的表示

常用的數(shù)制有如下幾種:(1)十進(jìn)制數(shù)用D(Decimal)表示;(2)二進(jìn)制數(shù)用B(Binary)表示;(3)八進(jìn)制數(shù)用O(Octal)表示,為了防止O和數(shù)字0混淆,也采用Q表示。(4)十六進(jìn)制數(shù)用H(Hexadecimal)來表示。例如:十進(jìn)制數(shù)32D;二進(jìn)制數(shù)1010001B;八進(jìn)制數(shù)345Q;十六進(jìn)制數(shù)3ABH,對應(yīng)二進(jìn)制數(shù)、八進(jìn)制數(shù)、十六進(jìn)制數(shù)表示時(shí)后綴字母不可省略,十進(jìn)制數(shù)后綴D可以省略。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法1.5.5非數(shù)值數(shù)據(jù)的表示1.字符編碼使用最多、最普遍的是ASCII字符編碼,即美國信息交換標(biāo)準(zhǔn)代碼(AmericanStandardCodeForInformationInterchange),字符包括一般字符和可控制符,如表1.4所示。在進(jìn)行匯編程序設(shè)計(jì)時(shí)應(yīng)注意以下幾點(diǎn):(1)空格SP的ASCII碼為20H,換行LF的ASCII碼為0AH或10,回車CR的ASCII碼為ODH或13。(2)字符0~9的ASCII碼為30H~39H,即相應(yīng)的數(shù)字加上十六進(jìn)制數(shù)30H。數(shù)字0~9和對應(yīng)的ASCII之間的轉(zhuǎn)換只要增減30H就可以了。(3)大寫字母A~Z所對應(yīng)的ASCII碼為41H~5AH。小寫字母的a~z所對應(yīng)的ASCII碼為61H~7AH.因?yàn)榇髮懽帜负托懽帜傅腁SCII碼的編碼也是連續(xù)編碼,所以只要記住大小寫字母A的ASCII碼,其它字母的ASCII就可以推出。每個(gè)大寫字母的ASCII碼與對應(yīng)小寫字母的ASCII相差十六進(jìn)制數(shù)20H,所以大小寫字母轉(zhuǎn)換只要增減20H就可以。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法2.漢字的編碼(1)漢字內(nèi)碼。漢字信息在計(jì)算機(jī)內(nèi)部也是以二進(jìn)制形式存放。國標(biāo)碼規(guī)定用兩個(gè)字節(jié)的十六位二進(jìn)制表示一個(gè)漢字每個(gè)字節(jié)都只使用低7位。由于國標(biāo)碼不能直接存儲在計(jì)算機(jī)內(nèi),為方便計(jì)算機(jī)內(nèi)部處理和存儲漢字,又區(qū)別于ASCII碼,將國標(biāo)碼中的每個(gè)字節(jié)在最高位改設(shè)為1,這樣就形成了在計(jì)算機(jī)內(nèi)部用來進(jìn)行漢字的存儲、運(yùn)算的編碼叫機(jī)內(nèi)碼(或漢字內(nèi)碼,或內(nèi)碼)。(2)漢字輸入碼。無論是區(qū)位碼或國標(biāo)碼都不利于輸入漢字,為方便漢字的輸入而制定的漢字編碼,稱為漢字輸入碼。常見的輸入碼有以下幾類:按漢字的排列順序形成的編碼(流水碼):如區(qū)位碼;按漢字的讀音形成的編碼(音碼):如全拼、簡拼、雙拼等;按漢字的字形形成的編碼(形碼):如五筆字型、鄭碼等;按漢字的音、形結(jié)合形成的編碼(音形碼):如自然碼、智能ABC。輸入碼在計(jì)算機(jī)中必須轉(zhuǎn)換成機(jī)內(nèi)碼,才能進(jìn)行存儲和處理。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法(3)漢字字形碼。為了將漢字在顯示器或打印機(jī)上輸出,把漢字按圖形符號設(shè)計(jì)成點(diǎn)陣圖,就得到了相應(yīng)的點(diǎn)陣代碼(字形碼)。例:用16×16點(diǎn)陣表示一個(gè)漢字,就是將每個(gè)漢字用16行,每行16個(gè)點(diǎn)表示,一個(gè)點(diǎn)需要1位二進(jìn)制代碼,16個(gè)點(diǎn)需用16位二進(jìn)制代碼(即2個(gè)字節(jié)),共16行,所以需要16行×2字節(jié)/行=32字節(jié),即16×16點(diǎn)陣表示一個(gè)漢字,字形碼需用32字節(jié)。1.5.6邏輯運(yùn)算計(jì)算機(jī)系統(tǒng)中除了算術(shù)運(yùn)算以外,還有邏輯運(yùn)算,包括:與、或、非和異或運(yùn)算。這些運(yùn)算時(shí)按位操作,即對應(yīng)的二進(jìn)制位進(jìn)行邏輯操作,而與其它位無關(guān)。(1)與”運(yùn)算(AND):只有當(dāng)兩個(gè)變量的值都為1時(shí),結(jié)果才為1。(2)“或”運(yùn)算(OR):兩個(gè)變量中只要有一個(gè)為1,結(jié)果就為1(3)“非”運(yùn)算(NOT):1“非”的結(jié)果為0;0“非”的結(jié)果為1;(4)“異或”運(yùn)算(XOR):當(dāng)兩個(gè)變量的取值相異時(shí)結(jié)果為1除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法第2章8086CPU匯編程序

設(shè)計(jì)環(huán)境2.18086CPU編程結(jié)構(gòu)2.28086存儲器結(jié)微機(jī)構(gòu)2.38086的I/O接口2.18086CPU編程結(jié)構(gòu)8086/8088微處理器是Intel公司推出的第三代CPU芯片,它們的內(nèi)部結(jié)構(gòu)基本相同,內(nèi)部數(shù)據(jù)總線都是16位,都采用16位結(jié)構(gòu)進(jìn)行操作及存儲器尋址,但外部性能有所差異,8086是16為微型處理器,CPU與外部進(jìn)行數(shù)據(jù)交換數(shù)據(jù)總線采用16位,而8088是準(zhǔn)16為微型處理器,CPU與外部進(jìn)行數(shù)據(jù)交換數(shù)據(jù)總線采用16位,最大尋找空間為1M。兩者具有類似的體系結(jié)構(gòu),指令系統(tǒng)、指令編碼格式、尋址方式完全相同,兩種處理器都封裝在相同的40腳雙列直插組件(DIP)中。8086/8088CPU編程結(jié)構(gòu)是指從程序員和使用者的角度看到的結(jié)構(gòu),亦可稱為功能結(jié)構(gòu),其內(nèi)部結(jié)構(gòu)如圖所示。AHALBHBLCHCLDHDL通用寄存器SPBPSIDI數(shù)據(jù)寄存器指針和變址寄存器內(nèi)部數(shù)據(jù)總線(16位)運(yùn)算寄存器EU控制電路AXBXCXDX標(biāo)志寄存器執(zhí)行單元(EU)總線接口單元(BIU)123456指令隊(duì)列緩沖器(8位)內(nèi)部寄存器IPESSSDSCSALU∑DB(16位)AB(20位)輸入輸出控制電路8086總線DB(16位)20位地址加法器按功能可分為兩部分:執(zhí)行單元EU(ExecutionUnit)和總線接口單元BIU(BusInterfaceUnit)。2.1.1執(zhí)行單元EU執(zhí)行單元包括算術(shù)邏輯單元(ALU),狀態(tài)標(biāo)志寄存器(FLAGS),一組通用寄存器組和相應(yīng)的控制電路,所有寄存器都是16位的,執(zhí)行單元不直接與外設(shè)交換信息,它通過總線接口單元接收指令和數(shù)據(jù),可以進(jìn)行8位和16位算術(shù)運(yùn)算、邏輯運(yùn)算和移位操作等。2.1.2總線接口單元BIU總線接口單元BIU的功能是負(fù)責(zé)CPU與存儲器、I/O的信息傳送。具體功能是根據(jù)段寄存器CS和指令指針I(yè)P形成的20位物理地址從存儲器中取出指令,并暫存在指令隊(duì)列中,等待執(zhí)行單元EU取走并執(zhí)行??偩€接口單元由一個(gè)指令隊(duì)列,一組段寄存器(DS、CS、ES、SS),一個(gè)指令指針寄存器(IP),地址加法器組成。地址加法器根據(jù)EU的請求,形成20位的實(shí)際物理地址,完成CPU與存儲器或I/O接口的數(shù)據(jù)交換。8086CPU的指令隊(duì)列為6個(gè)字節(jié)(8088為4字節(jié)),在執(zhí)行指令的同時(shí),可從內(nèi)存中取出后續(xù)的指令代碼,放在指令隊(duì)列中,可以提高CPU的工作效率。BIU與EU的動作協(xié)調(diào)原則:總線接口部件(BIU)和執(zhí)行部件(EU)按以下流水線技術(shù)原則協(xié)調(diào)工作,共同完成所要求的信息處理任務(wù):(1)每當(dāng)8086的指令隊(duì)列中有兩個(gè)空字節(jié),或8088的指令隊(duì)列中有一個(gè)空字節(jié)時(shí),BIU就會自動把指令取到指令隊(duì)列中。其取指的順序是按指令在程序中出現(xiàn)的前后順序。(2)每當(dāng)EU準(zhǔn)備執(zhí)行一條指令時(shí),它會從BIU部件的指令隊(duì)列前部取出指令的代碼,然后用幾個(gè)時(shí)鐘周期去執(zhí)行指令。在執(zhí)行指令的過程中,如果必須訪問存儲器或者I/O端口,那么EU就會請求BIU,進(jìn)入總線周期,完成訪問內(nèi)存或者I/O端口的操作;如果此時(shí)BIU正好處于空閑狀態(tài),會立即響應(yīng)EU的總線請求。如BIU正將某個(gè)指令字節(jié)取到指令隊(duì)列中,則BIU將首先完成這個(gè)取指令的總線周期,然后再去響應(yīng)EU發(fā)出的訪問總線的請求。(3)當(dāng)指令隊(duì)列已滿,且EU又沒有總線訪問請求時(shí),BIU便進(jìn)入空閑狀態(tài)。(4)在執(zhí)行轉(zhuǎn)移指令、調(diào)用指令和返回指令時(shí),由于待執(zhí)行指令的順序發(fā)生了變化,則指令隊(duì)列中已經(jīng)裝入的字節(jié)被自動消除,BIU會接著往指令隊(duì)列裝入轉(zhuǎn)向的另一程序段中的指令代碼。

總線接口單元由一個(gè)指令隊(duì)列,一組段寄存器(DS、CS、ES、SS),一個(gè)指令指針寄存器(IP),地址加法器組成。地址加法器根據(jù)EU的請求,形成20位的實(shí)際物理地址,完成CPU與存儲器或I/O接口的數(shù)據(jù)交換。8086CPU的指令隊(duì)列為6個(gè)字節(jié)(8088為4字節(jié)),在執(zhí)行指令的同時(shí),可從內(nèi)存中取出后續(xù)的指令代碼,放在指令隊(duì)列中,可以提高CPU的工作效率。2.1.38086/8088內(nèi)部寄存器8086/8088內(nèi)部的寄存器可以分為通用寄存器和專用寄存器兩大類,專用寄存器包括IP、SP和FLAGS三個(gè)16位寄存器。1.通用寄存器數(shù)據(jù)寄存器、指針寄存器和變址寄存器統(tǒng)稱為通用寄存器。數(shù)據(jù)寄存器主要用于保存操作數(shù)運(yùn)算結(jié)果等信息,有四個(gè)16位的數(shù)據(jù)寄存器AX,BX,CX,DX可分解成八個(gè)獨(dú)立的8位寄存器,這八個(gè)8位的寄存器有各自的名稱,分別稱為AH,AL,BH,BL,CH,CL,DH,DL,并且均可以獨(dú)立存取。名稱中的字母H表示高,L表示低。如AL表示低8位,AH表示高8位,AH寄存器和AL寄存器的合并就是AX寄存器,其他寄存器類推。即低位字節(jié)的寄存器分別稱作AL、BL、CL和DL,高位字節(jié)的寄存器分別稱作AH、BH、CH和DH。AX和AL寄存器又稱為累加寄存器(Accumulator)。一般通過累加器進(jìn)行的操作所用的時(shí)間可能最少,此外累加器還有許多專門的用途,所以累加器使用的最普遍。BX寄存器成為基(Base)地址寄存器。他是四個(gè)寄存器中唯一可作為存儲器基址指針使用的寄存器。CX寄存器稱為計(jì)數(shù)(Count)寄存器。在字符串操作和循環(huán)操作時(shí),用它來控制重復(fù)循環(huán)操作次數(shù)。在一位操作時(shí),CL寄存器用于保存移位的位數(shù)。DX寄存器稱為數(shù)據(jù)(Data)寄存器。在進(jìn)行32位的乘除法操作時(shí),用它存放被除數(shù)的高16位或余數(shù)。它也用于存放I/O端口地址。變址寄存器(SI、DI)和指針寄存器(BP、SP)主要用于存放某個(gè)存儲單元的偏移地址,或某組存儲單元開始地址的偏移量,即作為存儲器(短)指針使用。作為通用寄存器,它們也可以保存16位算術(shù)邏輯運(yùn)算中的操作數(shù)和運(yùn)算結(jié)果,有時(shí)運(yùn)算結(jié)果就是需要的存儲單元地址的偏移量。注意,16位的變址寄存器和指針寄存器不能分解成8位寄存器使用。SI和DI寄存器在字符串操作中,規(guī)定由SI給出源串指針,由DI給出目的串指針,所以SI也稱為源變址(SourceIndex)寄存器,DI也稱為目的變址(DestinationIndex)寄存器。BP和SP寄存器在對堆棧操作時(shí),BP主要用于給出堆棧中數(shù)據(jù)區(qū)基址的偏移地址,從而方便的實(shí)現(xiàn)直接存取堆棧中的數(shù)據(jù),所以BP也稱為基指針(BasePointer)寄存器。正常情況下,SP只作為堆棧指針(StackPointer)使用,即保存堆棧棧頂?shù)刂返钠啤?.段寄存器8086/8088CPU依賴其內(nèi)部的四個(gè)段寄存器實(shí)現(xiàn)尋址1M字節(jié)的物理地址空間。8086/8088把1M字節(jié)地址空間分成若干邏輯段,當(dāng)前使用段的起始地址(段基址)存放在段寄存器中。由段基址和段內(nèi)偏移地址形成20位地址,我們將在下節(jié)詳細(xì)介紹形成20位地址的具體方法。8086/8088CPU的四個(gè)段寄存器均是16位的,分別稱為代碼段(CodeSegment)寄存器CS,數(shù)據(jù)段(DataSegment)寄存器DS,堆棧段(StackSegment)寄存器SS,附加段(ExtraSegment)寄存器ES。段寄存器主要解決20位地址形成和程序中指令代碼與數(shù)據(jù)分開存放,除CS是用于指示指令代碼的地址空間之外,其它段寄存器都用于指示數(shù)據(jù)的地址空間。3.指令指針寄存器IP8086/8088CPU中的指令指針寄存器IP(InstructionPointer)也是16位的,它給出將要從主存中取出指令在代碼段中的偏移地址,其值為該指令到所在段基址的字節(jié)距離。OFDFIFTFSFZFAFPFCF進(jìn)借位標(biāo)志奇偶標(biāo)志半進(jìn)借位標(biāo)志零標(biāo)志符號標(biāo)志單步中斷中斷允許方向標(biāo)志溢出標(biāo)志1-有進(jìn)、借位0-無進(jìn)、借位1-低4位向高4位有進(jìn)、借位0-低4位向高4位無進(jìn)、借位1-結(jié)果為00-結(jié)果不為04.標(biāo)志寄存器FLAGS標(biāo)志寄存器又稱為程序狀態(tài)字寄存器(programstatusword,PSW)。各標(biāo)志在標(biāo)志寄存器中的位置如下所示:有些指令的執(zhí)行受某些標(biāo)志的影響,有些指令的執(zhí)行不受標(biāo)志的影響。所以,程序員要充分注意指令與標(biāo)志的關(guān)系。9個(gè)標(biāo)志可分成兩組,第一組6個(gè)標(biāo)志主要受算術(shù)運(yùn)算和邏輯運(yùn)算結(jié)果的影響,稱為運(yùn)算結(jié)果標(biāo)志,第二組標(biāo)志不受運(yùn)算結(jié)果的影響,稱為狀態(tài)控制標(biāo)志。(1)運(yùn)算結(jié)果(狀態(tài))標(biāo)志位OF(OverflowFlag)溢出標(biāo)志:在運(yùn)算過程中,如操作數(shù)超出了機(jī)器能表示的范圍,則稱為溢出。此時(shí)OF位置1,否則置0。SF(SignFlag)符號標(biāo)志:記錄運(yùn)算結(jié)果的符號,結(jié)果為負(fù)時(shí)置1,否則置0。ZF(ZeroFlag)零標(biāo)志:運(yùn)算結(jié)果為0時(shí)ZF位置1,否則置0。CF(CarryFlag)進(jìn)位標(biāo)志:記錄運(yùn)算時(shí)有效位產(chǎn)生的進(jìn)位值。例如,執(zhí)行加法指令時(shí),最高有效位有進(jìn)位時(shí)置1,否則置0。AF(AuxiliarycarryFalg)輔助進(jìn)位標(biāo)志:記錄運(yùn)算時(shí)第3位(半個(gè)字節(jié))產(chǎn)生的進(jìn)位值。例如,執(zhí)行加法指令時(shí)第3位有進(jìn)位時(shí)置1,否則置0。PF(ParityFlag)奇偶標(biāo)志:用來為機(jī)器中傳送信息時(shí)可能產(chǎn)生的代碼出錯(cuò)情況提供檢驗(yàn)條件。當(dāng)結(jié)果操作數(shù)中1的個(gè)數(shù)為偶數(shù)時(shí)置1,否則置0。2)控制標(biāo)志位 DF(DirectionFlag)方向標(biāo)志:在串處理指令中控制處理信息的方向用。當(dāng)DF位為1時(shí),每次操作后是變址寄存器SI和DI減量,這樣就是串處理從高地址向低地址方向處理。當(dāng)DF為0時(shí),則使SI和DI增量,使串處理從低地址向高地址方向處理。8086/8088提供的專門用于設(shè)置方向標(biāo)志DF的指令是STF,專門用于清除DF的指令時(shí)CLD。IF(InterruptFlag)中斷向量:當(dāng)IF為1時(shí),允許中斷,否則關(guān)閉中斷。8086/8088提供的專門用于設(shè)置中斷允許標(biāo)志IF的指令是STI,專門用于清IF的指令是CLI。TF(TrapFlag)追蹤標(biāo)志:用于單步操作方式,當(dāng)追蹤標(biāo)志TF被置1后,CPU進(jìn)入單步方式。所謂單步方式是指在一條指令執(zhí)行后,產(chǎn)生一個(gè)單步中斷,這主要用于程序的調(diào)試。8086/8088沒有專門設(shè)置和清除TF標(biāo)志的指令,用通過其他方法設(shè)置或清除TF。2.28086微機(jī)存儲器結(jié)構(gòu)2.2.1存儲單元的地址和內(nèi)容計(jì)算機(jī)存儲器以字節(jié)為單位存儲信息,為了正確的存放或取得信息,每一個(gè)字節(jié)單元給以一個(gè)存儲器地址。地址從0開始編號,順序地每次加1。在機(jī)器里,地址也是用二進(jìn)制數(shù)來表示的,它是無符號整數(shù),為了書寫和編程方便地址格式一般采用十六進(jìn)制數(shù)表示。從圖中可以看到,地址為1001H的字節(jié)存儲單元中的內(nèi)容是34H,而地址為200AH的字節(jié)存儲單元中的內(nèi)容是78H。分別記為:

(1000H)=33H (200AH)=78H存儲器地址┇┇33H1000H34H1001H35H1002H36H10033H┇┇78H200AH89H200BH┇┇8086微機(jī)的字長為16位,由2個(gè)字節(jié)組成一個(gè)字,分成低位字節(jié)和高位字節(jié)。一個(gè)字存放到存儲器要占用連續(xù)的兩個(gè)字節(jié)單元,系統(tǒng)規(guī)定,當(dāng)把一個(gè)字節(jié)存放到存儲器時(shí),其低字節(jié)存放在低地址的字節(jié)單元中,其高字節(jié)存放在高地址的字節(jié)單元中。這樣二個(gè)連續(xù)的字節(jié)單元就構(gòu)成了一個(gè)字單元,字單元的地址采用它的低地址表示。例如,圖中地址1000H的字單元的內(nèi)容是3433H,而地址為200AH單元的內(nèi)容是8987H。分別記為:

(1000H)=3433H (200AH)=8978H上述存儲原則稱為“高高低低”原則。在以字節(jié)方式存取字時(shí)需要特別注意該原則,當(dāng)以字方式存取字時(shí),處理器自動采用該原則。2.2.2存儲器的分段技術(shù)

8086/8088CPU有20根地址線,可直接尋址的物理地址空間為1M字節(jié)(=220)。系統(tǒng)存儲器由以字節(jié)為單位的存儲單元組成,存儲單元的物理地址由20位二進(jìn)制數(shù)表示,范圍是00000H至FFFFFH。而8086/8088內(nèi)部的ALU每次最多進(jìn)行16位運(yùn)算,存放存儲單元地址偏移量的指針寄存器(如IP、SP以及BP、SI、DI和BX)都是16位,為了尋址1M的所有單元,8086/8088通過對存儲器采用分段技術(shù)的方法有效地實(shí)現(xiàn)了尋址1M字節(jié)物理地址空間。所謂分段技術(shù)就是根據(jù)需要把1M字節(jié)地址空間劃分成若干邏輯段。每個(gè)邏輯段必須滿足如下兩個(gè)條件:第一,邏輯段的開始地址必須是16的倍數(shù);第二,邏輯段的最大長度為64K,最多有16個(gè)邏輯段。按照這兩個(gè)條件,1M字節(jié)地址空間最多可劃有64K個(gè)邏輯段的起始地址。第一個(gè)條件與段寄存器長16位有關(guān);第二個(gè)條件與指針寄存器長16位相關(guān)。根據(jù)編程的需要,由計(jì)算機(jī)為每一個(gè)段規(guī)定一個(gè)起始地址,即該段的首地址,稱為段基址。位于段起始單元的地址應(yīng)被16整除,它的20位二進(jìn)制表示的地址的最低4位一定為0,高16位地址放在段寄存器中。每個(gè)邏輯段的段內(nèi)地址是連續(xù)的,邏輯段與邏輯段可以相連,也可以不相連,還可以部分重疊。一個(gè)程序使用的存儲空間可以是一個(gè)邏輯段,也可以是多個(gè)邏輯段。一般為數(shù)據(jù)段、代碼段、堆棧段和附加段。每個(gè)段的起始地址(段的首地址、段的基本地址、段基址)放在對應(yīng)的段寄存器(DS、CS、SS、ES)中。段寄存器(DS、SS、ES)的內(nèi)容可以在程序中用數(shù)據(jù)傳送指令設(shè)置初值或改變其值,CS的初值不允許用傳送指令賦值,CS值的改變只能在段間調(diào)用、段間返回、段間轉(zhuǎn)移、中斷指令或發(fā)生中斷時(shí)由計(jì)算機(jī)系統(tǒng)改變。2.2.3物理地址的形成由于段的起始地址必須是16的倍數(shù),所以20位段起始地址有如下形式:

xxxxxxxxxxxxxxxx0000(二進(jìn)制)用16進(jìn)制可表示成XXXX0(十六進(jìn)制)。我們把20位段起始地址的高16位XXXX(十六進(jìn)制)稱為段基址。顯然,段起始地址等于段基址乘16(即左移4位)。要訪問的某一個(gè)存儲單元總是屬于某個(gè)段。我們把存儲單元的地址與所在段的起始地址的差稱為段內(nèi)偏移地址,簡稱偏移地址(偏移量)。在一個(gè)段內(nèi),通過偏移量可指定要訪問的存儲單元。在整個(gè)1M地址空間中,存儲單元的物理地址等于段的起始地址加上偏移量。于是,存儲單元的邏輯地址由段基址和偏移量兩部分組成,用如下形式表示: 邏輯地址=段基址:偏移量例如:2000H:0080H。根據(jù)邏輯地址可方便地得到存儲單元的物理地址(實(shí)際地址),計(jì)算公式如下: 物理地址=段基址×16+偏移量通過移位和算術(shù)加法可容易地實(shí)現(xiàn)上述公式,例2.1寫出邏輯地址2BH:23H和邏輯地址2CH:13H所對應(yīng)的物理地址邏輯地址2BH:23H的物理地址為:

2B0H+23H=2D3H

邏輯地址2CH:13H的物理地址為:

2C0H+13H=2D3H指令中不使用物理地址,而是使用邏輯地址。2.38086的I/O接口2.3.1輸入/輸出(I/O)接口主機(jī)與外界交換信息稱為輸入/輸出(I/O)。主機(jī)與外界的信息交換是通過輸入/輸出設(shè)備進(jìn)行的。一般的輸入/輸出設(shè)備都是機(jī)械的或機(jī)電相結(jié)合的產(chǎn)物,比如常規(guī)的外設(shè)有鍵盤、顯示器、打印機(jī)、掃描儀、磁盤機(jī)、鼠標(biāo)器等,它們相對于高速的中央處理器來說,速度要慢得多。此外,不同外設(shè)的信號形式、數(shù)據(jù)格式也各不相同。因此,外部設(shè)備不能與CPU直接相連,需要通過相應(yīng)的電路來完成它們之間的速度匹配、信號轉(zhuǎn)換,并完成某些控制功能。通常把介于主機(jī)和外設(shè)之間的一種緩沖電路稱為I/O接口電路,簡稱I/O接口(Interface)。

2.3.2輸入/輸出(I/O)端口每個(gè)接口電路中都包含一組寄存器,CPU和外設(shè)進(jìn)行信息交換時(shí),各類信息在接口中存入不同的寄存器,一般稱這些寄存器為I/O端口,簡稱為口(Port)。用來保存CPU和外設(shè)之間傳送的數(shù)據(jù)(如數(shù)字、字符及某種特定的編碼等)、對輸入/輸出數(shù)據(jù)起緩沖作用的數(shù)據(jù)寄存器稱為數(shù)據(jù)端口;用來存放外設(shè)或者接口部件本身狀態(tài)的狀態(tài)寄存器稱為狀態(tài)端口;用來存放CPU發(fā)往外設(shè)的控制命令的控制寄存器稱為控制端口。正如每個(gè)存儲單元都有一個(gè)物理地址一樣,每個(gè)端口也有一個(gè)地址與之相對應(yīng),該地址稱為端口地址。有了端口地址,CPU對外設(shè)的輸入/輸出操作實(shí)際上就是對I/O接口中各端口的讀/寫操作。接口和端口是兩個(gè)不同的概念,若干個(gè)端口加上相應(yīng)的控制電路才構(gòu)成接口。2.3.2輸入/輸出(I/O)端口的編址8086/8088微型計(jì)算機(jī)系統(tǒng)I/O端口與內(nèi)存單元采用獨(dú)立編址的方式。

在這種編址方式中,建立了兩個(gè)地址空間,一個(gè)為內(nèi)存地址空間,一個(gè)為I/O地址空間。內(nèi)存地址空間和I/O地址空間是相對獨(dú)立的,通過控制總線來確定CPU到底要訪問內(nèi)存還是I/O端口。為確??刂瓶偩€發(fā)出正確的信號,除了要有訪問內(nèi)存的指令之外,系統(tǒng)還要提供用于CPU與I/O端口之間進(jìn)行數(shù)據(jù)傳輸?shù)妮斎?輸出指令。在8086/8088系統(tǒng)中,共有20根地址線對內(nèi)存尋址,內(nèi)存的地址范圍是00000H~FFFFFH;用地址總線的低16位對I/O端口尋址,所以I/O端口的地址范圍從0000H~FFFFH。CPU在訪問內(nèi)存和外設(shè)時(shí),使用了不同的控制信號來加以區(qū)分。

匯編語言程序設(shè)計(jì)第1章概述第2章8086CPU匯編程序設(shè)計(jì)環(huán)境第3章8086微處理器的指令系統(tǒng)第4章8086匯編語言第5章8086匯編語言基本程序設(shè)計(jì)第6章輸入/輸出程序設(shè)計(jì)第7章32位匯編語言

第3章

8086微處理器的指令系統(tǒng)3.18086CPU的尋址方式3.28086指令系統(tǒng)3.18086CPU的尋址方式微機(jī)中的每條指令由兩部分組成:操作碼字段和地址碼字段操作碼字段:指示計(jì)算機(jī)所要執(zhí)行的操作,即指令操作的性質(zhì)。比如加、減運(yùn)算等。操作數(shù)字段(地址碼):指出在指令執(zhí)行操作中所需要的操作對象信息,它既可以是操作數(shù)本身,也可以是操作數(shù)地址或地址的一部分,還可以是指向操作數(shù)地址的指針或其他有關(guān)操作數(shù)的信息。3.1.1操作數(shù)的種類指令中操作數(shù)的種類有:(1)立即操作數(shù):指令要操作的數(shù)據(jù)在指令代碼中,稱此數(shù)據(jù)為立即數(shù)。(2)存儲器操作數(shù):指令要操作的數(shù)據(jù)在存儲器(內(nèi)存)中,稱此數(shù)據(jù)為存儲器操作數(shù)。(3)寄存器操作數(shù):指令要操作的數(shù)據(jù)在CPU的寄存器中,稱此數(shù)據(jù)為寄存器操作數(shù)。(4)I/O端口操作數(shù):操作的數(shù)據(jù)在I/O端口中,稱此數(shù)據(jù)為I/O端口操作數(shù)。在8086/8088微機(jī)匯編指令中,操作數(shù)有零個(gè)、一個(gè)和兩個(gè)三種形式。對于有兩個(gè)操作碼的指令,一個(gè)稱為源操作數(shù),該操作數(shù)在指令執(zhí)行過程中不改變原值。另一個(gè)稱為目標(biāo)(目的)操作數(shù),該操作數(shù)指令執(zhí)行后一般被其結(jié)果替代。對應(yīng)只有一個(gè)操作數(shù)的指令,該操作數(shù)為源操作數(shù)或?yàn)槟繕?biāo)操作數(shù)。3.1.2與數(shù)據(jù)有關(guān)指令的尋址方式1.立即尋址方式操作數(shù)就包含在指令中,它作為指令的一部分,跟在操作碼后存放在代碼前。這種操作數(shù)稱為立即數(shù)。立即數(shù)可以是8位,也可以是16位,如果操作數(shù)位16位,操作數(shù)代碼在存儲器單元中存放時(shí)按照低地址存放低字節(jié),高地址存放高字節(jié)的原則。

操作數(shù)(為一常數(shù))直接由指令給出

(此操作數(shù)稱為立即數(shù))

立即尋址只能用于源操作數(shù)2.寄存器尋址方式操作數(shù)在CPU內(nèi)部的寄存器中,指令中指定寄存器號。對于16位操作數(shù),寄存器可以是AX、BX、CX、DX,SI、DI、SP和BP等;對于8位操作數(shù),寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。3.直接尋址方式操作數(shù)在存儲器中,指令直接包含有操作數(shù)的有效地址(EA)。EA=偏移量操作數(shù)一般存放在數(shù)據(jù)段,所以操作數(shù)的地址由DS加上指令中直接給出的16位偏移量得到。如果采用段超越前綴,則操作數(shù)也可含在數(shù)據(jù)段外其他段中。例:設(shè)數(shù)據(jù)段寄存器DS中的內(nèi)容為1000H,偏移量1234H的字存儲單元中的內(nèi)容為5678H,那么在執(zhí)行指令“MOVAX,[1234H]”后寄存器AX的內(nèi)容是5678H,圖3.4是此指令的存儲和執(zhí)行情況。例3.3TABLE是在數(shù)據(jù)段定義的一個(gè)字節(jié)數(shù)組的首地址的變量名,其偏移量為1000H,則指令

MOVAL,TABLE 或MOVAL,[TABLE]或MOVAL,[1000H]上述三種表示方式操作結(jié)果相同,一般常用第一種方式表示。4.寄存器間接尋址方式操作數(shù)在存儲器中,操作數(shù)的有效地址在SI、DI、BX和BP這四個(gè)寄存器之一中,在一般情況(即不使用段跨越前綴明確指定段寄存器)下,如果有效地址在SI、DI和BX中,則默認(rèn)以DS段寄存器的內(nèi)容為段基址;如果有效地址在BP中,則默認(rèn)以SS段寄存器的內(nèi)容為段基址。例3.4假設(shè)(DS)=2000H,(SI)=1234H,字存儲單元(21234H)=5678H,則執(zhí)行指令MOVAX,[SI]后,AX的內(nèi)容為5678H。下圖表示該指令的存儲和執(zhí)行情況。如果操作數(shù)的有效地址不是在默認(rèn)的數(shù)據(jù)段中,需要用段跨越前綴指明。例BX表示的是堆棧段的偏移量,為了存取堆棧段中的內(nèi)容,使用下面指令的寄存器間接尋址表示:

MOVDL,SS:[BX];引用的段寄存器是SS注意在書寫表示寄存器間接尋址時(shí),寄存器名一定要放在方括號中

5.寄存器相對尋址操作數(shù)在存儲器中,操作數(shù)的有效地址是一個(gè)基址寄存器(BX、BP)或變址寄存器的(SI、DI)內(nèi)容加上指令中給定的8位或16位位移量之和。即:EA=基址寄存器(或變址寄存器)的內(nèi)容+8位(或16位)位移量有效地址EA的構(gòu)成有四種組合: ①(BX)+8位(或16位)位移量 ②(BP)+8位(或16位)位移量 ③(DI)+8位(或16位)位移量 ④(SI)+8位(或16位)位移量在一般情況下,如果SI、DI或BX的內(nèi)容作為有效地值的一部分,那么引用的段寄存器默認(rèn)是DS;如果BP的內(nèi)容作為有效地值的一部分,那么引用的段寄存器默認(rèn)是SS。在指令中給定的8位或16位位移量采用補(bǔ)碼形式表示。在計(jì)算有效地址時(shí),如位移量是8位,則被符號擴(kuò)展成16位。例3.5假設(shè)

(DS)=2000H,(DI)=1234H,字存儲單元(23234H)=3456H,則執(zhí)行指令MOVAX,[DI+2000H]后,AX的內(nèi)容為3456H。下圖表示該指令的存儲和執(zhí)行情況。注意書寫時(shí)基址寄存器名或變址寄存器名一定要放在方括號中,而位移量可不寫在方括號中。下面兩條指令源操作數(shù)的尋址方式是相同的,表示的形式等價(jià)。

MOVAX,[BX+10]MOVAX,10[BX]

也可以用基址寄存器或變址寄存器與單元變量名的組合來表示寄存器相對尋址,設(shè)VAR為單元的變量名,有如下表示:

MOVAX,[BX+VAR]

MOVAX,VAR[BX]6.基址變址尋址方式操作數(shù)在存儲器中,操作數(shù)的有效地址由基址寄存器的內(nèi)容與變址寄存器的內(nèi)容相加得到。即:

EA=基址寄存器的內(nèi)容(BX、BP)+變址寄存器(DI、SI)的內(nèi)容有效地址EA的構(gòu)成有四種組合:①(BX)+(DI)②(BX)+(SI)③(BP)+(DI)④(BP)+(SI)在一般情況(即不使用段跨越前綴明確指定段寄存器)下,如果BP的內(nèi)容作為有效地址的一部分,則默認(rèn)SS的內(nèi)容為段基址,否則默認(rèn)DS的內(nèi)容為段基址。例3.6假設(shè)(DS)=1000H,(BX)=1234H,(DI)=2000H,字存儲單元(13234H)=4567H,則執(zhí)行指令MOVAX,[BX+DI]后,(AX)=4567H。下圖表示該指令的執(zhí)行情況。下面指令中,源操作數(shù)采用基址變址尋址,通過段前綴來引用段寄存器ES。

MOVAX,ES:[BX+SI]這種尋址方式適用于數(shù)組或表格處理。用基址寄存器存放數(shù)組首地址,而用變址寄存器來定位數(shù)組中的各元素,或反之。由于兩個(gè)寄存器都可以改變,所以能更加靈活的訪問數(shù)組或表格中的元素。下面的二種寫法方法是等價(jià)的。

MOVAX,[BX+DI]MOVAX,[DI][BX]7.相對基址變址尋址操作數(shù)在存儲器中,操作數(shù)的有效地址由基址寄存器之一的內(nèi)容與變址寄存器之一的內(nèi)容與指令中給定的8位或16位位移量相加得到。也即:EA=基址寄存器的內(nèi)容+變址寄存器的內(nèi)容+8位(或16位)位移量有效地址EA的構(gòu)成有四種組合:①(BX)+(DI)+8位(或16位)位移量②(BX)+(SI)+8位(或16位)位移量③(BP)+(DI)+8位(或16位)位移量④(BP)+(SI)+8位(或16位)位移量在指令中給定的8位或16位位移量采用補(bǔ)碼形式表示。在計(jì)算有效地址時(shí),如果位移量是8位,那么被帶符號擴(kuò)展成16位。例3.7假設(shè)(DS)=1000H,(BX)=1234H,(DI)=3000H,字存儲單元(14232H)=7890H,則執(zhí)行指令MOVAX,[BX+DI-2]后,(AX)=7890H。下圖表示該指令的存儲和執(zhí)行情況,位移用補(bǔ)碼表示

相對基址加變址尋址這種尋址方式的表示方法多種多樣,下面四種表示方法是等價(jià)的。

MOV AX,[BX+DI+1234H] MOVAX,1234H[BX+DI]

MOVAX,1234H,[BX][DI]

MOVAX,1234H[DI][BX]

注意后5種尋址方式都與存儲器單元有關(guān),在尋址過程中都要計(jì)算存儲器單元的有效地址EA,所以它們有時(shí)統(tǒng)稱為存儲器尋址,只是尋址方式不同,得到有效地址EA的方法不同。3.1.3與指令有關(guān)的尋址方式與指令有關(guān)的尋址方式主要如何去查找下一條將要執(zhí)行指令的地址。程序正常順序執(zhí)行時(shí),每取一條指令執(zhí)行(IP)+n→(IP),其中n為當(dāng)前正在執(zhí)行指令的字節(jié)數(shù),下一條將要執(zhí)行指令的物理地址為: 物理地址=(CS)*16+(IP)根據(jù)轉(zhuǎn)移時(shí)是否重置代碼段寄存器CS的內(nèi)容,它們又可分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移兩大類。段內(nèi)轉(zhuǎn)移是指僅重新設(shè)置指令指針I(yè)P的轉(zhuǎn)移;段間轉(zhuǎn)移是指不僅重新設(shè)置IP,而且重新設(shè)置代碼段寄存器CS的轉(zhuǎn)移,由于重置CS,所以轉(zhuǎn)移后繼續(xù)執(zhí)行的指令在另一段中。無論是段內(nèi)轉(zhuǎn)移還是段間轉(zhuǎn)移都有直接和間接兩種方式,因此有四種轉(zhuǎn)移的尋址方式。1.段內(nèi)直接尋址轉(zhuǎn)移的有效地址EA是指令中的8位或16為位移量與當(dāng)前指令指針寄存器IP內(nèi)容之和,取代當(dāng)前的IP中的內(nèi)容。轉(zhuǎn)移的有效地址為:

EA=(IP)+8位或16為位移量→IP當(dāng)轉(zhuǎn)移的位移量為8位時(shí),EA的轉(zhuǎn)移范圍在-128至+127,地址差值只要用一個(gè)字節(jié)表示,就稱為短轉(zhuǎn)移;當(dāng)轉(zhuǎn)移的位移量為16位時(shí),EA的轉(zhuǎn)移范圍在-32768~32767,地址差要用一個(gè)字表示,就稱為近轉(zhuǎn)移。注意如果短轉(zhuǎn)移以當(dāng)前執(zhí)行的轉(zhuǎn)移指令本身的IP為基準(zhǔn),那么短轉(zhuǎn)移的范圍則在-126至+129之間;如果短轉(zhuǎn)移以當(dāng)前執(zhí)行的轉(zhuǎn)移指令執(zhí)行完成后的IP為基準(zhǔn),那么短轉(zhuǎn)移的范圍則在-128至+127之間,近轉(zhuǎn)移同樣如此。短轉(zhuǎn)移和近轉(zhuǎn)移都是相對IP的內(nèi)容而言,又稱相對轉(zhuǎn)移尋址。2.段內(nèi)間接尋址轉(zhuǎn)移的有效地址EA如果指定的是16位寄存器或字存儲單元中的內(nèi)容表示,則將寄存器或字存儲單元的內(nèi)容取代當(dāng)前的IP中的內(nèi)容。轉(zhuǎn)移的有效地址為:EA=16位寄存器或字存儲器單元的內(nèi)容→IP即如果EA由16寄存器給出,則將寄存器的內(nèi)容替代IP的內(nèi)容;如果是存儲器尋址,將使用存儲器的數(shù)據(jù)尋址方式獲得的EA所指定的字存儲單元的內(nèi)容作為轉(zhuǎn)移偏移地址替代IP的內(nèi)容,將CS的內(nèi)容乘以16與IP的內(nèi)容相加得到實(shí)際的指令轉(zhuǎn)移地址。3.段間直接尋址該種尋址方式不僅用指令中直接提供的轉(zhuǎn)移偏移地址EA替代IP的內(nèi)容,而且指令同時(shí)直接提供了指令轉(zhuǎn)移目標(biāo)所在的段基址替代當(dāng)前CS的內(nèi)容,實(shí)現(xiàn)程序從一個(gè)段到另一個(gè)段的轉(zhuǎn)移。4.段間間接尋址該種尋址方式是根據(jù)存儲器的數(shù)據(jù)尋址方式獲得EA,將EA所指定的雙字存儲單元的內(nèi)容的替代當(dāng)前的IP和CS值,即將第一個(gè)存儲字單元內(nèi)容替代IP的內(nèi)容,將第二個(gè)存儲字單元內(nèi)容替代CS的內(nèi)容。注意段內(nèi)轉(zhuǎn)移的尋址方式只改變IP的內(nèi)容,而不改變當(dāng)前段寄存器CS中的內(nèi)容,即實(shí)現(xiàn)段內(nèi)的64KB范圍內(nèi)的轉(zhuǎn)移;而段間轉(zhuǎn)移的尋址方式不僅改變IP的內(nèi)容,而且改變當(dāng)前段寄存器CS的內(nèi)容,實(shí)現(xiàn)段和段之間的轉(zhuǎn)移,轉(zhuǎn)移范圍超出64K范圍以外,對8086微機(jī)而言,可以實(shí)現(xiàn)1M范圍的任意位置的轉(zhuǎn)移。3.28086指令系統(tǒng)8086/8088的指令系統(tǒng)可分為如下六個(gè)功能組: (1)數(shù)據(jù)傳送指令; (2)算術(shù)運(yùn)算指令; (3)邏輯運(yùn)算指令; (4)串處理指令; (5)程序轉(zhuǎn)移指令; (6)處理機(jī)控制與雜項(xiàng)操作指令。對于每一條指令,在學(xué)習(xí)過程中重點(diǎn)注意以下幾點(diǎn):1)指令的功能和操作過程;2)適用于指令的操作數(shù)尋址方式;3)指令對標(biāo)志的影響;4)使用說明。3.2.1數(shù)據(jù)傳送指令8086/8088有4類傳送指令,分別是:①通用傳送指令,②累加器專用傳送指令,③地址傳送指令,④標(biāo)志傳送指令。數(shù)據(jù)傳送指令共有12條:MOV、PUSH、POP、XCHG、XLAT、LEA、LDS、LES、LAHF、SAHF、PUSHF、POPF1.傳送指令MOV(move)

指令格式:MOVDEST,SRC

操作:此指令把一個(gè)字節(jié)或一個(gè)字從源操作數(shù)SRC送至目標(biāo)操作數(shù)DST。

DEST←(SRC)

受影響的狀態(tài)標(biāo)志位:沒有說明:(1)指令中DEST和SRC不能同時(shí)為存儲器操作數(shù)(同時(shí)為存儲器尋址方式得到的操作數(shù),串操作指令除外);(2)CS不能做為目標(biāo)操作數(shù)使用(適合所有指令);(3)段寄存器之間不能互相傳送,立即數(shù)不能直接送入段寄存器,只能間接傳送;(4)要求傳送數(shù)據(jù)的類型一致,即8位之間傳送或16位之間傳送;(5)立即數(shù)永遠(yuǎn)不能作為目標(biāo)操作數(shù)(適合所有指令);(6)指令指針I(yè)P不能作為寄存器使用;(7)兩操作數(shù)不能同時(shí)為立即數(shù)。 以上這些說明規(guī)定不僅適用于MOV指令,也同樣適用于所有涉及到操作數(shù)的指令。

例3.8 MOVAH,AL MOVBP,AX MOVAX,CS MOVAL,12H MOVSI,-5 MOVVAR1,123;VAR1是變量名,代表一個(gè)存儲單元

MOVVAR2,3456H ;VAR2是一個(gè)字變量

MOV[SI],6543H如果要在兩個(gè)存儲單元件傳送數(shù)據(jù),那么可利用通用寄存器過渡的方法進(jìn)行。例把字變量VAR1的內(nèi)容送到字變量VAR2中,指令如下:

MOVAX,VAR1 MOVVAR2,AX這種利用通用寄存器間接傳送的方法,可以實(shí)現(xiàn)段寄存器間的數(shù)據(jù)傳送。例:MOVAX,CS;把CS的內(nèi)容送到DS MOVDS,AX以下的指令是不正確的。MOV

BL,AX ;操作數(shù)的類型不一致MOV

ES,DS ;段寄存器之間不能互相傳送MOV

CS,AX ;不能為CS傳送數(shù)據(jù)MOV

DS,100H ;立即數(shù)不能直接送入段寄存器MOV

100H,AX ;立即數(shù)不能為目的操作數(shù)

MOV

VAR1,VAR2;兩個(gè)操作數(shù)不能同時(shí)為存儲器操作數(shù)

MOV[SI],[DI] ;同上2.進(jìn)棧指令PUSH(pushwordontostack)指令格式:PUSH SRC

操作:(1)堆棧指針寄存器減2 SP←SP-2(2)將給定的操作數(shù)存放到由SP指出的棧頂中。

(SP+1,SP)←(SRC)

受影響的狀態(tài)標(biāo)志位:沒有 說明:PUSH指令的目標(biāo)地址一定在當(dāng)前堆棧中。SS內(nèi)容為段基址,偏移量由堆棧指針寄存器SP給u出。操作數(shù)一定是16位的寄存器或存儲器操作數(shù)。例3.10設(shè)當(dāng)前(SS)=2000H,(SP)=00FEH,執(zhí)行下列指令:

MOV AX,1234H PUSH AX指令執(zhí)行后(SS)=2000H,(SP)=00FCH,指令執(zhí)行過程如圖所示。3.出棧指令POP(popwordoffstackintodestination)指令格式:POP DEST操作:(1)將堆棧棧頂中存放的字傳送到操作數(shù)中。

DEST←(SP+1,SP)(2)堆棧指針寄存器加2 SP←SP+2受影響的狀態(tài)標(biāo)志位:沒有說明:目標(biāo)操作數(shù)只能是16位的存儲器單元或寄存器操作數(shù)(CS除外)。例3.11設(shè)當(dāng)前(SS)=2000H,(SP)=00FEH,(200FEH)=5678H,執(zhí)行下列指令:

MOV CX,1234H POP CX指令執(zhí)行后(CX)=5678H,指令執(zhí)行過程的堆棧變化如圖所示。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法 4.交換指令XCHG(exchange)指令格式:XCHG DEST,SRC

操作:DEST的內(nèi)容與SRC的內(nèi)容互換。

(DEST)←→(SRC)受影響的狀態(tài)標(biāo)志位:沒有說明:(1)DEST和SRC不能同時(shí)為存儲器操作數(shù),必須有一個(gè)為寄存器操作數(shù);(2)不允許使用段寄存器;(3)可以為立即數(shù)之外的任意尋址方式。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法例3.12設(shè)(AX)=1234H,(BX)=4567H,則執(zhí)行指令XCHGAX,BX后,(AX)=4567H,(BX)=1234H。如果不采用交換指令,實(shí)現(xiàn)上述操作,則需要三條指令即:

MOVDX,AXMOVAX,BXMOVBX,DX 5.換碼指令XLAT指令格式:XLAT

操作:首先將BX中的內(nèi)容與AL的內(nèi)容之和作為操作的存儲單元的有效地址,然后將該地址單元中的內(nèi)容送到AL中。

AL←((BX)+(AL))受影響的狀態(tài)標(biāo)志位:沒有說明:XLAT指令主要用于查表。表的起始地址即表頭地址由BX給出,AL中的操作前的內(nèi)容是要尋址的表中相對于表頭起始地址的位移量,規(guī)定表中第一個(gè)字節(jié)的位移量為0。操作結(jié)果是把AL的內(nèi)容作為相對于BX給出表頭地址的偏移量所指定單元中的內(nèi)容送入AL中,BX是基址寄存器,AL是變址寄存器,所以該指令相當(dāng)于基址變址尋址方式,主要用于代碼轉(zhuǎn)換,如字符和對應(yīng)的ASCII碼之間的轉(zhuǎn)換等。

除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法例3.13設(shè)(DS)=2000H,在TABLE表中存放0~9的ASCII碼,若(AL)=3,則通過下列指令可取得3的ASCII碼:MOVBX,OFFSETTABLE ;取TABLE變量的偏移地址,(BX)=0040HMOVAL,3XLAT指令執(zhí)行后(AL)=33H,指令執(zhí)行過程的操作如圖所示。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法6.取有效地址指令LEA(loadeffectiveaddress)

指令格式:LEA DEST,SRC操作:將指令中給出的存儲器操作數(shù)的有效地址(即地址的偏移量)送到指定的寄存器中。

DEST←EA受影響的狀態(tài)標(biāo)志位:沒有說明:LEA指令是將源操作數(shù)的偏移地址,即有效地址傳送到目標(biāo)操作數(shù)中。源操作數(shù)必須是一個(gè)存儲器操作數(shù),即SRC是除立即數(shù)和寄存器外的任意一種尋址方式,目標(biāo)操作數(shù)可以是任一16位通用寄存器,該指令通常用來建立串操作指令所須的寄存器指針。

除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法7.加載數(shù)據(jù)段寄存器指令LDS(loaddatasegmentregister)

指令格式:LDSDEST,SRC操作:完成一個(gè)地址指針的傳送。地址指針包括數(shù)據(jù)段的段基址和偏移地址。

(1)將雙字長存儲器操作數(shù)中的低地址字傳送到指定的寄存器DEST中。

(2)將雙字長存儲器操作數(shù)中的高地址字傳送到DS寄存器中。

DEST←(EA),DS←(EA+2)受影響的狀態(tài)標(biāo)志位:沒有說明:LDS是將SRC指出的連續(xù)兩個(gè)字的內(nèi)容,即一個(gè)32位的指針變量傳送到一對16位的目標(biāo)寄存器中。高位字為段基址,LDS指令將其傳送到數(shù)據(jù)段寄存器DS中,低位字為偏移地址,傳送到由DEST指出的一個(gè)通用寄存器,指針寄存器或變址寄存器中,但不能是段寄存器除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法8.加載附加段寄存器指令LES(loaddatasegmentregister)

指令格式:LES DEST,SRC操作:完成一個(gè)地址指針的傳送。地址指針包括附加段的段基址和偏移地址。

(1)將雙字長存儲器操作數(shù)中的低地址字傳送到指定的寄存器DEST中。

(2)將雙字長存儲器操作數(shù)中的高地址字傳送到ES寄存器中。

DEST←(EA),ES←(EA+2)受影響的狀態(tài)標(biāo)志位:沒有說明:LES是將SRC指出的連續(xù)兩個(gè)字的內(nèi)容,即一個(gè)32位的指針變量傳送到一對16位的目標(biāo)寄存器中。高位字為段基址,LES指令將其傳送到附加段寄存器ES中,低位字為偏移地址,傳送到由DEST指出的一個(gè)通用寄存器,指針寄存器或變址寄存器中,但不能是段寄存器。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法9.取標(biāo)志指令LAHF(loadAHfromflags)

指令格式:LAHF操作:標(biāo)志寄存器低8位的狀態(tài)標(biāo)志位填寫在AH寄存器的相應(yīng)位中。

AH←SF:ZF:×:AF:×:PF:×:CF 受影響的狀態(tài)標(biāo)志位:沒有說明:此指令在80x86中幾乎無用,主要是為了保證與8080/8085向下兼容,才保留了該指令。除此以外,對應(yīng)不同需求,各人亦開發(fā)了不同的編碼方法10.存標(biāo)志指令SAHF(storeAHintoflags)

指令匯編格式:SAHF操作:將AH寄存器中的相應(yīng)位傳送到狀態(tài)標(biāo)志寄存器相應(yīng)位中。

SF:ZF:×:AF:×:PF:×:CF←AH受影響的狀態(tài)標(biāo)志位:SF,ZF,AF,PF,CF說明:此指令在80x86中幾乎無用,主要是為了保證與8080/8085向下兼容,才保留了該指令。例3.14執(zhí)行如下指令

MOVAH,0CH SAHF指令執(zhí)行后CF=1,PF=0,

溫馨提示

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

評論

0/150

提交評論