• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            思勤無邪

            上學(xué)時(shí),因我年齡最小,個(gè)頭也最小,上課時(shí),就像大猩猩堆里的猴一般。如今,這猴偶爾也把最近的一些情況寫在這里。

               :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              132 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

            公告

                 吾日常三省吾身,曰思、曰勤、曰無邪。

            積分與排名

            • 積分 - 184826
            • 排名 - 140

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            ??? 學(xué)習(xí)清華大學(xué)計(jì)算機(jī)系網(wǎng)絡(luò)課程中的匯編語言程序設(shè)計(jì)。準(zhǔn)備花兩周來學(xué)習(xí),這周主要是理論知識(shí),下周加以實(shí)踐,寫一些Demo。

            12-17:
            ??? ★ 第一章 基礎(chǔ)知識(shí)
            ??????? ◇第一節(jié) 進(jìn)位計(jì)數(shù)制
            ??????? ◇第二節(jié) 不同基數(shù)的數(shù)之間的轉(zhuǎn)換
            ??????? ◇第三節(jié) 二進(jìn)制數(shù)和十六進(jìn)制數(shù)的運(yùn)算
            ??????? ◇第四節(jié) 數(shù)和字符的表示
            ??? ★ 第二章 8086計(jì)算機(jī)組織
            ??????? ◇第一節(jié) 80x86微處理器系列概況
            ??????? ◇第二節(jié) 基于8086的微計(jì)算機(jī)系統(tǒng)
            ??????? ◇第三節(jié) 8086寄存器組
            ??????? ◇第四節(jié) 8086微處理器的存儲(chǔ)器管理?
            ??????? ◇第五節(jié) 外部設(shè)備?
            ??? ★ 第三章 8086的尋址方式和指令系統(tǒng)?
            ??????? ◇第一節(jié) 8086的尋址方式
            ??????? ◇第二節(jié) 機(jī)器語言指令的轉(zhuǎn)換
            ??????? ◇第三節(jié) 8086的指令系統(tǒng)
            12-18:
            ??? ★ 第四章 匯編語言程序格式?
            ??????? ◇第一節(jié) 匯編程序功能
            ??????? ◇第二節(jié) 偽指令
            ??????? ◇第三節(jié) 匯編語言程序格式
            ??????? ◇第四節(jié) 匯編語言程序的上機(jī)過程?
            12-19:
            ??? ★ 第五章 循環(huán)與分支程序設(shè)計(jì)?
            ??????? ◇第一節(jié) 循環(huán)程序設(shè)計(jì)
            ??????? ◇第二節(jié) 分支程序設(shè)計(jì)
            12-20:
            ??? ★ 第六章 子程序結(jié)構(gòu)?
            ??????? ◇第一節(jié) 子程序的設(shè)計(jì)方法
            ??????? ◇第二節(jié) 嵌套與遞歸子程序
            ??????? ◇第三節(jié) 子程序舉例
            12-21:
            ??? ★ 第七章 高級(jí)匯編語言技術(shù)?
            ??????? ◇第一節(jié) 宏匯編
            ??????? ◇第二節(jié) 重復(fù)匯編
            ??????? ◇第三節(jié) 條件匯編
            ??????? ◇第四節(jié) 高級(jí)語言結(jié)構(gòu)?
            12-22:
            ??? ★ 第八章 輸入/輸出程序設(shè)計(jì)?
            ??????? ◇第一節(jié) I/O設(shè)備的數(shù)據(jù)傳送方式
            ??????? ◇第二節(jié) 程序直接控制I/O方式
            ??????? ◇第三節(jié) 中斷傳送方式
            12-23:
            ??? ★ 第九章 BIOS和DOS中斷?
            ??????? ◇第一節(jié) 鍵盤I/O
            ??????? ◇第二節(jié) 顯示器I/O
            ??????? ◇第三節(jié) 打印機(jī)I/O
            ??????? ◇第四節(jié) 串行通信口I/O?
            ??? ★ 第十章 模塊化程序設(shè)計(jì)?
            ??????? ◇第一節(jié) 匯編程序概述
            ??????? ◇第二節(jié) 連接程序及對(duì)程序設(shè)計(jì)的要求
            ??????? ◇第三節(jié) 匯編語言程序與高級(jí)語言程序的連接
            ??????? ◇第四節(jié) 模塊化程序設(shè)計(jì)概述??
            下周的計(jì)劃:
            ??? ★ 第十一章 80x86匯編語言簡(jiǎn)介?
            ??????? ◇第一節(jié) 80x86的寄存器結(jié)構(gòu)
            ??????? ◇第二節(jié) 80x86的指令系統(tǒng)和尋址方式
            ??????? ◇第三節(jié) 80x86處理器選擇偽操作
            ??????? ◇第四節(jié) 保護(hù)模式下的80x86?
            ??????? ◇第五節(jié) 虛擬8086(V86)方式
            ??????? ◇第六節(jié) 保護(hù)方式下的中斷處理?
            ?

            Feedback

            # 2006-12-17 筆記 2006-12-17 10:27 思勤無邪
            第一章 基礎(chǔ)知識(shí)

            1.1 進(jìn)位計(jì)數(shù)制

            1.2 不同基數(shù)的數(shù)之間的轉(zhuǎn)換
            1.2.1 二進(jìn)制數(shù)和十進(jìn)制數(shù)之間的轉(zhuǎn)換
            1.2.1.1 二進(jìn)制轉(zhuǎn)換為十進(jìn)制
                各位按權(quán)求和
            1.2.1.2 十進(jìn)制轉(zhuǎn)換為二進(jìn)制
                除2取余
            1.2.2 二進(jìn)制和十六進(jìn)制數(shù)之間的轉(zhuǎn)換
                對(duì)于一個(gè)二進(jìn)數(shù),將它從低位到高位每4位一組,每組用一個(gè)十六進(jìn)制數(shù)來表示。
                對(duì)于一個(gè)十六進(jìn)制數(shù),將它的每一位用4位二進(jìn)制數(shù)表示。
                例: 0011  0101  1011 1111 
                      3   5   B   F 
                     即 0011010110111111B = 35BFH

                例: A    1    9   C 
                    1010  0001  1001 1100 
                    即 A19CH = 1010000110011100B
            1.2.3 十六進(jìn)制和十進(jìn)制之間的轉(zhuǎn)換
            1.2.3.1 十六進(jìn)制轉(zhuǎn)換為十進(jìn)制
                    各位按權(quán)求各
            1.2.3.2 十進(jìn)制轉(zhuǎn)換為十六進(jìn)制
                    除16取余

            1.3 二進(jìn)制數(shù)和十六進(jìn)制數(shù)的運(yùn)算

            1.4 數(shù)和字符的表示
            1.4.1 計(jì)算機(jī)中數(shù)的表示
            1.4.1.1 補(bǔ)碼表示法
                原碼:最高位為符號(hào)位。0的表示不唯一
                反碼:正數(shù)的反碼同原碼,負(fù)數(shù)的反碼數(shù)值位與原碼相反。0的表示不唯一。
                補(bǔ)碼:正數(shù)的補(bǔ)碼與原碼相同;負(fù)數(shù)的補(bǔ)碼表示:相應(yīng)的正數(shù)按位求反,末位加1。
                符號(hào)擴(kuò)展:是指一個(gè)數(shù)從位數(shù)較少擴(kuò)展到位數(shù)較多,如從8位擴(kuò)展到16位,或從16位擴(kuò)展到32位。
                對(duì)于用補(bǔ)碼表示的數(shù),正數(shù)的符號(hào)擴(kuò)展在前面補(bǔ)0,負(fù)數(shù)的符號(hào)擴(kuò)展在前面補(bǔ)1,假設(shè)機(jī)器字長(zhǎng)為16位,[+46]補(bǔ)碼 = 002EH,[-46]補(bǔ)碼 = FFD2H。
            1.4.1.2 n位補(bǔ)碼的表數(shù)范圍
                n位補(bǔ)碼的表數(shù)范圍N是:
                -2的n-1次方 <= N <= 2的n-1次方-1
                如:用8位二進(jìn)制補(bǔ)碼表示帶符號(hào)的數(shù)的表數(shù)范圍是-128 <= N <= 127
            1.4.1.3 補(bǔ)碼的加、減法
                在機(jī)器里,補(bǔ)碼減法是通過對(duì)減數(shù)求補(bǔ)后把減法轉(zhuǎn)換為加法進(jìn)行的。符號(hào)位參加運(yùn)算,能自動(dòng)得到正確結(jié)果。
                例:假設(shè)機(jī)器字長(zhǎng)為8位,計(jì)算25+(-32)
                    0001 1001
                  + 1110 0000
                  ------------
                    1111 1001
                結(jié)果為-7的補(bǔ)碼。
                在某些情況下,要處理的數(shù)全是正數(shù)(比如表示地址的數(shù)),就沒有必要保留符號(hào)位了,可以把最高有效位也作為數(shù)值處理,這樣的數(shù)稱為無符號(hào)數(shù)。
            1.4.2 計(jì)算機(jī)中字符的表示
                ASCII碼用一個(gè)字節(jié)(8位二進(jìn)制碼)來表示一個(gè)字符,其中低7位為字符的ASCII值,最高位一般用作校驗(yàn)位。


            第二章 8086計(jì)算機(jī)組織

            2.1 80x86微處理器系列概況

            2.2 基于8086的微計(jì)算機(jī)系統(tǒng)
            2.2.1 8086微處理器的基本組成
                1. 執(zhí)行部件(EU)
                2. 總線接口部件(BIU)
            2.2.2 微型計(jì)算機(jī)的軟件系統(tǒng)
                1. 系統(tǒng)軟件
                2. 應(yīng)用軟件

            2.3 8086寄存器組
                1. 通用寄存器
                通用寄存器包括了8個(gè)16位的寄存器:AX、BX、CX、DX、SP、BP、DI及SI。其中AX、BX、CX、DX在一般情況下作為通用的數(shù)據(jù)寄存器,用來暫時(shí)存放計(jì)算過程中所用到的操作數(shù)、結(jié)果或其他信息。它們還可分為兩個(gè)獨(dú)立的8位寄存器使用,命名為AL、AH、BL、BH、CL、CH、DL和DH。這4個(gè)通用數(shù)據(jù)寄存器除通用功能外,還有如下專門用途:
                    AX作為累加器用,所以它是算術(shù)運(yùn)算的主要寄存器。在乘除指令中指定用來存放操作數(shù)。另外,所有的I/O指令都使用AX或AL與外部設(shè)備傳送信息。
                    BX在計(jì)算存儲(chǔ)器地址時(shí),可作為基址寄存器使用。
                    CX常用來保存計(jì)數(shù)值,如在移位指令、循環(huán)指令和串處理指令中用作隱含的計(jì)數(shù)器。
                    DX在作雙字長(zhǎng)運(yùn)算時(shí),可把DX和AX組合在一起存放一個(gè)雙字長(zhǎng)數(shù),DX用來存放高16位數(shù)據(jù)。此外,對(duì)某些I/O操作,DX可用來存放I/O的端口地址。
                SP、BP、SI、DI四個(gè)16位寄存器可以象數(shù)據(jù)寄存器一樣在運(yùn)算過程中存放操作數(shù),但它們只能以字(16位)為單位使用。此外,它們更經(jīng)常的用途是在存儲(chǔ)器尋址時(shí),提供偏移地址。因此,它們可稱為指針或變址寄存器。
                    SP稱為堆棧指針寄存器,用來指出棧頂?shù)钠频刂贰?
                    BP稱為基址指針寄存器,在尋址時(shí)作為基地址寄存器使用,但它必須與堆棧段寄存器SS聯(lián)用來確定堆棧段中的存儲(chǔ)單元地址。
                    SI為源變址寄存器,在串處理指令中,SI作為隱含的源變址寄存器與DS聯(lián)用,以確定數(shù)據(jù)段中的存儲(chǔ)單元地址,并有自動(dòng)增量和自動(dòng)減量的變址功能。
                    DI為目的變址寄存器,在串處理指令中,DI和附加段寄存器ES聯(lián)用,以達(dá)到在附加段中尋址的目的,然后DI自動(dòng)增量或減量。
            2. 專用寄存器
                8086的專用寄存器包括IP、SP和FLAGS三個(gè)16位寄存器。
                IP為指令指針寄存器,它用來存放將要執(zhí)行的下一條指令地址的偏移量,它與段寄存器CS聯(lián)合形成代碼段中指令的物理地址。
                SP為堆棧指針寄存器,它與堆棧段寄存器聯(lián)用來確定堆棧段中棧頂?shù)牡刂罚簿褪钦fSP用來存放棧頂?shù)钠频刂贰?
                FLAGS為標(biāo)志寄存器,這是一個(gè)存放條件碼標(biāo)志、控制標(biāo)志的16位寄存器。
            3. 段寄存器
                8086微處理器共有4個(gè)16位的段寄存器,在尋址內(nèi)存單元時(shí),用它們直接或間接地存放段地址。
                    代碼段寄存器CS:存放當(dāng)前執(zhí)行的程序的段地址。
                  數(shù)據(jù)段寄存器DS:存放當(dāng)前執(zhí)行的程序所用操作數(shù)的段地址。
                  堆棧段寄存器SS:存放當(dāng)前執(zhí)行的程序所用堆棧的段地址。
                  附加段寄存器ES:存放當(dāng)前執(zhí)行程序中一個(gè)輔助數(shù)據(jù)段的段地址。

            2.4 8086微處理器的存儲(chǔ)器管理
                1.存儲(chǔ)單元的地址和內(nèi)容
                在存儲(chǔ)器里以字節(jié)為編址單位,地址在機(jī)器中用無符號(hào)二進(jìn)制數(shù)表示。
                對(duì)于字、雙字、四字?jǐn)?shù)據(jù)類型,其低地址中存放低位字節(jié)數(shù)據(jù),高地址中存放高位字節(jié)數(shù)據(jù)。在讀寫數(shù)據(jù)時(shí)只需給出最低單元的地址號(hào)即可,然后依次存取后續(xù)字節(jié)。所以,同一個(gè)地址既可看作字節(jié)單元的地址,又可看作字單元、雙字單元或4字單元的地址,這要根據(jù)使用時(shí)的情況來確定。而且多字節(jié)數(shù)據(jù)在存儲(chǔ)器中是"逆序存放"的。
                在8086中,訪問存儲(chǔ)器(要求取數(shù)或存數(shù))都是以字為單位進(jìn)行的,也就是說,機(jī)器是以偶地址訪問存儲(chǔ)器的。這樣,對(duì)于奇地址的字單元,要取一個(gè)字需要訪問二次存儲(chǔ)器,這就需要花費(fèi)較多的時(shí)間。
            2.存儲(chǔ)器分段管理
                在8086中,物理地址是指由地址引線送出的20位地址碼。這20位地址碼送到存儲(chǔ)器經(jīng)過譯碼,最終選定一個(gè)存儲(chǔ)單元進(jìn)行讀/寫。
                偏移地址是相對(duì)于某段首地址的段內(nèi)偏移量。
                邏輯地址是在程序中對(duì)存儲(chǔ)器地址的一種表示方法,由某段的段地址和段內(nèi)偏移地址組成。寫成:段地址 : 偏移地址。
                存儲(chǔ)器地址分段的具體做法是:把1MB的存儲(chǔ)器空間分成若干段,每段的容量最大64KB,這樣段內(nèi)地址就可以用16位來表示。實(shí)際上,可以根據(jù)編程的需要來確定段的大小,它可以是64K字節(jié)范圍內(nèi)的任意多個(gè)字節(jié)。
              8086規(guī)定:從0地址開始,每16個(gè)字節(jié)為一小段,段的起始地址必須從任一小段(paragraph)的首地址開始,也就是說,段地址表示成20位的二進(jìn)制地址碼,其最低4位必須是"0"。
              存儲(chǔ)器采用分段管理后,每個(gè)段的首地址(稱為段基地址或段地址)保存在8086內(nèi)部的CS、DS、SS和ES四個(gè)16位的寄存器中,可以對(duì)段寄存器設(shè)置不同的值以指向不同的段。
                16位的段地址和16位的偏移地址組合形成20位的物理地址,這就是8086的工作方式,這在80x86的尋址模式中稱為實(shí)模式。
            2.5 外部設(shè)備
                外部設(shè)備與主機(jī)(微處理器和存儲(chǔ)器)的通信是通過外設(shè)接口進(jìn)行的。每個(gè)接口包括一組寄存器。一般說來,這些寄存器有三種不同的用途:
                  1. 數(shù)據(jù)寄存器:用來存放要在外設(shè)和主機(jī)間傳送的數(shù)據(jù),這種寄存器實(shí)際上起緩沖器的作用。
                  2. 狀態(tài)寄存器:用來保存外部設(shè)備或接口的狀態(tài)信息,以便微處理器在必要時(shí)測(cè)試外設(shè)狀態(tài),了解外設(shè)的工作情況。 
                  3. 命令寄存器:CPU給外設(shè)或接口的控制命令通過此寄存器送給外部設(shè)備。例如,CPU要啟動(dòng)磁盤工作,必須發(fā)出啟動(dòng)命令等。
              各種外部設(shè)備都有以上三種類型的寄存器,只是每個(gè)接口所配備的寄存器數(shù)量是根據(jù)設(shè)備的需要確定的。
              為了便于主機(jī)訪問外設(shè),外設(shè)中的每個(gè)寄存器給予一個(gè)端口地址(又稱端口號(hào)),由這些端口地址組成了一個(gè)獨(dú)立于內(nèi)存儲(chǔ)器的I/O地址空間。80x86的I/O地址空間可達(dá)64KB,所以端口地址的范圍是0000~FFFFH,用16位二進(jìn)制代碼來表示。端口可以是8位或16位。
              在80x86系列機(jī)中,由于I/O地址空間是獨(dú)立編址的,所以系統(tǒng)提供了訪問外設(shè)的輸入/輸出指令I(lǐng)N和OUT。
              為了便于用戶使用外設(shè),8086提供了兩種類型的例行程序供用戶調(diào)用。一種是BIOS(Basic Input/Output System),另一種是DOS(Disk Operating System)功能調(diào)用。它們都是系統(tǒng)編制的子程序,通過中斷方式轉(zhuǎn)入所需要的子程序去執(zhí)行。


            第三章 8086的尋址方式和指令系統(tǒng)
            3.1 8086的尋址方式
                計(jì)算機(jī)中的指令由操作碼字段和操作數(shù)字段兩部分組成。
                操作數(shù)字段可以有一個(gè)、二個(gè)或三個(gè),通常稱為一地址、二地址或三地址指令。
            3.1.1 與數(shù)據(jù)有關(guān)的尋址方式
            3.1.1.1 立即尋址方式(Immediate addressing)
                操作數(shù)直接存放在指令中,緊跟在操作碼之后,它作為指令的一部分存放在代碼段里,這種操作數(shù)稱為立即數(shù)。
                如:MOV AX, 3064H
                 指令執(zhí)行后,(AX)= 3064H
                不能直接給段寄存器和標(biāo)志寄存器賦予立即數(shù)。如:MOV DS, 1250H是錯(cuò)誤的。
            3.1.1.2 寄存器尋址方式(Register addressing)
                它使用寄存器來存放要處理的操作數(shù),寄存器號(hào)由指令指定。
                如:MOV  AX, BX
                源寄存器和目的寄存器的位數(shù)必須一致。如:MOV CL, BX是錯(cuò)誤指令。
            有效地址EA(Effective Address)的概念:在8086里,把操作數(shù)的偏移地址稱為有效地址。
            3.1.1.3 直接尋址方式(Direct addressing)
                操作數(shù)存放在存儲(chǔ)單元中,而這個(gè)存儲(chǔ)單元的有效地址就在指令的操作碼之后,操作數(shù)的物理地址可通過((DS)×16)再加上這個(gè)有效地址形成。
                在匯編語言指令中,可以用符號(hào)地址(變量名或標(biāo)號(hào))代替數(shù)值地址。
              例如: MOV AX, DATA
                或 MOV AX, [DATA]
                這里DATA是存放操作數(shù)單元的符號(hào)地址。
                直接尋址方式默認(rèn)操作數(shù)在數(shù)據(jù)段中,如果操作數(shù)定義在其它段中,則應(yīng)在指令中指定段跨越前綴。
              例如: MOV AX, ES:NUMBER
                或 MOV AX, ES:[NUMBER]
                這里NUMBER是附加段中的字變量。
            3.1.1.4 寄存器間接尋址方式(Register indirect addressing)
                這種尋址方式通過基址寄存器BX、BP或變址寄存器SI、DI來保存操作數(shù)的有效地址。如果指令中使用的寄存器是SI、DI和BX,則操作數(shù)在數(shù)據(jù)段中,((DS)×16)再加上存器中的有效地址形成20位物理地址;如果指令中使用的寄存器是BP,則操作數(shù)在堆棧段中,((SS)×16)再加上BP中的有效地址形成20位物理地址。
                指令中也可以指定段跨越前綴來取得其他段中的數(shù)據(jù)。
              例如:MOV AX, ES:[BX]
            3.1.1.5 寄存器相對(duì)尋址方式(Register relative addressing)
                這種尋址方式通過基址寄存器BX、BP或變址寄存器SI、DI與一個(gè)位移量相加形成有效地址,計(jì)算物理地址的缺省段仍然是SI、DI和BX為DS,BP為SS。
                如:MOV AX, COUNT[SI](也可表示為MOV AX, [COUNT+SI]),其中COUNT為16位位移量的符號(hào)地址。
            3.1.1.6 基址變址尋址方式 (Based indexed addressing)
                操作數(shù)的有效地址是一個(gè)基址寄存器(BP或BX)和一個(gè)變址寄存器(SI或DI)的內(nèi)容之和。如基址寄存器為BX時(shí),與DS形成的物理地址指向數(shù)據(jù)段;如基址寄存器為BP時(shí),與SS形成的物理地址指向堆棧段。
            3.1.1.7 相對(duì)基址變址尋址方式(Relative based indexed addressing)
                基址加變址再加上一個(gè)位移量形成操作數(shù)的有效地址。缺省段的使用仍然是DS與BX組合,SS與BP組合。這種尋址方式通常用于對(duì)二維數(shù)組的尋址。如,存儲(chǔ)器中存放著由多個(gè)記錄組成的文件,則位移量可指向文件之首,基址寄存器指向某個(gè)記錄,變址寄存器則指向該記錄中的一個(gè)元素。
                如: MOV AX, MASK[BX][SI](或 MOV AX, MASK[BX+SI],或 MOV AX, [MASK+BX+SI])
            有效地址可以由以下三種成分組成:
              · 位移量(Displacement)是存放在指令中的一個(gè)8位或16位數(shù),但它不是立即數(shù),而是一個(gè)地址。
              · 基址(Base)是存放在基址寄存器(BX或BP)中的內(nèi)容。它是有效地址中的基址部分,通常用來指向數(shù)據(jù)段中數(shù)組或字符串的首地址。 
              · 變址(Index)是存放在變址寄存器(SI或DI)中的內(nèi)容。它通常用來訪問數(shù)組中的某個(gè)元素或字符串中的某個(gè)字符。
                有效地址的計(jì)算可用下式表示:
              EA = 基址 + 變址 + 位移量
                這三種成分都可正可負(fù),以保證指針移動(dòng)的靈活性。它們?nèi)我饨M合使用,可得到不同的尋址方式。
            3.1.2 與轉(zhuǎn)移地址有關(guān)的尋址方式
            順序執(zhí)行的指令地址是由指令指針寄存器IP自動(dòng)增量形成的,而程序轉(zhuǎn)移的地址必須由轉(zhuǎn)移類指令和CALL指令指出,這類指令表示轉(zhuǎn)向地址的尋址方式包括:段內(nèi)直接尋址、段內(nèi)間接尋址、段間直接尋址、段間間接尋址。
                因?yàn)镃S:IP寄存器總是指向下一條將要執(zhí)行的指令的首地址(稱為IP當(dāng)前值),當(dāng)轉(zhuǎn)移指令執(zhí)行后,必須修改IP或CS、IP的值。當(dāng)轉(zhuǎn)移指令給出位移量時(shí),用IP當(dāng)前值加上位移量即為新的IP的值。
              SHORT轉(zhuǎn)移,稱為短轉(zhuǎn)移,位移量用一個(gè)字節(jié)(8位)來表示。位移量在-128~127字節(jié)之間。
              NEAR轉(zhuǎn)移,稱為近轉(zhuǎn)移,位移量用16位表示,因?yàn)槌绦蚩刂迫匀辉诋?dāng)前代碼段,所以只修改IP的值,CS的值不變。位移量在-32768~32767字節(jié)范圍內(nèi)。
              FAR轉(zhuǎn)移,稱為遠(yuǎn)轉(zhuǎn)移,因?yàn)槌绦蚩刂瞥隽水?dāng)前代碼段,所以CS和IP都必須修改為新的值。轉(zhuǎn)移距離超過±32K字節(jié),或是在不同段之間轉(zhuǎn)移。
              與轉(zhuǎn)移地址有關(guān)的4種尋址方式就是告訴CPU如何修改CS和IP的值,以達(dá)到控制程序轉(zhuǎn)移的目的。
            3.1.2.1 段內(nèi)直接尋址(Intrasegment direct addressing)
                這種尋址方式在指令中直接指出轉(zhuǎn)向地址,如:
                JMP SHORT NEXT 
                JMP NEAR PTR AGAIN 
                其中,NEXT和AGAIN均為轉(zhuǎn)向的符號(hào)地址。在機(jī)器指令中,操作碼之后給出的是相對(duì)于當(dāng)前IP值的位移量(轉(zhuǎn)移距離),所以,轉(zhuǎn)向的有效地址是當(dāng)前IP值與指令中給出的位移量(8位或16位)之和。
            3.1.2.2 段內(nèi)間接尋址(Intrasegment indirect addressing)
                JMP BX 
                JMP NEAR PTR [BX] 
                JMP TABLE[SI]
            3.1.2.3 段間直接尋址(Intersegment direct addressing)
                段間直接尋址和段內(nèi)直接尋址類似,指令中直接給出轉(zhuǎn)向地址,不同的是,在符號(hào)地址之前要加上表示段間遠(yuǎn)轉(zhuǎn)移的操作符FAR PTR。
                指令格式如下:
                JMP FAR PTR OUTSEG
            3.1.2.4 段間間接尋址(Intersegment indirect addressing)
                用相繼兩個(gè)字的內(nèi)容裝入IP和CS來達(dá)到段間的轉(zhuǎn)移目的的,但這兩個(gè)字的存儲(chǔ)器地址是通過指令中的數(shù)據(jù)尋址方式(除立即尋址方式和寄存器尋址方式外)來取得的。
              為了說明尋址兩個(gè)字單元,指令中必須加上雙字操作符DWORD。指令格式如下:
                JMP DWORD PTR [SI] 
                JMP DWORD PTR[TABLE+BX]
            8086機(jī)器語言指令是一種可變長(zhǎng)度的指令,一條指令可以由1~7個(gè)字節(jié)組成,這主要取決于指令的操作碼、尋址方式以及操作數(shù)長(zhǎng)度等因素。
            機(jī)器語言指令的組成
            段前綴  操作碼  尋址方式  數(shù)據(jù)/偏移量  數(shù)據(jù)/偏移量  數(shù)據(jù)  數(shù)據(jù)

            3.2 機(jī)器語言指令的轉(zhuǎn)換
            3.2.1 段前綴字節(jié)
                當(dāng)指令中沒有段前綴(如ES: )時(shí),機(jī)器指令中無此字節(jié)。段前綴字節(jié)高3位和低3位是段前綴標(biāo)志,3、4位(SEG)分別表示4個(gè)段前綴。
            3.2.2 操作碼字節(jié)
                操作碼決定微處理器執(zhí)行的操作,如,傳送、加法、減法等,它通常用機(jī)器指令的第一個(gè)字節(jié)表示。多數(shù)機(jī)器語言指令的操作碼占用一個(gè)字節(jié),有時(shí)一個(gè)字節(jié)不夠,在下一個(gè)字節(jié)再占用3位。
                操作碼字節(jié)的高6位是操作碼,它來自于機(jī)器指令表。
            3.2.3 尋址方式字節(jié)
            3.2.4 機(jī)器指令舉例

            3.2 8086指令系統(tǒng)
            3.3.1 數(shù)據(jù)傳送指令
            數(shù)據(jù)傳送指令的功能是把數(shù)據(jù)、地址傳送到寄存器或存儲(chǔ)器單元中。它分為4類。
                ⑴ 通用數(shù)據(jù)傳送指令
                 MOV  傳送
                 PUSH 進(jìn)棧
                 POP  出棧
                 XCHG 交換
                ⑵ 累加器專用傳送指令
                    IN   輸入
                    OUT  輸出
                    XLAT 換碼
              ⑶ 地址傳送指令
                 LEA  有效地址送寄存器
                 LDS  指針?biāo)图拇嫫骱虳S
                 LES  指針?biāo)图拇嫫骱虴S
                ⑷ 標(biāo)志寄存器傳送指令
                    LAHF 標(biāo)志送AH
                    SAHF AH送標(biāo)志寄存器
                    PUSHF 標(biāo)志進(jìn)棧
                    POPF 標(biāo)志出棧
            3.3.1.1 通用數(shù)據(jù)傳送指令
                MOV dst, src;傳送指令(move)
              執(zhí)行操作:(dst) ← (src)
              功能: 將源操作數(shù)(字節(jié)或字)傳送到目的地址。

                PUSH   src ; 進(jìn)棧指令(push onto the stack) 
              執(zhí)行操作: (SP) ← (SP)-2
                    ((SP)) ← (src)

              POP    dst ; 出棧指令(pop from the stack)
              執(zhí)行操作: (dst) ← ((SP))
                    (SP) ← (SP)+2

                XCHG  opr1, opr2 ; 交換指令(exchange)
              執(zhí)行操作:(opr1) ←→ (opr2)

            3.3.1.2 累加器專用傳送指令
                這組指令只限于使用累加器(ac:AX 或AL)傳送信息。
              IN  ac, port ; 輸入指令(input), port≤0FFH
              執(zhí)行操作: (AL) ← (port) 傳送字節(jié)
               或 (AX) ← (port+1,port) 傳送字

              IN  ac, DX  ; 輸入指令, DX中的port>0FFH
              執(zhí)行操作: (AL) ← ((DX)) 傳送字節(jié)
               或 (AX) ← ((DX)+1,(DX)) 傳送字

              OUT  port, ac  ; 輸出指令(output), port≤0FFH
              執(zhí)行操作: (port) ← (AL) 傳送字節(jié)
               或 (port+1,port) ← (AX) 傳送字

              OUT  DX, ac   ; 輸出指令(output), DX中的 port>0FFH
              執(zhí)行操作: ((DX)) ← (AL) 傳送字節(jié)
               或 ((DX)+1,(DX)) ← (AX) 傳送字
                例:   IN   AL, 61H   ; (AL) ← 端口61H的內(nèi)容
                  MOV   DX, 278H   ; (DX) ← 端口地址278H
                  IN   AL, DX    ; (AL) ← 端口278H的內(nèi)容

                      OUT   61H, AL   ; 61H端口 ← (AL)
                  MOV   DX, 279H   ; (DX) ← 端口地址279H
                  OUT   DX, AX    ; 279H端口 ← (AX)

                XLAT   ; 換碼指令(translate)
              執(zhí)行操作: (AL) ← ((DS)×16+(BX)+(AL))
                這條指令根據(jù)AL寄存器提供的位移量,將BX指示的字節(jié)表格中的代碼換存在AL中。
            3.3.1.3 地址傳送指令
                這組指令完成把地址送到指定寄存器的功能。
              LEA reg, src ; 有效地址送寄存器(load effective address)
              執(zhí)行操作:(reg) ← offset of src
              LEA指令把源操作數(shù)的有效地址送到指定的寄存器,這個(gè)有效地址是由src選定的一種存儲(chǔ)器尋址方式確定的。

              LDS reg, src ; 指針?biāo)图拇嫫骱虳S(load DS with point)
              執(zhí)行操作: (reg) ← (src)
                   (DS) ← (src+2)

              LES reg, src ; 指針?biāo)图拇嫫骱虴S(load ES with point)
              執(zhí)行操作: (reg) ← (src)
                   (ES) ← (src+2)
            3.3.1.4 標(biāo)志寄存器傳送指令
                LAHF 標(biāo)志寄存器的低字節(jié)送AH(load AH with flags)
               執(zhí)行操作: 
                (AH) ← (FLAGS)0-7

                SAHF AH送標(biāo)志寄存器低字節(jié)(store AH into flags)
                執(zhí)行操作: 
                (FLAGS) 0-7 ← (AH)

                PUSHF 標(biāo)志進(jìn)棧(push the flags)
               執(zhí)行操作: 
               (SP) ← (SP)-2
               ((SP)+1,(SP)) ← (FLAGS)0-15
              
                POPF 標(biāo)志出棧(pop the flags)
               執(zhí)行操作: 
               (FLAGS) 0-15 ← ((SP)+1,(SP))
               (SP) ← (SP)+2

            3.3.2 算術(shù)指令
                ⑴ 加法指令
                ADD  加法
                ADC  帶進(jìn)位加
                INC  加1
                ⑵ 減法指令
                    SUB  減法     
                    DEC  減1
                    NEG  求補(bǔ)
                    CMP  比較
              ⑶ 乘法指令
                MUL  無符號(hào)數(shù)乘法
                IMUL 帶符號(hào)數(shù)乘法
                ⑷ 除法指令
                    DIV  無符號(hào)數(shù)除法
                    IDIV 帶符號(hào)數(shù)除法
              ⑸ 符號(hào)擴(kuò)展指令
                CBW  字節(jié)轉(zhuǎn)換為字
                CWD  字轉(zhuǎn)換為雙字
                ⑹ 十進(jìn)制調(diào)整指令
                DAA  加法的十進(jìn)制調(diào)整
                DAS  減法的十進(jìn)制調(diào)整
                AAA  加法的ASCII調(diào)整
                AAS  減法的ASCII調(diào)整
                AAM  乘法的ASCII調(diào)整
                AAD  除法的ASCII調(diào)整
            3.3.2.1 加法指令
              ADD dst,src 加法指令(addition)
              執(zhí)行操作: (dst) ← (src)+(dst)

              ADC dst,src 帶進(jìn)位加指令(add with carry)
              執(zhí)行操作: (dst) ← (src)+(dst)+CF

              INC opr 加1指令(increment) 
              執(zhí)行操作: (opr) ← (opr)+1
            3.3.2.2 減法指令
              SUB dst,src 減法指令(subtract)
              執(zhí)行操作: (dst) ← (dst)-(src)

              SBB dst,src 帶借位減法指令(subtract with borrow)
              執(zhí)行操作: (dst) ← (dst)-(src)-CF

              DEC opr 減1指令(decrement)
              執(zhí)行操作: (opr) ← (opr)-1

              CMP opr1,opr2 比較指令(compare)
              執(zhí)行操作: (opr1)-(opr2),根據(jù)相減結(jié)果設(shè)置條件碼,但不回送結(jié)果
            3.3.2.3 乘法指令
              MUL  src  無符號(hào)數(shù)乘法(unsigned multiple)
              IMUL src  帶符號(hào)數(shù)乘法(signed multiple)
              字節(jié)操作: (AX) ← (AL)×(src)
              字操作:  (DX, AX) ← (AX)×(src)
            MUL和IMUL指令的區(qū)別僅在于操作數(shù)是無符號(hào)數(shù)還是帶符號(hào)數(shù),它們的共同點(diǎn)是,指令中只給出源操作數(shù)src。目的操作數(shù)是隱含的,它只能是累加器(字運(yùn)算為AX,字節(jié)運(yùn)算為AL)。隱含的乘積寄存器是AX或DX(高位)和AX(低位)。
            3.3.2.4 除法指令
               DIV  src 無符號(hào)數(shù)除法(unsigned divide)
               IDIV src 帶符號(hào)數(shù)除法(signed divide)
               字節(jié)操作: (AL) ← (AX) / src 的商
                    (AH) ← (AX) / src 的余數(shù)
               字操作: (AX) ← (DX, AX) / src 的商
                   (DX) ← (DX, AX) / src 的余數(shù)
            這兩條除法指令的被除數(shù)必須存放在AX或DX,AX中。除法指令對(duì)所有條件碼均無定義,因此對(duì)除法指令產(chǎn)生的錯(cuò)誤,如除數(shù)為0或商溢出等錯(cuò)誤,程序員都不能用條件碼進(jìn)行判斷,而是由系統(tǒng)直接轉(zhuǎn)入0型中斷來處理。
            3.3.2.5 符號(hào)擴(kuò)展指令
               CBW 字節(jié)擴(kuò)展為字(convert byte to word)
               執(zhí)行操作:
               (AH)= 00H 當(dāng)(AL)的最高有效位為0時(shí)
               (AH)= FFH 當(dāng)(AL)的最高有效位為1時(shí)

                CWD 字?jǐn)U展為雙字(convert word to double word)
               執(zhí)行操作:
               (DX)=0000H當(dāng)(AX)的最高有效位為0時(shí)
               (AH)=FFFFH當(dāng)(AX)的最高有效位為1時(shí)
            這是兩條無操作數(shù)指令,進(jìn)行符號(hào)擴(kuò)展的操作數(shù)必須存放在AL寄存器或AX寄存器中。這兩條符號(hào)擴(kuò)展指令都不影響條件碼。

             
            3.3.2.6 十進(jìn)制調(diào)整指令

              80x86微型機(jī)提供了一組十進(jìn)制調(diào)整指令,用來處理ASCII碼和BCD碼表示的數(shù)。
             
              BCD碼:
              BCD(Binary Coded Decimal)是用二進(jìn)制編碼表示的十進(jìn)制數(shù)(見表3.3),十進(jìn)制數(shù)采用0~9十個(gè)數(shù)字,是人們最常用的。在計(jì)算機(jī)中,同一個(gè)數(shù)可以用兩種BCD格式來表示:①壓縮的BCD碼 ②非壓縮的BCD碼

              壓縮的BCD碼:
              壓縮的BCD碼用4位二進(jìn)制數(shù)表示一個(gè)十進(jìn)制數(shù)位,整個(gè)十進(jìn)制數(shù)用一串BCD碼來表示。例如,十進(jìn)制數(shù)59表示成壓縮的BCD碼為0101 1001,十進(jìn)制數(shù)1946表示成壓縮的BCD碼為0001 1001 0100 0110。

              非壓縮的BCD碼:
              非壓縮的BCD碼用8位二進(jìn)制數(shù)表示一個(gè)十進(jìn)制數(shù)位,其中低4位是BCD碼,高4位是0。例如,十進(jìn)制數(shù)78表示成壓縮的BCD碼為0000 0111 0000 1000。 

               從鍵盤輸入數(shù)據(jù)時(shí),計(jì)算機(jī)接收的是ASCII碼,要將ASCII碼表示的數(shù)轉(zhuǎn)換成BCD碼是很簡(jiǎn)單的,只要把ASCII碼的高4位清零即可。

              壓縮的BCD碼調(diào)整指令
              DAA和DAS指令完成加法和減法的調(diào)整功能。

              DAA 加法的十進(jìn)制調(diào)整(decimal adjust for addition)
              執(zhí)行操作:(AL)← 把AL中的和調(diào)整為壓縮的BCD格式

              DAS 減法的十進(jìn)制調(diào)整(decimal adjust for subtraction)
              執(zhí)行操作:(AL)← 把AL中的差調(diào)整為壓縮的BCD格式

              DAA和DAS指令的調(diào)整方法如下:
              執(zhí)行加法指令(ADD、ADC)或減法指令(SUB、SBB)后,
              1.如果結(jié)果的低4位 (AL)0~3>9或AF=1,則(AL)←(AL)±06H,且AF置1;
              2.如果結(jié)果的高4位 (AL)4~7>9或CF=1,則(AL)←(AL)±60H,且CF置1。

              對(duì)上述方法,加法調(diào)整作+06H和+60H,減法調(diào)整作-06H和-60H。這兩個(gè)調(diào)整的條件,如果滿足其一,則±06H或±60H;如果同時(shí)滿足,則±06H后,再±60H。

              非壓縮的BCD碼調(diào)整指令
              AAA 加法的ASCII調(diào)整(ASCII adjust for add)
              執(zhí)行操作:
              (AL)← 把AL中的和調(diào)整為非壓縮的BCD格式
              (AH)←(AH)+ 調(diào)整產(chǎn)生的進(jìn)位值

              AAS 減法的ASCII調(diào)整(ASCII adjust for sub)
              執(zhí)行操作:
              (AL)← 把AL中的差調(diào)整為非壓縮的BCD格式
              (AH)←(AH)- 調(diào)整產(chǎn)生的借位值

              加法和減法的操作數(shù)可以直接使用ASCII碼,而不必把高位0011清為0000,AAA和AAS指令就是專門為ASCII碼操作數(shù)或非壓縮BCD碼操作數(shù)的加減法而設(shè)計(jì)的。

              AAA和AAS的調(diào)整方法如下:
              執(zhí)行加法指令(ADD、ADC)或減法指令(SUB、SBB)后,結(jié)果存放在AL寄存器中:
              (1)如果(AL)0~3= 0~9,且AF=0,則(AL)4~7= 0,AF的值送CF;
              (2)如果(AL)0~3=A~F,或AF=1,則(AL)←(AL)±06H,(AL)4~7= 0,(AH)←(AH)±1,AF的值送CF。
              AAA和AAS指令除影響AF和CF標(biāo)志外,其余標(biāo)志位均無定義。

              AAM 乘法的ASCII調(diào)整(ASCII adjust for mul)
              執(zhí)行操作:(AX)← 把AX中的積調(diào)整為非壓縮的BCD格式

              AAD 除法的ASCII調(diào)整(ASCII adjust for div)
              執(zhí)行操作:(AX)← AX中的被除數(shù)(非壓縮的BCD格式)轉(zhuǎn)化為二進(jìn)制數(shù)

              以上兩條指令是專為非壓縮的BCD碼的乘除法而設(shè)計(jì)的,它們將乘法和除法的結(jié)果轉(zhuǎn)換為非壓縮的BCD碼。
              
              注意:AAM和AAD都只對(duì)AX寄存器中的數(shù)進(jìn)行調(diào)整,它們只影響SF、ZF和PF標(biāo)志位,其它標(biāo)志位無定義。

              AAM的調(diào)整方法為:
              執(zhí)行乘法指令(MUL)后,調(diào)整存放在AL寄存器中的乘積:
               (AH)←(AL)/ 0AH的商
               (AL)←(AL)/ 0AH的余數(shù)

              AAM實(shí)際上是將兩個(gè)一位數(shù)的非壓縮BCD碼相乘后得到的乘積進(jìn)行二化十的轉(zhuǎn)換,十位數(shù)放在AH中,個(gè)位數(shù)放在AL中,那么AX中就是乘積的非壓縮BCD碼。

              注意:如果是兩個(gè)ASCII碼數(shù)相乘,要先將它們轉(zhuǎn)換成非壓縮BCD碼。

              AAD的調(diào)整方法為:
              執(zhí)行除法指令之前,對(duì)AX中的非壓縮BCD碼(被除數(shù))執(zhí)行:
               (AL)←(AH)×10+(AL)
               (AH)← 0

              與其它調(diào)整指令不同的是,AAD用在DIV指令之前,即先將AX中的被除數(shù)調(diào)整成二進(jìn)制數(shù),并存放在AL中,再用DIV指令作二進(jìn)制數(shù)的除法。AX中的被除數(shù)是二位非壓縮BCD碼,AH中的十位數(shù)乘10,再加上AL中的個(gè)位數(shù),即轉(zhuǎn)換為二進(jìn)制數(shù)。
            3.3.3 邏輯指令
                ⑴ 邏輯運(yùn)算指令
                 AND     邏輯與
                 OR      邏輯或
                 OT      邏輯非
                 XOR     異或
                 TEST     測(cè)試
                ⑵ 移位指令
                 SAL     算術(shù)左移
                 SHR     邏輯右移
                 SAR     算術(shù)右移
                 ROL    循環(huán)左移
                 ROR    循環(huán)右移
                 RCL    帶進(jìn)位循環(huán)左移
                 RCR    帶進(jìn)位循環(huán)右移
            3.3.3.1 邏輯運(yùn)算指令
               AND dst,src ;邏輯與(logic and)
               執(zhí)行操作: (dst)←(dst)&(src)

               OR dst,src ;邏輯或(logic or)
               執(zhí)行操作: (dst)←(dst)|(src)

               NOT opr ;邏輯非(logic not)
               執(zhí)行操作: (opr)← !(opr)

               XOR dst,src ;異或 (exclusive or)
               執(zhí)行操作: (dst)←(dst)異或(src)

               TEST opr1,opr2 ;測(cè)試(test)
               執(zhí)行操作: (opr1)&(opr2),根據(jù)與運(yùn)算結(jié)果設(shè)置條件碼,結(jié)果不回送
            3.3.3.2 移位指令
            3.3.4 串處理指令
                ⑴ 串處理指令
                    MOVSB / MOVSW   串傳送 
                    STOSB / STOSW   存串 
                    LODSB / LODSW   取串 
                    CMPSB / CMPSW   串比較
                    SCASB / SCASW   串掃描
                ⑵ 串重復(fù)前綴
                    REP        重復(fù)串操作
                    REPE / REPZ    相等/為零時(shí)重復(fù)
                    REPNE / REPNZ   不等/不為零時(shí)重復(fù)
                ⑶ 設(shè)置方向標(biāo)志
                    CLD        使DF=0
                    STD        使DF=1
            3.3.4.1 設(shè)置方向標(biāo)志指令
              CLD DF置0(clear direction flag)
              STD DF置1(set direction flag)
            為了處理連續(xù)存儲(chǔ)單元中的字符串或數(shù)串,地址指針需要連續(xù)地增量或減量,指針增量或減量決定了串處理的方向。當(dāng)用CLD指令使DF=0時(shí),源串的指針SI和目的串的指針DI自動(dòng)增量(+1或+2),當(dāng)用STD指令使DF=1時(shí),指針SI和DI自動(dòng)減量(―1或―2)。地址指針是±1還是±2,取決于串操作數(shù)是字節(jié)還是字。
            3.3.4.2 串處理指令
              MOVSB / MOVSW 串傳送(move string byte/word)
              執(zhí)行操作:
              (ES:DI)←(DS:SI)
              (SI)←(SI)±1(字節(jié))或±2(字)
              (DI)←(DI)±1(字節(jié))或±2(字)

              STOSB / STOSW 存串(load from string byte/word)
              執(zhí)行操作: 
              (ES:DI)←(AL)或(AX)
              (DI)←(DI)±1(字節(jié))或±2(字)

              LODSB / LODSW 取串(store into string byte/word)
              執(zhí)行操作: 
              (AL)或(AX)←(DS:SI)
              (SI)←(SI)±1(字節(jié))或±2(字)

              CMPSB / CMPSW 串比較(compare string byte/word)
              執(zhí)行操作: 
              (DS:SI)-(ES:DI),根據(jù)比較的結(jié)果設(shè)置條件碼
              (SI)←(SI)±1(字節(jié))或±2(字)
              (DI)←(DI)±1(字節(jié))或±2(字)

              SCASB / SCASW 串掃描(scan string byte/word) 
              執(zhí)行操作: 
              (AL)-(ES:DI)或(AX)-(ES:DI),根據(jù)掃描比較的結(jié)果設(shè)置條件碼
              (DI)←(DI)±1(字節(jié))或±2(字)
            3.3.4.3 串重復(fù)前綴
              REP 重復(fù)執(zhí)行串指令,(CX)=重復(fù)次數(shù)
              執(zhí)行操作:
              ① (CX)=0時(shí),串指令執(zhí)行完畢,否則執(zhí)行② ~ ④
              ② (CX)←(CX)-1
              ③ 執(zhí)行串指令(MOVS或STOS)
              ④ 重復(fù)執(zhí)行①

              REPE / REPZ 相等/為零時(shí)重復(fù)執(zhí)行串指令,(CX)=比較/掃描的次數(shù)
              執(zhí)行操作:
              ① (CX)=0或ZF=0時(shí),結(jié)束執(zhí)行串指令,否則繼續(xù)② ~ ④
              ② (CX)←(CX)-1
              ③ 執(zhí)行串指令(CMPS或SCAS)
              ④ 重復(fù)執(zhí)行①

              REPNE / REPNZ 不等/不為零時(shí)重復(fù)執(zhí)行串指令,(CX)=比較/掃描的次數(shù)
              執(zhí)行操作:
              ① (CX)=0或ZF=1,結(jié)束執(zhí)行串指令,否則繼續(xù)② ~ ④
              ② (CX)←(CX)-1
              ③ 執(zhí)行串指令(CMPS或SCAS)
              ④ 重復(fù)執(zhí)行①
            3.3.5 控制轉(zhuǎn)移指令
                ⑴ 無條件轉(zhuǎn)移 
                    JMP 跳轉(zhuǎn)
                ⑵ 條件轉(zhuǎn)移 
                    JZ/JNZ    結(jié)果為零/不為零則轉(zhuǎn)移 
                    JS/JNS    結(jié)果為負(fù)/為正則轉(zhuǎn)移 
                    JO/JNO    溢出/不溢出則轉(zhuǎn)移 
                    JP/JNP    奇偶位為1/為0則轉(zhuǎn)移 
                    JB/JNB    低于/不低于則轉(zhuǎn)移 
                    JBE/JNBE   低于等于/高于則轉(zhuǎn)移 
                    JL/JNL    小于/不小于則轉(zhuǎn)移 
                    JLE/JNLE   小于等于/大于則轉(zhuǎn)移 
                    JCXZ     CX為零則轉(zhuǎn)移
                ⑶ 循環(huán)指令
                    LOOP      循環(huán)
                    LOOPZ/LOOPE  為零/相等時(shí)循環(huán)
                    LOOPNZ/LOOPNE 不為零/不等時(shí)循環(huán)
                ⑷ 子程序調(diào)用與返回
                    CALL      調(diào)用
                    RET       返回
                ⑸ 中斷及中斷返回
                    INT       中斷
                    INTO      溢出則中斷
                    IRET       中斷返回
            3.3.6 處理機(jī)控制指令
              處理機(jī)控制指令包括一組置0或置1標(biāo)志位的指令,還有一些控制處理機(jī)狀態(tài)的指令。
                ⑴ 標(biāo)志位處理指令
                    CLC CF置0
                    STC CF置1
                    CMC CF求反
                    CLD DF置0
                    STD DF置1
                    CLI IF置0
                    STI IF置1
                ⑵ 處理機(jī)控制指令
                    NOP 無操作
                    HLT 停機(jī)
                    WAIT 等待
                    ESC 轉(zhuǎn)義
                    LOCK 封鎖

            下了一個(gè)不錯(cuò)的匯編開發(fā)環(huán)境。還是湖南的軟件公司做的,感覺不錯(cuò)。下載地址:http://www.chencan.com/ccasm/  回復(fù)  更多評(píng)論
              

            # 2006-12-18 筆記 2006-12-18 22:25 思勤無邪
            第四章 匯編語言程序格式

            4.1 匯編程序功能

            4.2 偽指令
            4.2.1 段定義偽指令
            4.2.1.1 完整的段定義偽指令
                完整段定義偽指令的格式如下:
                    段名 SEGMENT
                        .
                        .
                        .
                    段名 ENDS

            4.2.2.2 存儲(chǔ)模型與簡(jiǎn)化段定義偽指令
                1. 存儲(chǔ)模型偽指令
                存儲(chǔ)模型決定一個(gè)程序的規(guī)模,也確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性(NEAR或FAR)。當(dāng)使用簡(jiǎn)化段定義的源程序格式時(shí),在段定義語句之前必須有存儲(chǔ)模型 .MODEL語句,說明在存儲(chǔ)器中應(yīng)如何安放各個(gè)段。
                Flat存儲(chǔ)模型: 所有代碼和數(shù)據(jù)放置在一個(gè)段中,但段地址是32位的,所以整個(gè)程序可為4GB。MASM 6.0支持該模型。 

                2. 簡(jiǎn)化的段偽指令 
                .CODE [段名]     創(chuàng)建一個(gè)代碼段(段名為可選項(xiàng),如不給出段名,則采用默認(rèn)段名。對(duì)于多個(gè)代碼段的模型,則應(yīng)為每個(gè)代碼段指定段名。)
                .DATA            創(chuàng)建一個(gè)數(shù)據(jù)段(段名是:_DATA)
                .DATA?           創(chuàng)建無初值變量的數(shù)據(jù)段(段名是:_BSS)
                .FARDATA [段名]  建立有初值的遠(yuǎn)調(diào)用數(shù)據(jù)段(可指定段名,如不指定,則將以FAR_DATA命名。) 
                .FARDATA? [段名] 建立無初值的遠(yuǎn)調(diào)用數(shù)據(jù)段(可指定段名,如不指定,則將以FAR_BSS命名。) 
                .CONST           建立只讀的常量數(shù)據(jù)段(段名是:CONST)
                .STACK [大小]    創(chuàng)建一個(gè)堆棧段并指定堆棧段大小(段名是:stack。如不指定堆棧段大小,則缺省值為1KB) 

                3.與簡(jiǎn)化段定義有關(guān)的預(yù)定義符號(hào)
                (1)@code 由.CODE 偽指令定義的段名或段組名。
                (2)@data 由.DATA 偽指令定義的段名,或由 .DATA 、.DATA?、.CONST和 .STACK所定義的段組名。
                (3)@stack 堆棧段的段名或段組名。

                簡(jiǎn)化段定義舉例

                  .MODEL     SMALL
                  .STACK     100H       ; 定義堆棧段及其大小
                  .DATA                 ; 定義數(shù)據(jù)段
                          .
                          .
                          .
                  .CODE                 ; 定義代碼段
              START:                    ; 起始執(zhí)行地址標(biāo)號(hào)
                  MOV        AX, @DATA  ; 數(shù)據(jù)段地址
                  MOV        DS, AX     ; 存入數(shù)據(jù)段寄存器
                          .
                          .
                          .
                  MOV       AX, 4C00H
                  INT       21H
                  END       START       ; 程序結(jié)束

            4.2.2.3 段組定義偽指令
                段組定義偽指令能把多個(gè)同類段合并為一個(gè)64KB的物理段,并用一個(gè)段組名統(tǒng)一存取它。段組定義偽指令GROUP的格式如下:
                段組名  GROUP  段名 [, 段名 …]

            4.2.3 程序開始和結(jié)束偽指令

            4.2.4 數(shù)據(jù)定義及存儲(chǔ)器分配偽指令
                ORG(origin)
                ORG偽指令用來表示起始的偏移地址,緊接著ORG的數(shù)值就是偏移地址的起始值。ORG偽操作常用在數(shù)據(jù)段指定數(shù)據(jù)的存儲(chǔ)地址,有時(shí)也用來指定代碼段的起始地址。

                DB(define byte)
                DB偽指令用來定義字節(jié),對(duì)其后的每個(gè)數(shù)據(jù)都存儲(chǔ)在一個(gè)字節(jié)中。DB能定義十進(jìn)制數(shù)、二進(jìn)制數(shù)、十六進(jìn)制數(shù)和ASCII字符,二進(jìn)制數(shù)和十六進(jìn)制數(shù)要分別用"B"和"H"表示,ASCII字符用單引號(hào)(' ')括起來。DB還是唯一能定義字符串的偽操作,串中的每個(gè)字符占用一個(gè)字節(jié)。

               DW(define word)
                DW偽指令用來定義字,對(duì)其后的每個(gè)數(shù)據(jù)分配2個(gè)字節(jié)(1個(gè)字),數(shù)據(jù)的低8位存儲(chǔ)在低字節(jié)地址中,高8位存儲(chǔ)在高字節(jié)地址中,如下例中的變量DATA8的數(shù)據(jù)存儲(chǔ)在0070字地址中,其中0070字節(jié)存儲(chǔ)0BAH,0071字節(jié)存儲(chǔ)03H。DW還可存儲(chǔ)變量或標(biāo)號(hào)的偏移地址。見左面DW偽指令的例子。

                DD(define doubleword)
                DD偽指令用來定義雙字,對(duì)其后的每個(gè)數(shù)據(jù)分配4個(gè)字節(jié)(2個(gè)字)。該偽指令同樣將數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制,并根據(jù)低地址存儲(chǔ)低字節(jié),高地址存儲(chǔ)高字節(jié)的規(guī)則來存放數(shù)據(jù)。如下例DATA15的存儲(chǔ)情況是:00A8:0F2H,00A9H:57H,00AAH:2AH,00ABH:5CH。
                用DD存入地址時(shí),第一個(gè)字為偏移地址,第二個(gè)字為段地址。

                DQ(define quadword)
                DQ偽指令用來定義4字,即64位字長(zhǎng)的數(shù)據(jù),DQ之后的每個(gè)數(shù)據(jù)占用8個(gè)字節(jié)(4個(gè)字)。

                DT(define ten bytes)
                DT偽指令用來為壓縮的BCD數(shù)據(jù)分配存儲(chǔ)單元,它雖然可以分配10個(gè)字節(jié)(5個(gè)字),但最多只能輸入18個(gè)數(shù)字,要注意的是,數(shù)據(jù)后面不需要加"H"。左面是DQ和DT的例子。

                DUP(duplicate)
                DUP偽指令可以按照給定的次數(shù)來復(fù)制某個(gè)(某些)操作數(shù),它可以避免多次鍵入同樣一個(gè)數(shù)據(jù)。例如,把6個(gè)FFH存入相繼字節(jié)中,可以用下面兩種方法,顯然用DUP的方法更簡(jiǎn)便些。

              存入6字節(jié)的FFH
            DATA20 DB 0FFH 0FFH 0FFH 0FFH 0FFH 0FFH;
            DATA21 DB 6 DUP(0FFH)    

                DUP操作一般用來保留數(shù)據(jù)區(qū),如用數(shù)據(jù)定義偽指令"DB 64 DUP(?)"可為堆棧段保留64個(gè)字節(jié)單元。DUP還可以嵌套,其用法見左例。

                PTR屬性操作符
                PTR指定操作數(shù)的類型屬性,它優(yōu)先于隱含的類型屬性。其格式為:

                類型 PTR 變量[ ± 常數(shù)表達(dá)式]

                其中類型可以是BYTE、WORD、DWORD、FWORD、QWORD或TBYTE,這樣變量的類型就可以指定了。

                LABEL偽指令
                LABEL可以使同一個(gè)變量具有不同的類型屬性。其格式為:

                變量名 LABEL 類型
            或  標(biāo)號(hào)   LABEL 類型

                其中變量的數(shù)據(jù)類型可以是BYTE,WORD,DWORD,標(biāo)號(hào)的代碼類型可以是NEAR或FAR。

            4.2.5 表達(dá)式賦值偽指令
                EQU是一個(gè)賦值偽操作(偽指令),它給一個(gè)數(shù)據(jù)標(biāo)號(hào)賦于一個(gè)常數(shù)值,但這個(gè)常數(shù)不占用存儲(chǔ)單元。當(dāng)這個(gè)數(shù)據(jù)標(biāo)號(hào)出現(xiàn)在程序中時(shí),匯編程序即用它的常數(shù)值代替數(shù)據(jù)標(biāo)號(hào)。EQU可以在數(shù)據(jù)段之外使用,甚至可用在代碼段中間。

                = 偽操作

                賦值偽操作"="的作用與EQU類似。它們之間的區(qū)別是,EQU偽操作中的標(biāo)號(hào)名是不允許重復(fù)定義的,而=偽操作是允許重復(fù)定義的。

            4.2.6 地址計(jì)數(shù)器與對(duì)準(zhǔn)偽指令
                1.地址計(jì)數(shù)器$

                在匯編程序?qū)υ闯绦騾R編的過程中,使用地址計(jì)數(shù)器來保存當(dāng)前正在匯編的指令的地址。地址計(jì)數(shù)器的值在匯編語言中可用$來表示。

                當(dāng)$用在偽指令的參數(shù)字段時(shí),它所表示的是地址計(jì)數(shù)器的當(dāng)前值

                2.EVEN偽指令

                EVEN偽指令使下一個(gè)變量或指令開始于偶數(shù)字節(jié)地址。

                3. ALIGN偽指令

                ALIGN偽指令使它后面的數(shù)據(jù)或指令從2的整數(shù)倍地址開始。其格式為:

                    ALIGN 2n (n為任意整數(shù))


            4.2.7 基數(shù)控制偽指令 
                .RADIX偽指令

                .RADIX可以把默認(rèn)的基數(shù)改變?yōu)?~16范圍內(nèi)的任何基數(shù)。其格式如下:
                      .RADIX 基數(shù)值

                其中基數(shù)值用十進(jìn)制數(shù)來表示。

            4.3 匯編語言程序格式 
            4.3.1.匯編語言源程序語句的格式 
            4.3.2 表達(dá)式

                (1) 算術(shù)操作符
                算術(shù)操作符有+、-、*、/ 和MOD。
                MOD是指除法運(yùn)算后得到的余數(shù),如19/7的商是2,而19 MOD 7則為5(余數(shù))。

                (2) 邏輯操作符 
                邏輯操作符有:AND(與)、OR(或)、XOR(異或)、NOT(非)。
                邏輯操作符都是按位操作的,只能用于數(shù)字表達(dá)式中。邏輯操作符要求匯編程序?qū)ζ淝昂髢蓚€(gè)操作數(shù)(或表達(dá)式)作指定的邏輯操作。

                (3) 關(guān)系操作符
                關(guān)系操作符有:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)。
                關(guān)系操作符的兩個(gè)操作數(shù)必須都是數(shù)字或是同一段內(nèi)的兩個(gè)存儲(chǔ)器地址。計(jì)算的結(jié)果應(yīng)為邏輯值:結(jié)果為真,表示為0FFFFH;結(jié)果為假,則表示為0。

                (4) 數(shù)值回送操作符 
                數(shù)值回送操作符有:TYPE、LENGTH、SIZE、OFFSET、SEG等。
                數(shù)值操作符把一些特征或存儲(chǔ)器地址的一部分作為數(shù)值回送。

                · TYPE
                格式為:TYPE 表達(dá)式
                如果表達(dá)式是變量,則匯編程序?qū)⒒厮驮撟兞康囊宰止?jié)數(shù)表示的類型:DB為1,DW為2,DD為4,DF為6,DQ為8,DT為10。如果表達(dá)式是標(biāo)號(hào),則匯編程序?qū)⒒厮痛碓摌?biāo)號(hào)類型的數(shù)值:NEAR為 -1,F(xiàn)AR為 -2。如果表達(dá)式為常數(shù),則應(yīng)回送0。

                · LENGTH
                格式為:LENGTH 變量
                對(duì)于變量中使用DUP的情況,匯編程序?qū)⒒厮头峙浣o該變量的單元數(shù),而對(duì)于其他情況則送1。

                · SIZE
                格式為:SIZE 變量
                匯編程序應(yīng)回送分配給該變量的字節(jié)數(shù)。但是,此值是LENGTH值和TYPE值的乘積。

                · OFFSET
                格式為:OFFSET 變量或標(biāo)號(hào)
                匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的偏移地址值。

                · SEG
                格式為:SEG 變量或標(biāo)號(hào)
                匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的段地址值。

                (5) 屬性操作符
                屬性操作符主要有:PTR、段操作符、SHORT、THIS、HIGH、LOW等。

                · PTR
                格式為:類型 PTR 符號(hào)地址
                PTR用來給已分配的存儲(chǔ)地址(用符號(hào)地址表示)賦予另一種屬性,使該地址具有另一種類型。
                類型可有BYTE、WORD、DWORD、FWORD、QWORD、TBYTE、NEAR和FAR等幾種,所以PTR也可以用來建立字、雙字、四字或段內(nèi)及段間的指令單元等。

                · 段操作符
                段操作符用來表示一個(gè)標(biāo)量、變量或地址表達(dá)式的段屬性。
                格式為: 
                段寄存器∶地址表達(dá)式
                段名∶地址表達(dá)式
                組名∶地址表達(dá)式

                · SHORT
                用來修飾JMP指令中轉(zhuǎn)向地址的屬性,指出轉(zhuǎn)向地址是在下一條指令地址的±127個(gè)字節(jié)范圍之內(nèi)。

                · THIS
                格式為: THIS 屬性或類型
                THIS可以象PTR一樣建立一個(gè)指定類型(BYTE、WORD、DWORD)或指定距離(NEAR或FAR)的地址操作數(shù)。該操作數(shù)的段地址和偏移地址與下一個(gè)存儲(chǔ)單元地址相同。

                · HIGH和LOW
                稱為字節(jié)分離操作符,它接收一個(gè)數(shù)或地址表達(dá)式,HIGH取其高位字節(jié),LOW取其低位字節(jié)。

            4.3.3 匯編語言源程序格式舉例

            4.4 匯編語言程序的上機(jī)過程
            4.4.1 建立匯編語言的工作環(huán)境
            4.4.2 匯編語言程序上機(jī)運(yùn)行過程
            4.4.3 COM文件
              回復(fù)  更多評(píng)論
              

            # 2006-12-19 筆記 2006-12-20 14:30 思勤無邪
            昨天因有別的事(修改幫別人做過的網(wǎng)站)而沒有時(shí)間完成學(xué)習(xí)計(jì)劃。
            將大一點(diǎn)的目標(biāo)寫成計(jì)劃,并具體到天還是很有好處的,至少能督促自己盡力去完成。  回復(fù)  更多評(píng)論
              

            # 都有哪些名詞是用字母表示的 2007-11-03 13:23 郭佳寧
            rvey   good  回復(fù)  更多評(píng)論
              

            # 都有哪些名詞是用字母表示的 2007-11-03 13:24 郭佳寧
            veryverygood  回復(fù)  更多評(píng)論
              

            亚洲综合熟女久久久30p| 亚洲嫩草影院久久精品| 久久这里的只有是精品23| 久久久亚洲欧洲日产国码是AV| 亚洲精品高清一二区久久| 久久精品国产亚洲AV香蕉| 色综合久久久久无码专区| 国产99久久久久久免费看| 国产A三级久久精品| 久久91精品国产91久久小草| 99久久99这里只有免费的精品| 韩国免费A级毛片久久| 国产一区二区精品久久凹凸| 久久久久久国产精品无码下载 | 欧美一区二区三区久久综| 青青草原精品99久久精品66| 国产免费福利体检区久久| 久久无码人妻一区二区三区| 久久天天躁狠狠躁夜夜av浪潮 | 久久亚洲精品无码aⅴ大香| jizzjizz国产精品久久| 久久免费观看视频| 久久香蕉综合色一综合色88| 久久久精品人妻一区二区三区四| 草草久久久无码国产专区| 久久国产精品77777| 亚洲AV无一区二区三区久久| 久久人人超碰精品CAOPOREN| 99热成人精品免费久久| 国产∨亚洲V天堂无码久久久| 久久久亚洲AV波多野结衣| 精品无码久久久久久久动漫| 国产精品一久久香蕉国产线看| 久久精品中文騷妇女内射| 国产成年无码久久久免费| 久久亚洲国产最新网站| 亚洲精品99久久久久中文字幕| 久久久久亚洲爆乳少妇无| 色综合久久久久| 91精品国产91热久久久久福利| 国产免费久久久久久无码|