• <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>

            Onway

            我是一只菜菜菜菜鳥...
            posts - 61, comments - 56, trackbacks - 0, articles - 34

            王爽《匯編語言》(第二版) 筆記

            Posted on 2011-12-31 16:03 Onway 閱讀(1177) 評論(0)  編輯 收藏 引用 所屬分類: 使用說明
            2011-12-25 第一章 基礎知識
            1.2 匯編語言的產生
            1,匯編指令和機器指令的差別在于指令的表示方法上。匯編指令是機器指令便于記憶的書寫格式。
            2,匯編語言發展至今,有以下3類指令組成:
            (1)匯編指令
            (2)偽指令
            (3)其他符號:如+,-,*,/等,由編譯器識別,沒有對應的機器碼。

            1.5 指令和數據
            1,在內存或磁盤上,指令和數據沒有任何區別,都是二進制信息。CPU在工作時為不同的信息賦予了不同的意義。

            1.6 存儲單元
            1,微型機存儲器的存儲單元可以存儲一個Byte,即8個二進制。

            1.7 CPU對存儲器的讀寫
            1,根據傳送信息的不同,總線從邏輯上又分為3類,地址總線,控制總線和數據總線。

            1.15 內存地址空間
            1,CPU在操控各個存儲器的時候,把它們看作內存來對待,將它們總的看作一個由若干個存儲單元組成的邏輯存儲器,這個邏輯存儲器即所謂的內存地址空間。
            2,對CPU來講,系統中的所有存儲器中的存儲單元都處于一個統一的邏輯存儲器中,它的容量受CPU尋址能力的限制。

            第二章 寄存器
            2.1 通用寄存器
            1,8086CPU有14個寄存器,所有寄存器都是16位的。

            2.2 字在寄存器中的存儲
            1,字的高位字節和低位字節存在寄存器的高8位和低8位寄存器中。

            2.3 幾條匯編指令
            1,在進行數據傳送或運算時,要注意指令的兩個操作對象的位數應當是一致的。

            2.6 8086CPU給出物理地址的方法
            1,8086有20位地址總線,可以傳送20位地址,打到1MB的尋址能力。8086CPU又是16位結構,在內部一次性處理,傳輸,暫時存儲的地址為16位。
            2,8086CPU采用一種在內部用兩個16位地址合成的方法來形成一個20位的物理地址。
            3,物理地址=段地址 * 16 + 偏移地址

            2.10 CS和IP
            1,8086機中,任意時刻,CPU將CS:IP指向的內容當作指令執行。

            2.11 修改CS,IP的指令
            1,mov指令不能用于設置CS,IP的值。
            2,若想同時修改CS,IP的內容,可用"jmp 段地址:偏移地址"的指令完成。
            3,若想僅修改IP的內容,可用形如“jmp 某一個合法寄存器”的指令完成。

            2.12 代碼段
            1,將一段內存當作代碼段,僅僅是編程時的一種安排,CPU并不理會這種安排。

            實驗一 debug程序的幾個命令
            1,運行cmd,鍵入debug打開debug程序。
            2,“r”查看寄存器,“r 寄存器“修改其內容。
            3,”d 段地址:偏移地址“查看內存。
            4,”e 起始地址 數據 數據 。。。“或者”e 起始地址“修改內存內容(第二種為交互方式)。
            5,”u 起始地址“查看匯編指令。
            6,”t“ 執行CS:IP指向的指令。
            7,”a 起始地址“從該地址開始寫入匯編指令。

            第三章 寄存器(內存訪問)
            3.1 內存中字的存儲
            1,字單元,即存放一個字型數據(16位)的內存單元,由兩個地址連續的內存單元組成。高地址內存單元中存放字型數據的高位字節,低地址內存單元中存放字型數據的低位字節。起始地址為低地址(字節)。

            3.2 DS和[address]
            1,“[...]”表示一個內存單元,“[...]”中的0表示內存單元的偏移地址。
            2,8086CPU不支持將數據直接送入端寄存器。

            3.7 CPU提供的棧機制
            1,任意時刻,SS:SP指向棧頂元素。
            2,8086CPU中,入棧時,棧頂從高地址向低地址方向增長。

            3.10 棧段
            1,push,pop等指令在執行的時候只修改SP。當棧滿的時候,如果再次push,棧頂將環繞,覆蓋了原來棧中的內容。

            實驗二 
            1,debug的t命令在執行修改寄存器SS的指令時,下一條指令也緊接著被執行。

            第四章 第一個程序
            4.2 源程序
            1,在匯編語言遠程中,包含兩種指令,一種是匯編指令,一種是偽指令。
            2,segment和ends的功能是定義一個段,sement說明一個段開始,ends說明一個段結束。一個段必須有一個名稱來標識。
            3,end是一個匯編程序的結束標志。
            4,用assume將特定用途的段和相關的段寄存器關聯起來。
            5,
            mov ax,4c00H
            int 21H
            這兩個指令所實現的功能就是程序返回。

            4.4-4.6 編譯連接
            1,產生中間文件的編譯和連接:直接運行masm和link的時候不帶源文件做參數。
            2,不產生中間文件:運行masm和link的時候帶文件作參數并最后加上一個分號";'。

            4.9 程序執行過程的跟蹤
            1,debug將可執行文件加載內存后,cx中存放的是程序的長度。
            2,ds段寄存器中存放著程序所在內存區的段地址,這個內存區的偏移地址為0。
            3,這個內存區的前256個字節存放的是PSP,DOS用來和程序進行通訊。從256個字節向后存放的是程序。

            實驗三
            1,PSP的頭兩個字節是 CD 20。

            第五章 [BX]和loop指令
            5.0
            1,要完整地描述一個內存單元,需要兩種信息:a,內存單元的地址;b,內存單元的長度(類型)
            2,[bx]表示一個內存單元,它的偏移地址在bx中,段地址在ds中。

            5.1 [BX]
            1,inc bx的含義是bx中的內容加1.

            5.2 loop指令
            1,CPU執行loop指令的時候,要進行兩步操作:a,(cx)=(cx)-1;b,判斷x中的值,若為0跳出循環。
            2,通常用loop實現循環時,cx中存放循環次數。

            5.3 在debug中跟蹤用loop指令實現的循環程序
            1,在匯編程序中,數據不能以字母開頭,要在前面加上0。
            2,debug中的“g 偏移地址”命令格式,用于執行到該偏移地址時停止。
            3,在debug中,p命令會自動重復執行循環中的命令,直到(cx)=0為止。

            5.4 debug和匯編編譯器masm對指令的不同處理
            1,mov ax,[0]在debug中是有效的,而在源程序中,編譯器會將[0]當作0。
            2,在匯編源程序中,如果用指令訪問一個內存單元,則在指令中必須用“[...]”來表示內存單元,如果在“[]”里用一個常量直接給出內存單元的偏移地址,就要在“[]”顯式給出段地址所在的段寄存器。
            3,如果在“[]”里用寄存器,比如bx,間接給出內存單元的偏移地址,則段地址默認在ds中。當然,也可以顯示給出。

            5.6 段前綴
            1,出現在訪問內存單元的指令中,用于顯式地指明內存單元的段地址的"ds:","cs:","ss:","es:",在匯編中稱為段前綴。

            5.7
            1,在一般PC中,DOS方式下,DOS和其他合法程序一般都不會使用0:200~0:2ff(00200h~002ffh)的256個字節的空間。

            實驗四
            ?怎么用[dx]間接給出偏移地址不行呢,用[bx]就行?

            第六章 包含多個段的程序
            6.0
            1,程序取得所需合法空間的方法有兩種,一是在加載程序的時候為程序分配,二是程序在執行的過程中向系統申請。
            2,程序在被加載的時候取得所需的空間,可以在源程序中定義段來進行內存空間的獲取。

            6.1 在代碼段中使用數據
            1,“dw”用于定義字符型數據。
            2,可執行文件由描述信息和程序組成。
            3,start標號(或任意一個不重名的標號)指定程序的入口(其實是end后的標號指定,以在可執行文件的描述信息中指明入口)。
            4,要將數據或者(和)棧與代碼放置于同一段中,可以定義出代碼前的一些空間來進行。

            6.3 將數據,代碼,棧放入不同的段
            1,在程序中,段名就相當于一個標號,代表了段地址。

            實驗五
            mov a:[bx],ax;錯誤
            mov ds:[bx],es:[bx];錯誤
            ;沒有h后綴的數字視為10進制
            ;使用segment定義數據段和棧段,debug剛載入程序的時候,DS,SS并不代表其段地址。
            ;每個段地址可配合偏移地址唯一指定16個字節
            ;數據按其定義的先后順序在放置于程序地址空間(PSP頭后面)
            ;db用于定義字節類型
            分號用于注釋

            2011-12-27 第七章 更靈活的定位內存地址的方法
            7.3 以字符數據形式給出的數據
            1,在匯編程序中,用'.....'的方式指明數據是以字符的形式給出的。

            7.5 [bx+idata]
            1,[bx+idata]表示一個內存單元,它的偏移地址為(bx)+idata。
            2,也可以寫成如下格式
            [200+bx]
            200[bx]
            [bx].200

            7.6 si和di
            1,si和di是8086CPU中和bx功能相近的寄存器,si和di不能分成兩個8位寄存器來使用

            7.8 [bx+di]和[bx+si]
            1,[bx+di]和[bx+si]的含義相似。
            2,[bx+si]表示一個內存單元,它的偏移地址為(bx)+(si)。
            3,也可以寫成如下格式
            [bx][si]

            7.9 [bx+si+idata]和[bx+di+idata]
            1,不解釋
            2,也可以寫成如下格式
            [bx+200+si]
            [200+bx+si]
            [200][bx][si]
            [bx].200[si]
            [bx][si].200

            第八章 數據處理的兩個基本問題
            8.1 bx,si,di和dp
            1,在8086CPU中,只有這四個寄存器可以用在[...]中來進行內存單元的尋址。
            2,這個四個寄存器不能出現如下的組合:bx+bp,si+di
            3,在[]中使用寄存器bp,而沒有顯式給出段地址,則默認為在ss中。

            8.2 機器指令處理的數據在什么地方
            1,指令在執行前,所要處理的數據可以在3個地方:CPU內部,內存,端口。

            8.3 匯編語言中數據位置的表達
            1,在匯編指令中直接給出的數據稱為立即數,執行前在CPU的指令緩沖區中。
            2,使用段地址和偏移地址確定的數據執行前放在內存中。

            8.5 指令要處理的數據有多長
            1,在沒有寄存器名存在的情況下,用操作符X ptr指明的內存單元的長度,X在匯編指令中可以為word或byte。
            如 mov word ptr ds:[0],1
            2,有些指令默認了訪問的是字單元還是字節單元,如push指令只能進行字操作。

            8.7 div指令
            1,div是除法指令,使用div要注意以下問題:
            a,除數:有8位和16位兩種,在一個reg或內存中。
            b,被除數:默認放在AX或DX和AX中,如果除數為8位,則被除數為16位,默認在AX中存放;如果除數為16位,則被除數則為32位,在DX和AX中存放,DX存放高16位。
            c,結果:如果除數為8位,則AL存儲商,AH存儲余數。如果除數為16位,則AX存儲商,DX存儲余數。
            (高位存商,低位存余)

            8.8 dd偽指令
            1,dd用來定義雙字型數據。

            8.9 dup
            1,dup是一個操作符,在匯編語言中同db,dw,dd等一樣,也是由編譯器識別處理的符號。比如: db/dw/dd 3(重復次數) dup (0:要重復的數據),即 db 3 dup (0,1,3)

            2011-12-28 第九章 轉移指令的原理
            9.0
            1,可以修改IP,或同時修改CS和IP的指令系統統稱為轉移指令。
            2,只修改IP時,稱為段內轉移
            3,同時修改CS和IP時,稱為段間轉移
            4,8086CPU的轉移指令分為以下幾類
            a,無條件轉移指令
            b,條件轉移指令
            c,循環指令
            d,過程
            e,中斷

            9.1 操作符 offset
            1,操作符offset在匯編中是由編譯器處理的符號,功能是取得標號的偏移地址。

            9.2 jmp指令
            1,jmp指令要給出兩種信息:
            a,轉移的目的地址(段間轉移)
            b,轉移的距離(段內轉移)

            9.3 依據位移進行轉移的jmp指令
            1,“jmp short 標號”的功能為:(IP)=(IP)+8位位移
            a,8位位移=標號處的地址-jmp指令后的第一個字節的地址;
            b,short指明位移為一個字節表示的距離(補碼表示)
            c,位移距離由編譯器算出。
            2,“jmp near ptr 標號”:(IP)=(IP)+16位位移

            9.4 轉移的目的地址在指令中的jmp指令
            1,“jmp far ptr 標號”實現的是段間轉移。far ptr指明了用指令的段地址和偏移地址修改CS和IP。
            2,該指令的機器碼中,高16位(右邊)是段地址,低十六位是偏移地址

            9.5 轉移地址在寄存器中的jmp指令
            1,“jmp 16位寄存器”:(IP)=(16位寄存器的值)

            9.6 轉移地址在內存中的jmp指令
            1,“jmp word ptr 內存單元的地址”:段內轉移,16位偏移地址
            2,“jmp dword ptr 內存單元的地址”:段間轉移,CS=內存單元地址+2,IP=內存單元地址

            9.7 jcxz指令
            1,“jcxz 標號”為有條件的轉移指令,所有的有條件轉移指令都是短轉移,16位偏移地址。
            2,如果(cx)=0,則轉移到標號處執行,否則什么也不做(繼續往下執行)

            9.8 loop指令
            1,loop指令為循環指令,所有的循環指令都是短轉移,16位偏移地址。

            9.9 根據位移進行的轉移的意義
            1,絕對地址有很可能改變,但偏移地址是不變的。

            實驗八 
            1,可以正確返回,復制標號s2地址的兩個字節時,在標號s處執行jmp,剛好偏移地址是第一個語句。

            實驗九
            1,兩個段寄存器不能出現在同一語句
            2,代碼:
            assume cs:codesg

            datasg segment
            db 'w',02h,'e',02h,'l',02h,'c',02h,'o',02h,'m',02h,'e',02h,' ',00h
            db 't',24h,'o',24h,' ',00h
            db 'm',71h,'a',71h,'s',71h,'m',71h
            db '!',cah
            datasg ends

            codesg segment
            start: mov ax,datasg
            mov ds,ax

            mov ax,0b800h
            mov es,ax

            mov bx,0h
            mov si,0h

            mov cx,12
            row: add bx,160
            loop row

            mov cx,32
            column: add si,2
            loop column

            mov cx,16
            mov di,0h
            copy1:  mov ax,ds:[di]
            mov es:[bx+si],ax
            add si,2h
            add di,2h
                    loop copy1

            mov ax,4c00h
            int 21h
            codesg ends

            end start

            3,80*25彩色字符模式
            內存地址空間中,B8000H~BFFFFH共32KB的空間,為80*25彩色字符模式的顯示緩沖區。向這個地址空間寫入數據,寫入的內容將立即出現在顯示器上。
            在80*25彩色字符模式下,顯示器可以顯示25行,每行80個字符,每個字符有256中屬性。
            每個字符占用兩個字節,高位存放屬性,低位存放ASCII碼。
            緩沖區分8頁,每頁4KB。一般情況下顯示第0頁的內容
            屬性字節的格式
            7 6 5 4 3 2 1 0
            —— ———————— —— —————————
            BL R G B I R G B
            閃爍 背景 高亮 前景

            第十章 CALL和RET指令
            10.0
            call和ret指令都是轉移指令。

            10.1 ret和retf
            1,CPU執行ret指令時,相當于進行:
            pop IP
            2,CPU執行retf指令時,相當于進行:
            pop IP
            pop CS

            10.2 call指令
            1,CPU執行call指令時,進行兩步操作:
            a,將當前的IP或CS和IP壓入棧中;
            b,轉移。
            2,call指令不能實現短轉移。(16位近轉移或段間轉移)

            10.3 根據位移進行轉移的call指令
            1,CPU執行“call 標號”時,相當于執行:
            push IP
            jmp near ptr 標號

            10.4 轉移的目的地址在指令中的call指令
            1,“call far ptr 標號”實現的是段間轉移,其相當于:
            push CS
            push IP
            jmp far ptr 標號

            10.5 轉移地址在寄存器中的call指令
            1,“call 16位reg”相當于執行:
            push IP
            jmp 16位reg

            10.6 偏移地址在內存中的call指令
            1,call word ptr 內存單元地址,相當于
            push IP
            jmp word ptr 內存單元地址
            2,call dword ptr 內存單元地址,相當于
            push CS
            push IP
            jmp dword ptr 內存地址單元

            10.8 mul指令
            1,兩個相乘的數:兩個相乘的數,要么都是8位的,要么都是16位。如果是8位,一個默認放在al中,另一個放在8位reg或內存字節單元中;如果是16位,一個默認在ax中,另一個放在16位reg或內存字單元中。(不能有立即數)
            2,結果:如果是8位乘法,結果默認放在ax中;如果是16位乘法,結果高位默認是DX,低位AX。

            10.10 參數和結果傳遞的問題
            1,用寄存器來存儲參數和結果是最常使用的方法。

            10.11 批量數據的傳遞
            1,如果傳遞的數據太多的時候,可以將批量數據放到內存中,然后用寄存器傳遞首地址。對于返回值也可用同樣方法。
            2,除了用寄存器傳遞參數外,還有一種通用的方法是用棧來傳遞參數。

            10.12 寄存器沖突的問題
            1,一個一般化的問題:子程序使用的寄存器,很可能在主程序中也要使用,造成了寄存器使用上的沖突。
            2,問題解決:在子程序的開始將子程序中所有用到的寄存器中的內容都在棧里保存起來,在子程序返回前再恢復。

            2011-12-29 第十一章 標志寄存器flag
            11.0
            8086CPU的標志寄存器有16位,其中存儲的信息通常被稱為程序狀態字(PSW)。

            11.1 ZF標志
            1,flag的第6位是ZF,零標志位。指令執行后,結果為0,則ZF=1,否則ZF=0。

            11.2 PF標志
            1,flag的第2位是PF,奇偶標志位。若結果所有bit位1的個數為偶數,則pf=1.

            11.3 SF標志
            1,第七位是SF標志,符號標志位。如果結果(補碼表示)為負,則SF=1.(該標志總是跟結果的最高位相同)

            11.4 CF標志
            1,第0位,進位標志位。無符號運算時,最高有效位向更高位進位或者借位時,CF=1.

            11.5 OF標志
            1,第11位,溢出標志位。有符號運算時,結果超出其表示范圍時,OF=1。

            11.6 adc指令
            1,adc是帶進位加法指令,格式:
            adc 操作數對象1,操作對象2
            功能:操作對象1 = 操作對象1 + 操作對象2 + CF

            11.7 sbb指令
            1,sbb是帶借位減法指令:格式
            sbb 操作對象1,操作對象2
            功能:操作對象1 = 操作對象1 - 操作對象2 - CF

            11.8 cmp指令
            1,cmp指令格式:
            cmp 操作對象1,操作對象2
            功能:計算操作對象1 - 操作對象2 ,但不保存結果,僅僅根據計算結果對標志寄存器進行設置。

            11.9 檢測比較結果的條件轉移指令
            1,無符號數比較結果檢測指令
            je 等于則轉移 zf=1
            jne
            jb 小于則轉移 cf=1
            jnb
            ja 大于則轉移 cf=0且zf=0
            jna

            11.10 DF標志和串傳送指令
            1,flag的第10位是DF,方向標志位。在串處理指令中,控制每次操作后si,di的增減。
            2,串傳送指令:movsb
            功能是將ds:si指向的內存單元中的字節送入es:di中,然后根據DF位的值,將si和di遞增(df=0)或遞減(df=1)
            3,串傳送指令:movsw 同movsb,但是傳送字,si和di的步進為2。
            4,對DF位的設置指令:
            cld:清零
            std:置一
            4,rep指令
            根據cx的值,重復執行后面的串傳送指令,如:
            rep movsb

            11.11 pushf和popf指令
            1,兩指令將標志寄存器的值壓棧和出棧。

            11.12 標志寄存器在debug中的表示
            標志 值=1 值=0
            of OV NV
            sf NG PL
            zf ZR NZ
            pf PE PO
            cf CY NC
            df DN UP

            第十二章 內中斷
            12.1 內中斷的產生
            1,對于8086CPU,當CPU內部有下面的情況發生的時候,將產生相應的中斷信息。
            a,除法錯誤,如除法溢出
            b,單步執行
            c,執行into指令
            d,執行int指令

            2,8086CPU用稱為中斷類型碼的數據(一個字節)來表示中斷信息的來源。

            3,一些中斷類型碼:
            a,除法錯誤:0
            b,單步執行:1
            c,執行into:4
            d,執行int:該指令格式int n中的n。

            12.4 中斷過程
            1,8086CPU在收到中斷信息后,鎖引發的終端過程:
            a,取得中斷類型碼
            b,將標志寄存器的值壓棧
            c,設置標志寄存器的第八位TF和第九位IF的值為0
            d,CS的內容壓棧
            e,IP的內容壓棧
            f,從內存地址為中斷類型碼*4和中斷類型碼*4+2的兩個字單元中讀取中斷處理程序的入口地址設置IP和CS。(內存0000:0000到0000:03ff的1024個字節存放中斷向量表)
            2,該中斷過程是由硬件執行的,程序員無法改變。

            12.5 中斷處理程序和iret指令
            1,中斷處理程序的編寫方法跟子程序相似,只是使用iret指令作返回。
            2,iret指令相當于:
            pop IP
            pop CS
            popf
            (這是說相當于)

            12.8 安裝
            1,一個匯編語句:
            mov cx,offset do0end-offset do0

            12.11 單步中斷
            1,如果標志位TF=1,則CPU在執行完一條指令之后,就要去執行單步中斷處理程序。

            12.12 響應中斷的特殊情況
            1,某些情況下,CPU在執行完當前指令后,即使發生中斷,也不會去響應。如修改棧指針的操作。
            2,棧指針的設置應該在設置完棧段地址后(SS),馬上設置棧指針地址(SP)。

            第十三章 int指令
            13.1 int指令
            1,一般情況下,系統將一些具有一定功能的子程序,以中斷處理程序的方式提供給應用程序調用。

            13.2 編寫供應用程序調用的中斷例程
            1,編寫中斷例程和編寫子程序的時候具有同樣的問題,就是避免寄存器的沖突。

            13.3 BIOS和DOS中斷例程的安裝過程
            1,開機后,CPU加電,初始化CS=0FFFFH,IP=0,該處有一跳轉指令,轉去執行BIOS中的硬件系統檢測和初始化程序。
            2,初始化程序設置中斷向量表,指向其固化的中斷例程。
            3,硬件檢測和初始化完成后,調用int 19h進行操作系統的引導。
            4,DOS啟動后,除了其他工作,還將它所提供的中斷例程裝入內存,并建立中斷向量。

            13.4 BIOS中斷例程應用
            1,int 10h中斷例程是BIOS提供的中斷例程,其中包含了多個和屏幕輸出相關的子程序。
            2,BIOS和DOS提供的中斷例程,都用ah來傳遞子程序的編號。

            13.5 DOS中斷例程的應用
            1,int 21h中斷例程是DOS提供的中斷例程,其中包含了DOS提供給程序員在編程時調用的子程序。
            2,4ch號子程序以al參數作返回值。

            2011-12-30 第十四章 端口
            14.0
            1,CPU可以直接讀寫以下三個地方的數據
            a,CPU內部寄存器
            b,內存單元
            c,端口

            14.1 端口的讀寫
            1,在PC系列中,CPU最多可以定位64K個不同的端口,范圍為0~65536.
            2,端口的讀寫只有兩條指令:in 和 out,讀和寫。
            3,在in和out指令中,只能使用ax或al來存放從端口中讀入的數據或要發送到端口中的數據。
            4,255及以內的端口可以用立即數指定,255以后的端口要放在dx中。(是嗎?)

            14.2 CMOS RAM芯片
            1,該芯片內部有兩個端口,端口地址為70h和71h。70h為地址端口,存放要訪問的CMOS RAM單元的地址;71h為數據端口,存放從選定的CMOS RAM單元中讀取的數據,或要寫入的數據。如讀寫COMS RAM的2號單元:
            a,將2送入端口70h;
            b,從端口71h讀出2號單元的內容。

            14.3 shl和shr指令
            1,為邏輯左右移位指令,功能為:
            a,將一個寄存器或內存單元中的數據向左或右移位;
            b,將最后移出的一位寫入CF中;
            c,最低(高)位用0補充。
            2,如果移動位數大于1時,必須將移動位數放在cl中。如:
            mov al,01010001b
            mov cl,3
            shl al,cl

            14.4 CMOS RAM中存儲的時間信息
            1,在COMS RAM中,存放著當前的時間:年,月,日,時,分,秒。六個信息的長度都為1個字節,存放單元為:
            秒:0 分:2 時:4 日:7 月:8 年:9
            這些數據以BCD碼的方式存放。
            2,兩個BCD碼表示兩個十進制數,高4位為十位,低四位為個位。

            實驗14 訪問COMS RAM
            1,CMOS RAM中存儲著系統的配置信息,除了保存時間信息的單元外,不要向其他的單元中寫入內容,否則將引起一些系統錯誤。

            十五章 外中斷
            15.1 接口芯片和端口
            1,外設接口芯片的內部有若干寄存器,CPU將這些寄存器當作端口來訪問。
            2,外設的輸入輸出數據都要經過端口跟內存和CPU交互。

            15.2 外中斷信息
            1,可屏蔽中斷是CPU可以不響應的外中斷。若IF=1,則響應,否則不響應。
            2,將IF置0的原因是,在進入中斷處理程序后,禁止其他的可屏蔽中斷。
            3,不可屏蔽中斷是CPU必須響應的外中斷。對于8086CPU,不可屏蔽中斷的中斷類型碼固定為2.
            4,幾乎所有由外設引發的外中斷都是可屏蔽的。

            15.3 PC機鍵盤的處理過程
            1,一般將按下一個鍵時產生的掃描碼稱為通碼,松開一個鍵產生的掃描碼為斷碼。掃描碼長度為一個字節,通碼第七位為0,斷碼第7位為1。掃描碼都被送到60h端口。
            2,鍵盤的輸入到達60h端口時,相關芯片就會向CPU發出中斷類型碼為9的可屏蔽中斷信息。CPU檢測到該中斷后,如果IF=1則會響應中斷執行int9中斷例程。
            3,int9中斷例程的主要工作:
            a,讀出60h端口的掃描碼;
            b,如果是字符掃描碼,則將掃描碼及其對應的ASCII碼送到BIOS的鍵盤緩沖區;如果是控制鍵和切換鍵的掃描碼則將其轉變為狀態字節,寫入內存中存儲狀態字節的單元。
            c,對鍵盤系統進行相關的控制,如,發送應答信息。
            4,0040:17單元存儲鍵盤狀態字節,該字節記錄了控制鍵和切換鍵的狀態。

            15.4 編寫int9中斷例程
            1,本章匯總所有關于鍵盤的程序,因要訪問真實硬件,必須在DOS實模式下運行。

            第十六章 直接定制表
            16.1 描述了單元長度的標號
            1,數據標號,標記了存儲數據的單元地址和長度.

            16.2 在其他段中使用數據標號
            1,一般來說,不在代碼段中定義數據,而是將數據定義到其他段中。
            2,在后面加有“:”的地址標號,只能在代碼段中使用,不能在其他段中使用。
            3,如果想在代碼段中直接用數據標號訪問數據,則需要用偽指令assume將標號所在的段和一個段寄存器聯系起來。
            4,可以將標號當作數據來定義,此時,編譯器將標號所表示的地址當作數據的值。如:
            data segment
            a db 1,2,3,4,5,6,7,8
            b dw 0
            c de a,b
            data ends
            數據標號c處存儲的兩個字型數據為標號a,b的偏移地址。再如:
            data segment
            a db 1,2,3,4,5,6,7,8
            b dw 0
            c dd a,b
            data ends
            數據標號c處存儲的兩個雙字型數據為標號a的偏移地址和段地址,b的偏移地址和段地址。

            16.3 直接定址表
            1,乘除是非常耗時的運算,大約是加法,比較等指令的5倍。

            16.4 程序入口地址的直接定址表
            1,可以在直接定址表中存儲子程序的地址,從而方便地實現不同子程序的調用。

            2011-12-31 第十七章 使用BIOS進行鍵盤輸入和磁盤讀寫
            17.2 使用int 16h中斷例程讀取鍵盤緩沖區
            1,BIOS提供的int 16中斷例程中包含一個最重要的功能是從鍵盤緩沖區中讀取一個鍵盤輸入,該功能的編號為0.

            17.4 應用int 13h中斷例程對磁盤進行讀寫
            1,BIOS提供的訪問磁盤的中斷例程為int 13h。
            2,其入口參數如下:
            (ah)=int 13h的功能號(2號功能為讀,3號為寫)
            (al)=讀取的扇區數
            (ch)=磁道號
            (cl)=扇區號
            (dh)=磁頭號
            (dl)=驅動器號
            返回參數:
            操作成功:(ah)=0,(al)=讀入的扇區數
            操作失敗:(ah)=出錯代碼

            ps:上個周六看到的一篇教程終于讓我決定要學學匯編語言了,上周日開始到今天周六剛好一個星期,趕在2012來臨之前算是把這本書看完了,也留下了一萬字的筆記。只是從第十章開始就沒做過書上的實驗了,后面的綜合研究也只是一頁一頁的翻了過去。改寫書上提到的一個故事:COOL先生用了3天(或更短)的時間就學會了匯編語言。我會相信這個故事,只是故事的主角不會是我。
            久久亚洲精品中文字幕| 久久婷婷国产综合精品| 久久免费精品一区二区| 99久久精品日本一区二区免费| 久久夜色精品国产www| 国产精品无码久久四虎| 久久久久亚洲AV无码专区桃色| 久久亚洲精品无码播放| 伊人久久大香线蕉综合5g| 亚洲天堂久久久| 日日躁夜夜躁狠狠久久AV| 九九精品99久久久香蕉| 色综合久久精品中文字幕首页| 国产精品久久久久乳精品爆| 久久精品中文字幕第23页| 内射无码专区久久亚洲| 亚洲va久久久噜噜噜久久狠狠| av国内精品久久久久影院| 蜜臀久久99精品久久久久久| 99久久99久久精品国产片果冻 | 国产成人精品久久亚洲高清不卡 | 亚洲综合伊人久久大杳蕉| 国产精品久久久久久久久| 久久久久亚洲AV成人网| 久久亚洲私人国产精品| 久久久久国产精品嫩草影院| 久久亚洲日韩精品一区二区三区| 欧美日韩精品久久久免费观看| 久久婷婷五月综合国产尤物app| 久久久久国产精品嫩草影院 | 久久婷婷五月综合97色一本一本| 91超碰碰碰碰久久久久久综合| 久久亚洲视频| 国产福利电影一区二区三区,免费久久久久久久精 | 2021最新久久久视精品爱| 久久Av无码精品人妻系列 | 99久久精品日本一区二区免费| 91精品国产91久久久久久青草 | 亚洲AV无码久久精品蜜桃| 久久亚洲精品无码播放| 久久亚洲欧美日本精品|