零基礎(chǔ)入門學(xué)習(xí)匯編語言筆跡_第1頁
零基礎(chǔ)入門學(xué)習(xí)匯編語言筆跡_第2頁
零基礎(chǔ)入門學(xué)習(xí)匯編語言筆跡_第3頁
零基礎(chǔ)入門學(xué)習(xí)匯編語言筆跡_第4頁
零基礎(chǔ)入門學(xué)習(xí)匯編語言筆跡_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

零基礎(chǔ)入門學(xué)習(xí)匯編語言—01匯編語言主體:匯編指令匯編指令就是機(jī)器指令的助記符匯編指令:MOVAX,BX//將BX(寄存器)內(nèi)容送到AX(寄存器)中匯編指令----->編譯器----->機(jī)器指令----->計算機(jī)零基礎(chǔ)入門學(xué)習(xí)匯編語言—02匯編語言組成:1匯編指令,2偽指令,3其他符號磁盤上的數(shù)據(jù)或程序需要先讀到內(nèi)存中,再被CPU使用指令和數(shù)據(jù)是應(yīng)用上的概念,在內(nèi)存和磁盤上沒有任何區(qū)別CPU進(jìn)行數(shù)據(jù)讀寫要和外部器件進(jìn)行三類信息交互:存儲單元的地址(地址信息)器件的選擇,讀或?qū)懨睿刂菩畔ⅲ┳x或?qū)懙臄?shù)據(jù)(數(shù)據(jù)信息)總線:連接CPU和其他芯片的導(dǎo)線(一根根導(dǎo)線的集合)邏輯上劃分為:1地址總線,2數(shù)據(jù)總線,3控制總線零基礎(chǔ)入門學(xué)習(xí)匯編語言—03CPU是通過地址總線來指定存儲單元的地址總線上能傳送多少個不同的信息,CPU就可以對多少個存儲單元進(jìn)行尋址一個CPU有N根地址總線,就可以說這個CPU的地址總線寬度為N,這樣的CPU最多可以尋址2的N次方個內(nèi)存單元數(shù)據(jù)總線的寬度決定了CPU和外界數(shù)據(jù)交換的速度零基礎(chǔ)入門學(xué)習(xí)匯編語言—04匯編指令是機(jī)器指令的助記符,同機(jī)器指令一一對應(yīng)每一種CPU都有自己的匯編指令集CPU可以直接使用的信息在存儲器中存放在存儲器中指令和數(shù)據(jù)沒有任何區(qū)別,都是二進(jìn)制信息存儲單元從零開始順序編號一個存儲單(一個字節(jié))存儲8個bit,即8個二進(jìn)制數(shù)1B=8b,1KB=1024B,1MB=1024KB,1GB=1024MB每一個CPU芯片都有許多管腳,這些管腳都是和總線相連。也可以說,這寫管腳引出總線。一個CPU可以引出三種總線的寬度標(biāo)志了這個CPU的不同方面的性能零基礎(chǔ)入門學(xué)習(xí)匯編語言—05隨機(jī)存儲器(RAM),斷電丟失內(nèi)容只讀存儲器(ROM),斷電不丟內(nèi)容裝有BIOS的ROM零基礎(chǔ)入門學(xué)習(xí)匯編語言—06CPU由運算器,控制器,寄存器等器件組成,靠內(nèi)部總線連接內(nèi)部總線實現(xiàn)CPU內(nèi)部各個器件之間的聯(lián)系,外部總線實現(xiàn)CPU和主板上其他器件的聯(lián)系8086CPU有14個寄存器,它們名稱為:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW8086CPU所有寄存器都是16位通用寄存器:AX,BX,CX,DX計算機(jī)計算器的打開方法:calc記事本的打開方法:notepad四個通用寄存器都可以分為兩個獨立的8位寄存器,例:AX=AH(高8位)+AL(低8位)零基礎(chǔ)入門學(xué)習(xí)匯編語言—07匯編指令不區(qū)分大小寫AL上寄存的數(shù)值超過低8位時,不向高8位進(jìn)位add,mov零基礎(chǔ)入門學(xué)習(xí)匯編語言—0816位結(jié)構(gòu)的CPU:1.運算器一次最多處理16位數(shù)據(jù)2寄存器最大寬度為16位3.寄存器和運算器之間的通路是16位8086有20位地址總線,可傳送20位地址,尋址能力為1M8086內(nèi)部位16位結(jié)構(gòu),它只能傳送16位的地址,表現(xiàn)出的尋址能力只有64K地址加法器合成物理地址的方法:物理地址(20位)=段地址(SA)*16+偏移地址(EA)段地址*16=數(shù)據(jù)左移4位數(shù)據(jù)二進(jìn)制形式左移n位,相當(dāng)于乘以2的n次方數(shù)據(jù)二進(jìn)制形式右移n位,相當(dāng)于除以2的n次方零基礎(chǔ)入門學(xué)習(xí)匯編語言—09在編程時可以根據(jù)需要將若干個地址連續(xù)的內(nèi)存單元看作一個段,用段地址*16定位段的起始地址(基地址),用偏移地址定位段中的內(nèi)存單元CPU訪問內(nèi)存單元時,必須向內(nèi)存提供內(nèi)存單元的物理地址CPU可以用不同的段地址和偏移地址形成相同的物理地址偏移地址為16位,尋址范圍為64K存儲單元的地址用兩個元素描述,即段地址和偏移地址零基礎(chǔ)入門學(xué)習(xí)匯編語言—108086CPU有四個段寄存器:CS,DS,SS,ES段寄存器就是提供段地址的CS和IP指示了CPU當(dāng)前要讀取的地址IP為指令指針寄存器轉(zhuǎn)移指令JMPJMP段地址:偏移地址JMP通用寄存器CPU只認(rèn)被CS:IP指向的地址中的內(nèi)容為指令8086CPU的工作過程:1.從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進(jìn)入指令緩沖器; 2.IP指向下一條指令;3.執(zhí)行指令零基礎(chǔ)入門學(xué)習(xí)匯編語言—11Debug程序調(diào)試工具棧最底部字單元地址為1000:000E時,若棧為空,則SP=0010H零基礎(chǔ)入門學(xué)習(xí)匯編語言—17pop只是改變了指針的地址,取出內(nèi)容只是相當(dāng)于復(fù)制而不是剪切Push,pop可以在寄存器和內(nèi)存間傳送數(shù)據(jù),它們訪問的內(nèi)存單元地址不是在指令中給出的,而是由SS:SP指出的push寄存器/段寄存器/內(nèi)存單元pop寄存器/段寄存器/內(nèi)存單元零基礎(chǔ)入門學(xué)習(xí)匯編語言—18不能直接向段寄存器賦值movax,0機(jī)器碼占3個字節(jié)subax,ax機(jī)器碼占2個字節(jié)不能直接向內(nèi)存單元賦值Pushax經(jīng)歷兩個步驟:1.sp=sp-2;2.ss:sp=axPopax經(jīng)歷兩個步驟:1.ax=ss:sp2.sp=sp+2;任意時刻SS:SP指向棧頂?shù)刂房梢杂脳捍嬉院笠謴?fù)的寄存器內(nèi)容零基礎(chǔ)入門學(xué)習(xí)匯編語言—19拷貝一段內(nèi)存中的內(nèi)容到另一段內(nèi)存PushPop零基礎(chǔ)入門學(xué)習(xí)匯編語言—20一個匯編語言從編寫到執(zhí)行的步驟:(可用記事本,Nodepad++,UltraEdit編輯)編寫編譯連接執(zhí)行可執(zhí)行文件包括程序和數(shù)據(jù)偽指令沒有對應(yīng)的機(jī)器碼,最終不被CPU執(zhí)行偽指令由編譯器執(zhí)行,編譯器根據(jù)偽指令來進(jìn)行相關(guān)的編譯工作Segment和ends是成對使用的偽指令,它們的功能是定義一個段,segment表開始,ends表結(jié)束,一個段必須有一個名稱來標(biāo)識,使用格式為:段名segment段名ends一個匯編程序由多個(>=1)段組成,這些段用來存放代碼,數(shù)據(jù)或當(dāng)作??臻g使用end是匯編程序結(jié)束標(biāo)記Assume:假設(shè),假設(shè)一個寄存器和程序中的一個段相關(guān)聯(lián)Assume寄存器:段名源程序中最終由計算機(jī)指向的指令或數(shù)據(jù),成為程序零基礎(chǔ)入門學(xué)習(xí)匯編語言—21返回程序段:movax,4c00Hint21H簡化式編譯,連接:;,ml零基礎(chǔ)入門學(xué)習(xí)匯編語言—22任何通用的操作系統(tǒng)都要提供一個稱為shell(外殼)的程序,用戶使用這個程序來操作計算機(jī)工作DOS中有一個程序,這個程序在DOS中稱為命令解釋器,也就是DOS系統(tǒng)的shell程序加載后,DS中存放著程序所在內(nèi)存區(qū)的段地址,這個內(nèi)存區(qū)的偏移地址為0,則程序所在的內(nèi)存區(qū)的地址為DS:0,這個內(nèi)存區(qū)的前256個字節(jié)中存放的是PSP,DOS用來和程序進(jìn)行通信,從256字節(jié)處向后的空間存放程序DOS是英文DiskOperatingSystem的縮寫,意思是“磁盤操作系統(tǒng)”零基礎(chǔ)入門學(xué)習(xí)匯編語言—23[BX]LOOP,debug中跟蹤用LOOP指令實現(xiàn)循環(huán)程序指令:incbx//bx自增1指令:decbx//bx自減1零基礎(chǔ)入門學(xué)習(xí)匯編語言—24LOOP指令格式:loop標(biāo)號Loop執(zhí)行分兩步:1.(CX)=(CX)—12.判斷CX中的值,不為0則轉(zhuǎn)至標(biāo)號處執(zhí)行程序,如果為0則向下執(zhí) 行例:s:addax,axLoops//使傳送:cs:ip變成(addax,ax)這一步的cs:ip零基礎(chǔ)入門學(xué)習(xí)匯編語言—25零基礎(chǔ)入門學(xué)習(xí)匯編語言—26[bx]的作用:作為偏移地址與DS配合Loop和CX合作使用.asm文件中(movax,1000)在debug中調(diào)試就變成了(movax,03EB).asm文件中數(shù)字末尾若沒加H,就是十進(jìn)制數(shù),到debug中調(diào)試時會被轉(zhuǎn)換成相應(yīng)的十六進(jìn)制數(shù)編譯器不認(rèn)識中括號在MASM中(movax,[2])是解釋為(movax,2),一般我們是通過BX來代替,先(movbx,2),再(movax,[bx]),另一種方式是(movax,ds:[2])debug命令:-p程序運行到結(jié)尾表結(jié)束,在執(zhí)行循環(huán)時跳出循環(huán)-g修改ip值,跳到指定地址執(zhí)行零基礎(chǔ)入門學(xué)習(xí)匯編語言—27Incbx//bx自增1(movax,[bx])中的bx相當(dāng)于一個變量“ds:”,”cs:”,”ss:”,”es:”在匯編語言中稱為段前綴零基礎(chǔ)入門學(xué)習(xí)匯編語言—28安全起見,在不能確定一段內(nèi)存空間中是否存放著重要的數(shù)據(jù)或代碼時,不能隨意向其中寫入內(nèi)容在一般的PC機(jī)中,DOS方式下,DOS和其他合法的程序一般都不會使用0:200H~0:2FFH的256個字節(jié)的空間,所以,我們使用這段空間是安全的題目:將ffff0~fffff內(nèi)存中的內(nèi)容存到安全空間零基礎(chǔ)入門學(xué)習(xí)匯編語言—29dw即defineword定義字型數(shù)據(jù)db即definebyte定義字節(jié)型數(shù)據(jù)CPU從start處讀取指令End除了通知編譯程序結(jié)束外,還可以通知編譯程序的入口在什么地方零基礎(chǔ)入門學(xué)習(xí)匯編語言—30我們用和定義代碼段一樣的方法來定義多個段,然后在這些段里面定義需要的數(shù)據(jù),或通過定義數(shù)據(jù)來取得??臻g例:movds,data是錯誤的數(shù)值不能直接賦給段寄存器Assumecs:code,ds:data,ss:stack零基礎(chǔ)入門學(xué)習(xí)匯編語言—31DOS命令type,查看文件內(nèi)容零基礎(chǔ)學(xué)習(xí)匯編語言—32and指令:邏輯與命令,按位進(jìn)行與運算,通過該命令可將操作對象的相應(yīng)位設(shè)為0,其他位不變or指令:邏輯或命令,按位進(jìn)行或運算,通過該命令可將操作對象的相應(yīng)位設(shè)為1,其他位不變(db‘a(chǎn)bcd’)相當(dāng)于(db61h,62h,63h,64h)(moval,’a’)相當(dāng)于(moval,61h)‘a(chǎn)’-’A’=32=20h小寫字母二進(jìn)制ASCII碼的第六位為1,大字母二進(jìn)制ASCII碼的第六位為0可用and或or進(jìn)行字母大小寫轉(zhuǎn)換例:moval,’a’Andal,11011111b//將小寫a轉(zhuǎn)換為大寫A,數(shù)字末尾加b表示二進(jìn)制moval,’A’oral,00100000b //將大寫A轉(zhuǎn)換為小寫a零基礎(chǔ)學(xué)習(xí)匯編語言—33[bx+data]表示一個內(nèi)存單元,他的偏移地址為(bx)+data(bx中的數(shù)值加上data)指令(movax,[bx+200])也可以寫成如下格式:movax,[200+bx]movax,200[bx]movax,[bx].200零基礎(chǔ)入門學(xué)習(xí)匯編語言—34SI和DI寄存器和BX功能相近,但SI和DI不能夠分成兩個8位寄存器[bx+si][bx+si+data]零基礎(chǔ)入門學(xué)習(xí)匯編語言—35尋址方式:[data]//直接尋址[bx]//寄存器間接尋址[bx+data]//寄存器相對尋址[bx+si],[bx+di]//基址變址尋址[bx+si+data],[bx+di+data]//相對基址變址尋址dos命令:cls清屏零基礎(chǔ)入門學(xué)習(xí)匯編語言—36匯編語言的注釋符為英文分號內(nèi)存暫存數(shù)據(jù)零基礎(chǔ)入門學(xué)習(xí)匯編語言—37尋址方式二重循環(huán)棧的應(yīng)用大小寫轉(zhuǎn)換:and,or零基礎(chǔ)入門學(xué)習(xí)匯編語言—38描述符reg和sreg,reg表示寄存器,sreg表示段寄存器Reg包括ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di;Sreg包括ds,ss,cs,es;在8086CPU中,只有這4個寄存器(bx,bp,si,di)可以用在[]中來進(jìn)行內(nèi)存單元的尋址,這4個寄存器(bx,bp,si,di)可以單獨使用,或只能以4種組合出現(xiàn):bx和si,bx和di,bp和si,bp和di只要[]中使用寄存器bp,而指令中沒有顯性的給出段地址,段地址就默認(rèn)在ss中,例:Movax,[bp]//(ax)=((ss*16+(bp))Movax,[bp+data]//(ax)=((ss*16+(bp)+data)Movax,[bp+si]//(ax)=((ss*16+(bp)+(si))Movax,[bp+si+data]//(ax)=((ss*16+(bp)+(si)+data)絕大部分機(jī)器指令都是進(jìn)行數(shù)據(jù)處理的指令,大致可分為三類:讀取,寫入,運算在機(jī)器指令這一層來講,并不關(guān)心數(shù)據(jù)的值是多少,而是關(guān)心指令執(zhí)行前一刻,它將要處理的數(shù)據(jù)所在的位置指令執(zhí)行前,所需要的數(shù)據(jù)可以在三個地方(CPU,內(nèi)存,端口)立即數(shù),在匯編語言中直接給出,例:movax,1//1就是立即數(shù)立即數(shù)執(zhí)行前存放在CPU的指令緩沖器中零基礎(chǔ)入門學(xué)習(xí)匯編語言—39要處理的數(shù)據(jù)有多長?通過寄存器指明要處理的數(shù)據(jù)的長度在沒有寄存器名存在的情況下,用操作符Xptr指明內(nèi)存單元的長度,X在匯編指令中可以為word或byte,例:movwordptrds:[0],1Incwordptr[bx]Incbyteptrds:[0]Addbyteptr[bx],2其他方法:有些指令有默認(rèn)訪問長度,例:push和pop只進(jìn)行字操作零基礎(chǔ)入門學(xué)習(xí)匯編語言—40可以用[bx+data+si]的方式來訪問結(jié)構(gòu)體中的數(shù)據(jù),用bx定位整個結(jié)構(gòu)體,用data定位結(jié)構(gòu)體中的某一個數(shù)據(jù)項,用si定位數(shù)組項中的每一個元素零基礎(chǔ)入門學(xué)習(xí)匯編語言—41除法指令:div使用div作除法的時候:除數(shù):8位或16位,在寄存器或內(nèi)存中被除數(shù):(默認(rèn))放在AX或DX和AX中除數(shù)被除數(shù)8位16位(ax)//al存商,ah存余數(shù)16位32位(dx高16位+ax低16位)//ax存商,dx存余數(shù)Divbyteptrds:[0]含義為:(al)=(ax)/((ds)*16+0)的商(ah)=(ax)/((ds)*16+0)的余數(shù)Divwordptrds:[0]含義為:(ax)=[(dx)*10000h+(ax)]/((ds)*16+0)的商(dx)=[(dx)*10000h+(ax)]/((ds)*16+0)的余數(shù)dd用來定義dword(doubleword)型數(shù)據(jù)Dup是一個操作符,在匯編語言中同db,dw,dd等一樣,也是由編譯器識別處理的符號,它是和db,dw,dd等數(shù)據(jù)定義偽指令配合使用的,用來進(jìn)行數(shù)據(jù)的重復(fù)Dup格式:db重復(fù)次數(shù)dup(重復(fù)的字節(jié)型數(shù)據(jù))dw重復(fù)次數(shù)dup(重復(fù)的字型數(shù)據(jù))dd重復(fù)次數(shù)dup(重復(fù)的雙字型數(shù)據(jù))Dup示例:db3dup(0)//定義了3個字節(jié),值都為0,相當(dāng)于db0,0,0db3dup(0,1,2)//定義了9個字節(jié),相當(dāng)于db0,1,2,0,1,2,0,1,2db3dup(‘a(chǎn)bc’,’ABC’)//定義了18個字節(jié),相當(dāng)于db‘a(chǎn)bcABCabcABCabcABC’零基礎(chǔ)入門學(xué)習(xí)匯編語言—42第八章實驗七零基礎(chǔ)入門學(xué)習(xí)匯編語言—43轉(zhuǎn)移指令分類:無條件轉(zhuǎn)移指令(如jmp)條件轉(zhuǎn)移指令(如jcxz)循環(huán)指令(如loop)過程中斷操作符offset在匯編語言中由編譯器處理,它的功能是取得標(biāo)號的偏移地址,例:Assumecs:codesgCodesgsgmentStart:movac,offsetstart//相當(dāng)于movax,0S:movac,offsets//相當(dāng)于movax,3CodesgendsEndstartJmp為無條件轉(zhuǎn)移,可以只修改ip,也可以同時修改cs和ipJmpshort標(biāo)號//段內(nèi)短轉(zhuǎn)移,轉(zhuǎn)到標(biāo)號處執(zhí)行指令,對ip的修改范圍為-128~127Jmpnearptr標(biāo)號//段內(nèi)近轉(zhuǎn)移,對ip的修改范圍為-32769~32767Jmpreg//就是段內(nèi)近轉(zhuǎn)移位移由編譯器在編譯的時候算出零基礎(chǔ)入門學(xué)習(xí)匯編語言—44前面講的jmp指令,其對應(yīng)的機(jī)器碼中并沒有轉(zhuǎn)移的目的地址,而是相對于當(dāng)前ip的轉(zhuǎn)移位移Jmpfarptr標(biāo)號//段間轉(zhuǎn)移,又稱遠(yuǎn)轉(zhuǎn)移,同時修改cs和ip,機(jī)器碼中直接給出轉(zhuǎn)移的 目的地址Jmpwordptrds:[0]=Jmpwordptr[0]Jmpdwordptr內(nèi)存單元地址//從內(nèi)存單元處開始存放著兩個字,高地址處的字是轉(zhuǎn)移的目 的段地址,低地址處是轉(zhuǎn)移的目的偏移地址零基礎(chǔ)入門學(xué)習(xí)匯編語言—45Jcxz指令為有條件轉(zhuǎn)移指令,所有的有條件轉(zhuǎn)移指令都是短轉(zhuǎn)移,在對應(yīng)的機(jī)器碼中包含轉(zhuǎn)移的位移,而不是目的地址。對ip的修改范圍都為-128~127指令格式:jcxz標(biāo)號//如果(cx)=0,則轉(zhuǎn)移到標(biāo)號處執(zhí)行,(cx)!=0,則什么也不 做,繼續(xù)向下執(zhí)行jcxz標(biāo)號相當(dāng)于if((cx)=0)jmpshort標(biāo)號Loop指令為有條件轉(zhuǎn)移指令,也為短轉(zhuǎn)移Loop標(biāo)號相當(dāng)于if((cx)!=0)jmpshort標(biāo)號零基礎(chǔ)入門學(xué)習(xí)匯編語言—46浮動裝配根據(jù)位移進(jìn)行轉(zhuǎn)移的指令,若轉(zhuǎn)移超過范圍,在編譯的時候,編譯會報錯Debug把[data]當(dāng)作數(shù)字data,把[reg]或[reg+data]當(dāng)作偏移地址零基礎(chǔ)入門學(xué)習(xí)匯編語言—47實驗八,九詳細(xì)講解80*25彩色字符模式顯示緩沖區(qū)的結(jié)構(gòu):內(nèi)存地址空間中,B8000H~BFFFFH共32KB的空間,為80*25彩色字符模式的顯示緩沖區(qū)。向這個空間寫入數(shù)據(jù),寫入的內(nèi)容將立即出現(xiàn)在顯示器上。在80*25彩色字符模式下,顯示器可以顯示25行,每行80個字符,每個字符可以有256種屬性(背景色,前景色,閃爍,高亮等組合信息)。這樣,一個字符在顯示緩沖區(qū)中就要占兩個字節(jié),分別存放字符的ASCII碼和屬性。80*25模式下,一屏的內(nèi)容在顯示緩沖區(qū)共占4000個字節(jié)。顯示緩沖區(qū)分為8頁,每頁4KB(≈4000B),顯示器可以顯示任意一頁內(nèi)容。一般情況下,顯示第0頁內(nèi)容。也就是說通常情況下,B8000H~B8F9FH中的4000個字節(jié)的內(nèi)容將會出現(xiàn)在顯示器上。屬性字節(jié)的格式:76543210含義:BLRGBIRGB閃爍背景色高亮前景色R:紅G:綠B:藍(lán)注意:閃爍的效果必須在全屏DOS下才能看到零基礎(chǔ)入門學(xué)習(xí)匯編語言—48Call和ret指令都是轉(zhuǎn)移指令,他們都修改ip,或同時修改cs和ip,他們經(jīng)常被共同用來實現(xiàn)自程序的設(shè)計Ret指令用棧中的數(shù)據(jù),修改ip的內(nèi)容,從而實現(xiàn)近轉(zhuǎn)移CPU執(zhí)行Ret指令時,進(jìn)行兩步操作:1.(ip)=((ss)*16+(sp))2.(sp)=(sp)+2相當(dāng)于popipRetf指令用棧中的數(shù)據(jù),修改cs和ip的內(nèi)容,從而實現(xiàn)遠(yuǎn)轉(zhuǎn)移CPU執(zhí)行Retf指令時,進(jìn)行四步操作:1.(ip)=((ss)*16+(sp))2.(sp)=(sp)+23.(cs)=((ss)*16+(sp))4.(sp)=(sp)+2相當(dāng)于popip,PopcsCPU執(zhí)行call指令時,進(jìn)行兩步操作:1.將當(dāng)前的ip或cs和ip壓入棧中2.轉(zhuǎn)移(jmp)Call指令不能實現(xiàn)短轉(zhuǎn)移,除此之外,call指令實現(xiàn)轉(zhuǎn)移的方法和jmp指令原理相同Call標(biāo)號//將當(dāng)前的ip壓入棧后,轉(zhuǎn)到標(biāo)號處執(zhí)行,操作步驟:1.(sp)=(sp)-2, ((ss)*16+(sp))=(ip)2.(ip)=(ip)+16位位移(范圍為-32768~32767)零基礎(chǔ)入門學(xué)習(xí)匯編語言—49Callfarptr標(biāo)號,CPU執(zhí)行此指令時的操作:1.(sp)=(sp)-2,((ss)*16+(sp))=(cs),(sp)=(sp)-2,((ss)*16+(sp))=(ip)2.(cs)=標(biāo)號所在的段地址,(ip)=標(biāo)號所在的偏移地址相當(dāng)于:pushcs,puship,jmpfarptr標(biāo)號Callreg,CPU執(zhí)行此指令時的操作:(sp)=(sp)-2,((ss)*16+(sp))=(ip)(ip)=(reg)相當(dāng)于:puship,jmpregCallwordptr內(nèi)存單元地址//相當(dāng)于puship,jmpwordptr內(nèi)存單元地址Calldwordptr內(nèi)存單元地址//相當(dāng)于pushcs,puship,jmpdwordptr內(nèi)存單元地址零基礎(chǔ)入門學(xué)習(xí)匯編語言—50Mul指令做乘法時:相乘的兩個數(shù)要么都是8位,要么都是16位8位:al和8位寄存器或內(nèi)存字節(jié)單元16位:ax和16位寄存器或內(nèi)存字單元2.結(jié)果:8位相乘存在ax中,16位相乘存在dx(高位)和ax(低位)中格式:mulreg或mul內(nèi)存單元零基礎(chǔ)入門學(xué)習(xí)匯編語言—51模塊化程序設(shè)計批量數(shù)據(jù)傳遞,我們將批量數(shù)據(jù)放到內(nèi)存中,然后將他們所在內(nèi)存空間的首地址放到寄存器中,傳遞給需要的子程序。對于具有批量數(shù)據(jù)的返回結(jié)果,也可以用同樣的方法。零基礎(chǔ)入門學(xué)習(xí)匯編語言—52實驗十:顯示字符串解決除法溢出問題數(shù)值顯示零基礎(chǔ)入門學(xué)習(xí)匯編語言—53零基礎(chǔ)入門學(xué)習(xí)匯編語言—54標(biāo)志寄存器標(biāo)志寄存器每一位都有一個含義flag的1、3、5、12、13、14、15位在8086CPU中沒有使用,不具有任何含義。而0、2、4、6、7、8、9、10、11位都具有特殊的含義Flag的第6位(ZF)是零標(biāo)志位,指令執(zhí)行后若結(jié)果為0,則ZF=1,否則ZF=0Flag的第2位(PF)是奇偶標(biāo)志位,結(jié)果二進(jìn)制形式中有偶數(shù)個1,則PF=1;有奇數(shù)個1,則PF=0Flag的第7位(SF)是符號標(biāo)志位,結(jié)果為負(fù),SF=1;為正,SF=0零基礎(chǔ)入門學(xué)習(xí)匯編語言—55CF是flag的第0位進(jìn)位標(biāo)志位,記錄無符號運算結(jié)果是否有進(jìn)/借位,結(jié)果有進(jìn)/借位時,CF=1OF是flag的第11位,溢出標(biāo)志位,記錄有符號運算結(jié)果是否溢出,結(jié)果溢出時,OF=1add、sub、mul、div、inc、or、and等運算指令影響flagmov、push、pop等傳送指令對flag沒影響movax,0f000h//在最高一個數(shù)為字母時,前面才加0,這個0并沒有存放到內(nèi)存,只是 編譯的時候要用,目的在于區(qū)別其他的數(shù)標(biāo)志值為1的標(biāo)記值為0的標(biāo)記OFOVNV//第11位,溢出標(biāo)志位SFNGPL//第7位,符號標(biāo)志位ZFZRNZ//第6位,零標(biāo)志位PFPEPO//第2位,奇偶標(biāo)志位CFCYNC//第0位,進(jìn)位/借位標(biāo)志位Adc帶進(jìn)位加法指令,它利用了CF上的進(jìn)位值A(chǔ)dcax,bx//ax=ax+bx+CF,CF的值由adc前面的指令決定的零基礎(chǔ)入門學(xué)習(xí)匯編語言—56Inc,dec不會影響CF的值,而add會影響Sbb帶借位的減法指令Cmp是比較指令,功能相當(dāng)于減法指令,但不保存結(jié)果,僅改變標(biāo)志位因為cmp指令可以同時進(jìn)行兩種比較,無符號數(shù)比較和有符號數(shù)比較,所以根據(jù)cmp指令的比較結(jié)果進(jìn)行轉(zhuǎn)移的指令也分為兩種,即:1.根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令,它們檢測ZF、CF的值;2.根據(jù)有符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令,它們檢測SF、OF和ZF的值。下表是常用的根據(jù)無符號數(shù)的比較結(jié)果進(jìn)行轉(zhuǎn)移的條件轉(zhuǎn)移指令:零基礎(chǔ)入門學(xué)習(xí)匯編語言—57零基礎(chǔ)入門學(xué)習(xí)匯編語言—58Flag的第10位是DF,方向標(biāo)志位,在串處理指令中,控制每次操作后si,di的增減DF=0,每次操作后si,di遞增;DF=1,每次操作后si,di遞減movsb的功能是將ds:si指向的內(nèi)存單元中的字節(jié)送入es:di中,然后根據(jù)標(biāo)志寄存器DF位的值,將si和di遞增1或遞減1movsw的功能是將ds:si指向的內(nèi)存單元中的字送入es:di中,然后根據(jù)標(biāo)志寄存器DF位的值,將si和di遞增2或遞減2movsb和movsw進(jìn)行的是串傳送操作中的一個步驟,一般來說,movsb和movsw都和rep配合使用,格式如下:repmovsb//用匯編語法來描述repmovsb的功能就是:s:movsbloopsrepmovsw//用匯編語法來描述repmovsw的功能就是:s:movswloops

Cld指令將標(biāo)志寄存器的DF位置為0Std指令將標(biāo)志寄存器的DF位置為1零基礎(chǔ)入門學(xué)習(xí)匯編語言—59使用串傳送指令進(jìn)行數(shù)據(jù)的傳送,需要給它提供一些必要的信息:1.傳送的原始位置:ds:si2.傳送的目的位置:es:di3.傳送的長度:cx4.傳送的方向:DFpushf:將標(biāo)志寄存器的值壓棧popf:從棧中彈出數(shù)據(jù),送入標(biāo)志寄存器中零基礎(chǔ)入門學(xué)習(xí)匯編語言—60,61,62,63內(nèi)中斷中斷的意思是指,CPU不再接著(剛執(zhí)行完的指令)向下執(zhí)行,而是轉(zhuǎn)去處理這個特殊信息對于8086CPU,當(dāng)內(nèi)部有下面情況發(fā)生的時候,將產(chǎn)生中斷信息:1.除法錯誤,比如:執(zhí)行div指令產(chǎn)生的除法溢出;2.單步執(zhí)行3.執(zhí)行int0指令4.執(zhí)行int指令上述的4種中斷源,在8086CPU中的中斷類型碼如下:1.除法錯誤:02.單步執(zhí)行:13.執(zhí)行int0指令:4.執(zhí)行int指令,該指令的格式為intn,指令中的n為字節(jié)型立即數(shù),是提供給CPU的中斷類型碼中斷信息中包含有標(biāo)識中斷源的類型碼。根據(jù)CPU的設(shè)計,中斷類型碼的作用就是用來定位中斷處理程序CPU用8位的中斷類型碼通過中斷向量表找到相應(yīng)的中斷處理程序的入口地址中斷向量表就是中斷向量的列表。中斷向量表在內(nèi)存中保存,其中存放著256個中斷源所對應(yīng)的中斷處理程序的入口對于8086PC機(jī),中斷向量表指定放在內(nèi)存地址0處,從內(nèi)存0000:0000到0000:03FF的1024個單元中存放著中斷向量表找到中斷處理程序的入口地址的最終目的是用它設(shè)置CS和IP,使CPU執(zhí)行中斷處理程序用中斷類型碼找到中斷向量,并用它設(shè)置CS和IP,這個工作是由CPU的硬件自動完成的,CPU硬件完成這個工作的過程被稱為中斷過程8086CPU的中斷過程:(1)(從中斷信息中)取得中斷類型碼;(2)標(biāo)志寄存器的值入棧(因為在中斷過程中要改變標(biāo)志寄存器的值,所以先將其保存在棧中。);(3)設(shè)置標(biāo)志寄存器的第8位TF和第9位IF的值為0;(這一步的目的后面將介紹)(4)CS的內(nèi)容入棧;(5)IP的內(nèi)容入棧;(6)從內(nèi)存地址為中斷類型碼*4和中斷類型碼*4+2的兩個字單元中讀取中斷處理程序的入口地址設(shè)置IP和CS。CPU在收到中斷信息之后,如果處理該中斷信息,就完成一個由硬件自動執(zhí)行的中斷過程,程序員無法改變這個過程中所要做的工作更簡潔的描述中斷過程,如下:(1)取得中斷類型碼N;(2)pushf(3)TF=0,IF=0(4)pushCS(5)pushIP(6)(IP)=(N*4),(CS)=(N*4+2)在最后一步完成后,CPU開始執(zhí)行由程序員編寫的中斷處理程序。由于CPU隨時都可能檢測到中斷信息,也就是說,CPU隨時都可能執(zhí)行中斷處理程序,所以中斷處理程序必須一直存儲在內(nèi)存某段空間之中中斷處理程序的編寫方法和子程序的比較相似,下面是常規(guī)的步驟:(1)保存用到的寄存器。(2)處理中斷。(3)恢復(fù)用到的寄存器。(4)用iret指令返回。iret指令的功能用匯編語法描述為:popIPpopCSpopfiret通常和硬件自動完成的中斷過程配合使用由于我們是在操作系統(tǒng)之上使用計算機(jī),所有的硬件資源都在操作系統(tǒng)的管理之下,所以我們要想得到一塊內(nèi)存存放自己編寫的中斷處理程序,應(yīng)該向操作系統(tǒng)申請,但這里我們不討論這個問題,只需找一塊別的程序不會用到的內(nèi)存區(qū),將自己編寫的程序傳送到其中即可8086支持256個中斷,但是,實際上,系統(tǒng)中要處理的中斷事件遠(yuǎn)沒有達(dá)到256個,所以在中斷向量表中,有許多單元是空的。一般情況下,從0000:0200至0000:02FF的256個字節(jié)的空間所對應(yīng)的中斷向量表項都是空的,操作系統(tǒng)和其他應(yīng)用程序都不占用offsets-offsets1//計算標(biāo)號s到標(biāo)號s1之間的指令碼的字節(jié)數(shù)“-”是編譯器識別的運算符號,編譯器可以用它來進(jìn)行兩個常數(shù)的減法,比如:movax,8-4,被編譯器處理為指令:movax,4編譯器還可以處理表達(dá)式,比如:指令:movax,(5+3)*5/10,被編譯器處理為指令:movax,4CPU在執(zhí)行完一條指令之后,如果檢測到標(biāo)志寄存器的TF位為1,則產(chǎn)生單步中斷,引發(fā)中斷過程。單步中斷的中斷類型碼為1,則它所引發(fā)的中斷過程如下:(1)取得中斷類型碼1;(2)標(biāo)志寄存器入棧,TF、IF設(shè)置為0;(3)CS、IP入棧;(4)(IP)=(1*4),(CS)=(1*4+2)。只有CPU提供了在執(zhí)行一條指令后就轉(zhuǎn)去做其他事情的功能,Debug或是其他的程序才能利用CPU提供的這種功能做出我們使用T命令時的效果Debug提供了單步中斷的中斷處理程序,功能為顯示所有寄存器中的內(nèi)容后等待輸入命令在使用T命令執(zhí)行指令時,Debug將TF設(shè)置為1,使得CPU在工作于單步中斷方式下,則在CPU執(zhí)行完這條指令后就引發(fā)單步中斷,執(zhí)行單步中斷的中斷處理程序,所有寄存器中的內(nèi)容被顯示在屏幕上,并且等待輸入命令在進(jìn)入中斷處理程序之前,設(shè)置TF=0,從而避免CPU在執(zhí)行中斷處理程序的時候發(fā)生單步中斷一般情況下,CPU在執(zhí)行完當(dāng)前指令后,如果檢測到中斷信息,就響應(yīng)中斷,引發(fā)中斷過程??墒牵谟行┣闆r下,CPU在執(zhí)行完當(dāng)前指令后,即便是發(fā)生中斷,也不會響應(yīng)零基礎(chǔ)入門學(xué)習(xí)匯編語言—64,65,66int指令intn//n為中斷類型碼,此指令的功能是引發(fā)n號中斷的中斷過程可以在程序中使用int指令調(diào)用任何一個中斷的中斷處理程序一般情況下,系統(tǒng)將一些具有一定功能的子程序,以中斷處理程序的方式提供給應(yīng)用程序調(diào)用iret指令的功能為:popIPpopCSpopfint指令和iret指令的配合使用與call指令和ret指令的配合使用相似BIOS和DOS提供的中斷例程的安裝過程:(1)開機(jī)后,CPU一加電,初始化(CS)=0FFFFH,(IP)=0,自動從FFFF:0單元開始執(zhí)行程序。FFFF:0處有一條轉(zhuǎn)跳指令,CPU執(zhí)行該指令后,轉(zhuǎn)去執(zhí)行BIOS中的硬件系統(tǒng)檢測和初始化程序(2)初始化程序?qū)⒔IOS所支持的中斷向量,即將BIOS提供的中斷例程的入口地址登記在中斷向量表中(3)硬件系統(tǒng)檢測和初始化完成后,調(diào)用int19h進(jìn)行操作系統(tǒng)的引導(dǎo)。從此將計算機(jī)交由操作系統(tǒng)控制(4)DOS啟動后,除完成其它工作外,還將它所提供的中斷例程裝入內(nèi)存,并建立相應(yīng)的中斷向量一般來說,一個供程序員調(diào)用的中斷例程中往往包括多個子程序,中斷例程內(nèi)部用傳遞進(jìn)來的參數(shù)來決定執(zhí)行哪個子程序BIOS和DOS提供的中斷例程,都用ah來傳遞內(nèi)部子程序的編號我們之前一直使用的是int21中斷例程的4ch號功能,即程序返回功能,如下:movah,4ch;程序返回moval,0;返回值int21hDOS為程序員提供了許多可以調(diào)用的子程序,都包含在int21h中斷例程中零基礎(chǔ)入門學(xué)習(xí)匯編語言—67,68端口CPU可以直接讀寫3個地方的數(shù)據(jù):(1)CPU內(nèi)部的寄存器(2)內(nèi)存單元(3)端口對端口的讀寫不能用mov、push、pop等內(nèi)存讀寫指令端口的讀寫指令只有兩條:in和out,分別用于從端口讀取數(shù)據(jù)和往端口寫入數(shù)據(jù)在in和out指令中,只能使用ax或al來存放從端口中讀入的數(shù)據(jù)或要發(fā)送到端口中的數(shù)據(jù)。訪問8位端口時用al,訪問16位端口時用ax對0~255以內(nèi)的端口進(jìn)行讀寫:inal,20h ;從20h端口讀入一個字節(jié)out20h,al ;往20h端口寫入一個字節(jié)對256~65535的端口進(jìn)行讀寫時,端口號放在dx中:movdx,3f8h ;將端口號3f8送入dxinal,dx ;從3f8h端口讀入一個字節(jié)outdx,al ;向3f8h端口寫入一個字節(jié)PC機(jī)中有一個CMOSRAM芯片,其有如下特征:(1)包含一個實時鐘和一個有128個存儲單元的RAM存儲器(早期的計算機(jī)為64個字節(jié))(2)該芯片靠電池供電。所以,關(guān)機(jī)后其內(nèi)部的實時鐘仍可正常工作,RAM中的信息不丟失(3)128個字節(jié)的RAM中,內(nèi)部實時鐘占用0~0dh單元來保存時間信息,其余大部分分單元用于保存系統(tǒng)配置信息,供系統(tǒng)啟動時BIOS程序讀取。BIOS也提供了相關(guān)的程序,使我們可以在開機(jī)的時候配置CMOSRAM中的系統(tǒng)信息(4)該芯片內(nèi)部有兩個端口,端口地址為70h和71h。CPU通過這兩個端口讀寫CMOSRAM。70h為地址端口,存放要訪問的CMOSRAM單元的地址,71h為數(shù)據(jù)端口,存放從選定的CMOSRAM單元中讀取的數(shù)據(jù),或要寫入到其中的數(shù)據(jù)shl和shr是邏輯移位指令shl邏輯左移指令,功能為:(1)將一個寄存器或內(nèi)存單元中的數(shù)據(jù)向左移位;(2)將最后移出的一位寫入CF中;(3)最低位用0補充。moval,01001000b,shlal,1的操作過程:(1)左移:原數(shù)據(jù):01001000左移后:01001000(2)最后移出一位寫入CF中:原數(shù)據(jù):01001000左移后:1001000CF=0(3)最低為用0補充:原數(shù)據(jù):01001000左移后:10010000如果移動位數(shù)大于1時,必須將移動位數(shù)放在cl中。例如,指令:moval,01010001bmovcl,3shlal,clshr邏輯右移指令,它和shl所進(jìn)行的操作剛好相反:(1)將一個寄存器或內(nèi)存單元中的數(shù)據(jù)向右移位;(2)將最后移出的一位寫入CF中;(3)最高位用0補充。在CMOSRAM中,存放著當(dāng)前時間:秒:00H,分:02H,時:04H,日:07H,月:08H,年:09H。這6個信息的長度長度都為1個字節(jié)一個字節(jié)可表示兩個BCD碼,CMOSRAM存儲時間信息的單元中,存儲了用兩個BCD碼表示的兩位十進(jìn)制數(shù)要讀取CMOSRAM的信息,我們首先要向地址端口70h寫入要訪問的單元的地址:moval,dataout70h,al然后從數(shù)據(jù)端口71h中取得指定單元中的數(shù)據(jù):inal,71hBCD碼值+30h=十進(jìn)制數(shù)對應(yīng)的ASCII碼將從CMOSRAM的某號單元中讀取的一個字節(jié),分為兩個表示BCD碼值的數(shù)據(jù):movah,al;al中為從CMOSRAM的8號單元讀出的數(shù)據(jù)movcl,4shrah,cl;ah中為月份的十位數(shù)碼值andal,00001111b;ah中為月份的個位數(shù)碼值零基礎(chǔ)入門學(xué)習(xí)匯編語言—69,70,71外中斷CPU在計算機(jī)系統(tǒng)中,除了能夠執(zhí)行指令,進(jìn)行運算以外,還應(yīng)該能夠?qū)ν獠吭O(shè)備進(jìn)行控制,接收它們的輸入,向它們進(jìn)行輸出。也就是說,CPU除了有運算能力外,還要有I/O(Input/Output,輸入/輸出)能力在PC系統(tǒng)的接口卡和主板上,裝有各種接口芯片。這些外設(shè)接口芯片的內(nèi)部有若干寄存器,CPU將這些寄存器當(dāng)作端口來訪問CPU通過端口和外部設(shè)備進(jìn)行聯(lián)系外設(shè)的輸入不直接送入內(nèi)存和CPU,而是送入相關(guān)的接口芯片的端口中;CPU向外設(shè)的輸出也不是直接送入外設(shè),而是先送入端口中,再由相關(guān)的芯片送到外設(shè)CPU在執(zhí)行完當(dāng)前指令后,可以檢測到發(fā)送過來的中斷信息,引發(fā)中斷過程,處理外設(shè)的輸入PC系統(tǒng)中,外中斷源一共有兩類:1、可屏蔽中斷2、不可屏蔽中斷可屏蔽中斷是CPU可以不響應(yīng)的外中斷。CPU是否響應(yīng)可屏蔽中斷,要看標(biāo)志寄存器的IF位的設(shè)置當(dāng)CPU檢測到可屏蔽中斷信息時:如果IF=1,則CPU在執(zhí)行完當(dāng)前指令后響應(yīng)中斷,引發(fā)中斷過程;如果IF=0,則不響應(yīng)可屏蔽中斷回憶一下內(nèi)中斷所引發(fā)的中斷過程:(1)取中斷類型碼n;(2)標(biāo)志寄存器入棧,IF=0,TF=0;(3)CS、IP入棧;(4)(IP)=(n*4),(CS)=(n*4+2)由此轉(zhuǎn)去執(zhí)行中斷處理程序可屏蔽中斷所引發(fā)的中斷過程,除在第1步的實現(xiàn)上有所不同外,基本上和內(nèi)中斷的中斷過程相同。因為可屏蔽中斷信息來自于CPU外部,中斷類型碼是通過數(shù)據(jù)總線送入CPU的;而內(nèi)中斷的中斷類型碼是在CPU內(nèi)部產(chǎn)生的。中斷過程中將IF置0的原因就是,在進(jìn)入中斷處理程序后,禁止其他的可屏蔽中斷。如果在中斷處理程序中需要處理可屏蔽中斷,可以用指令將IF置1。8086CPU提供的設(shè)置IF的指令如下:sti,用于設(shè)置IF=1;cli,用于設(shè)置IF=0。

不可屏蔽中斷是CPU必須響應(yīng)的外中斷。當(dāng)CPU檢測到不可屏蔽中斷信息時,則在執(zhí)行完當(dāng)前指令后,立即響應(yīng),引發(fā)中斷過程對于8086CPU不可屏蔽中斷的中斷類型碼固定為2。所以中斷過程中,不需要取中斷類型碼不可屏蔽中斷的中斷過程:1、標(biāo)志寄存器入棧,IF=0,TF=0;2、CS、IP入棧;3、(IP)=(8),(CS)=(0AH)。幾乎所有由外設(shè)引發(fā)的外中斷,都是可屏蔽中斷不可屏蔽中斷是在系統(tǒng)中有必須處理的緊急情況發(fā)生時用來通知CPU的中斷信息看一下鍵盤輸入的處理過程,并以此來體會一下PC機(jī)處理外設(shè)輸入的基本方法。1、鍵盤輸入2、引發(fā)9號中斷3、執(zhí)行int9中斷例程鍵盤上的每一個鍵相當(dāng)于一個開關(guān),鍵盤中有一個芯片對鍵盤上的每一個鍵的開關(guān)狀態(tài)進(jìn)行掃描。按下一個鍵時,開關(guān)接通,該芯片就產(chǎn)生一個掃描碼,掃描碼說明了按下的鍵在鍵盤上的位置。掃描碼被送入主板上的相關(guān)接口芯片的寄存器中,該寄存器的端口地址為60H。松開按下的鍵時,也產(chǎn)生一個掃描碼,掃描碼說明了松開的鍵在鍵盤上的位置。松開按鍵時產(chǎn)生的掃描碼也被送入60H端口中。一般將按下一個鍵時產(chǎn)生的掃描碼稱為通碼,松開一個鍵產(chǎn)生的掃描碼稱為斷碼。掃描碼長度為一個字節(jié),通碼的第7位為0,斷碼的第7位為1,即:斷碼=通碼+80H鍵盤的輸入到達(dá)60H端口時,相關(guān)的芯片就會向CPU發(fā)出中斷類型碼為9的可屏蔽中斷信息。CPU檢測到該中斷信息后,如果IF=1,則響應(yīng)中斷,引發(fā)中斷過程,轉(zhuǎn)去執(zhí)行int9中斷例程。BIOS提供了int9中斷例程,用來進(jìn)行基木的鍵盤輸入處理,主要的工作如下:(1)讀出60H端口中的掃描碼;(2)如果是字符鍵的掃描碼,將該掃描碼和它所對應(yīng)的字符碼(即ASCII碼)送入內(nèi)存中的BIOS鍵盤緩沖區(qū);如果是控制鍵(比如Ctrl)和切換鍵(比如CapsLock)的掃描碼,則將其轉(zhuǎn)變?yōu)闋顟B(tài)字節(jié)(用二進(jìn)制位記錄控制鍵和切換鍵狀態(tài)的字節(jié))寫入內(nèi)存中存儲狀態(tài)字節(jié)的單元。(3)對鍵盤系統(tǒng)進(jìn)行相關(guān)的控制,比如說,向相關(guān)芯片發(fā)出應(yīng)答信息。BIOS鍵盤緩沖區(qū)是系統(tǒng)啟動后,BIOS用于存放int9中斷例程所接收的鍵盤輸入的內(nèi)存區(qū)。該內(nèi)存區(qū)可以存儲15個鍵盤輸入,因為int9中斷例程除了接收掃描碼外,還要產(chǎn)生和掃描碼對應(yīng)的字符碼,所以在BIOS鍵盤緩沖區(qū)中,一個鍵盤輸入用一個字單元存放,高位字節(jié)存放掃描碼,低位字節(jié)存放字符碼。0040:17單元存儲鍵盤狀態(tài)字節(jié),該字節(jié)記錄了控制鍵和切換鍵的狀態(tài)。鍵盤狀態(tài)字節(jié)各位記錄的信息如下:鍵盤輸入的處理過程:(1)鍵盤產(chǎn)生掃描碼;(2)掃描碼送入60h端口;(3)引發(fā)9號中斷;(4)CPU執(zhí)行int9中斷例程處理鍵盤輸入。第(1)、(2)、(3)步都是由硬件系統(tǒng)完成的。我們能夠改變的只有int9中斷處理程序,我們可以重新編寫int9中斷例程,按照自己的意圖來處理鍵盤的輸入。CPU對外設(shè)輸入的通常處理方法,即:(1)外設(shè)的輸入送入端口;(2)向CPU發(fā)出外中斷(可屏蔽中斷)信息;(3)CPU檢測到可屏蔽中斷信息,如果IF=1,CPU在執(zhí)行完當(dāng)前指令后響應(yīng)中斷,執(zhí)行相應(yīng)的中斷例程;(4)可在中斷例程中實現(xiàn)對外設(shè)輸入的處理。

端口和中斷機(jī)制,是CPU進(jìn)行I/O的基礎(chǔ)8086CPU提供以下幾大類指令:1、數(shù)據(jù)傳送指令,如:mov、push、pop、pushf、popf、xchg等都是數(shù)據(jù)傳送指令,這些指令實現(xiàn)寄存器和內(nèi)存、寄存器和寄存器之間的單個數(shù)據(jù)傳送。2、算術(shù)運算指令,如:add、sub、adc、sbb、inc、dec、cmp、imul、idiv、aaa等都是算術(shù)運算指令,這些指令實現(xiàn)寄存器和內(nèi)存中的數(shù)據(jù)的算數(shù)運算。它們的執(zhí)行結(jié)果影響標(biāo)志寄存器的:sf、zf、of、cf、pf、af位。3

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論