匯編語(yǔ)言_大灰狼_第1頁(yè)
匯編語(yǔ)言_大灰狼_第2頁(yè)
匯編語(yǔ)言_大灰狼_第3頁(yè)
匯編語(yǔ)言_大灰狼_第4頁(yè)
匯編語(yǔ)言_大灰狼_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、CPU的結(jié)構(gòu)CPU對(duì)設(shè)備的讀寫1、 程序是如何運(yùn)行的? 雙擊程序應(yīng)用程序載入內(nèi)存CPU找到應(yīng)用程序在內(nèi)存中的位置通過(guò)某種途徑把程序傳送給CPUCPU通過(guò)一些很細(xì)的線與外圍設(shè)備進(jìn)行通訊,這些線叫做總線CPU與內(nèi)存通信的線叫做地址總線(通過(guò)這里將應(yīng)用程序在內(nèi)存中的位置的地址傳遞給CPU)在找到應(yīng)用程序在內(nèi)存中的位置之后呢,還得想辦法把應(yīng)用程序的內(nèi)容傳遞給CPU,這個(gè)途徑成為數(shù)據(jù)總線與CPU連接的除了地址總線和數(shù)據(jù)總線之外,還有一個(gè)是控制總線,即:CPU用來(lái)控制外圍設(shè)備的(如硬盤、光驅(qū)、聲卡等)2、CPU是如何傳輸數(shù)據(jù)的?CPU運(yùn)行起來(lái)時(shí)0101的數(shù)據(jù),這些線只能傳輸兩種信號(hào),即0和1信號(hào),高低電平

2、分別是1和0信號(hào)。8086CPU有20條地址總線,從CPU連到內(nèi)存,則CPU的最大尋址范圍就是2=1024KB=1MB,即8086最大尋址范圍是1MB 假設(shè)CPU要到內(nèi)存中找數(shù)據(jù),則CPU要把應(yīng)用程序的地址傳送給內(nèi)存,然后內(nèi)存通過(guò)地址找到相應(yīng)的數(shù)據(jù),再通過(guò)數(shù)據(jù)總線把內(nèi)容傳輸給CPU。其中CPU中有一個(gè)內(nèi)存控制器,它會(huì)根據(jù)CPU傳遞過(guò)來(lái)的地址找到相應(yīng)的數(shù)據(jù)內(nèi)容??刂瓶偩€用來(lái)干什么呢?有的時(shí)候CPU要讀內(nèi)容,有的時(shí)候要寫內(nèi)容,則是通過(guò)控制總線執(zhí)行什么動(dòng)作。CPU就是通過(guò)這三種總線與外圍設(shè)備通訊的。3、總線的寬度所謂總線的寬度就是指CPU有多少根線連接到內(nèi)存當(dāng)中,或者說(shuō)地址總線的寬度決定了CPU的最

3、大存儲(chǔ)范圍,也可以說(shuō)CPU是多少位的就是多大的尋址范圍。比如說(shuō)CPU是32位的話,最大的尋址范圍就是2的32次方就是4G內(nèi)存,所以即便你安裝了8G的內(nèi)存,另外4G是無(wú)法利用起來(lái)的。2 = 1MB 4、繼續(xù)探討CPU執(zhí)行程序當(dāng)內(nèi)存將數(shù)據(jù)送到CPU之后,是不是立即就開(kāi)始執(zhí)行程序呢?不是的,CPU是先將程序的數(shù)據(jù)放入寄存器,然后再?gòu)募拇嫫骼锶〕鰯?shù)據(jù)來(lái)執(zhí)行 寄存器概念5、那什么事寄存器?它有什么作用?答:存放CPU要執(zhí)行的數(shù)據(jù)或指令寄存器分為:通用寄存器和段寄存器寄存器知識(shí)補(bǔ)充:1數(shù)據(jù)寄存器(或稱通用寄存器) 數(shù)據(jù)寄存器包括AX,BX,CX,DX四個(gè)通用寄存器,他們可以以字16位的形式使用,也可以以字

4、節(jié)8位的形式使用。 以字形式使用時(shí)四個(gè)通用寄存器稱為AX,BX,CX,DX,以字節(jié)形式使用,高八位通用寄存器稱AH,BH,CH,DH。低八位稱AL,BL,CL,DL。 這四個(gè)都是通用寄存器,又可用于專用的目的。 AX做累加器用(ACCUMALATOR)BX在計(jì)算存儲(chǔ)器地址時(shí),經(jīng)常用做基地址寄存器,所以又稱基址寄存器。(BASE) CX(COUNT)可用做通用寄存器。此外,在循環(huán)(LOOP)和串處理指令中用做隱含的計(jì)數(shù)器。 DX(DATA)在做雙字長(zhǎng)的運(yùn)算時(shí),把DX和AX組合在一起存放I/O端口地址。 2,指針及變址寄存器 他們包括SP,BP,SI,DI四個(gè)16位寄存器。他們可以象數(shù)據(jù)寄存器一樣

5、在運(yùn)算過(guò)程中存放操作數(shù),單他們只能以字16位為單位使用。 SP(STACKPOINTER)堆棧指針寄存器; 用來(lái)指示堆棧的棧頂?shù)钠频刂?,與SS堆棧段寄存器形成棧頂存儲(chǔ)單元的物理地址。 BP(BASEPOINTER)基址指針寄存器。 用來(lái)指示堆棧中某個(gè)數(shù)據(jù)區(qū)的偏移地址-基地址。 SI(SOURCEINDEX)源變址寄存器; DI(DESTINATIONINDEX)目的變址寄存器; 3,段寄存器 包括CS,DS,SS,ES四個(gè)16位段寄存器 CS(CODESEGMENT)代碼段寄存器 SS(STACKSEGMENT)堆棧段寄存器 DS(DATASEGMENT)數(shù)據(jù)段寄存器 ES(EXTRASEG

6、MENT)附加段寄存器 8086/8088采用存儲(chǔ)空間的分段技術(shù)來(lái)解決尋址1M字節(jié)的存儲(chǔ)空間。這些段寄存器的內(nèi)容和有效的地址偏移量(稱偏移地址)一起可確定內(nèi)存的存儲(chǔ)單元的物理地址。CS控制程序區(qū)DS和ES控制數(shù)據(jù)區(qū),SS控制堆棧區(qū)。 4控制寄存器 分為兩個(gè)16位的寄存器IP和PSW。 IP(INSTRUCTIONPOINTER)指令指針寄存器;他用來(lái)存放代碼段中的偏移地址。程序運(yùn)行中始終指向下一條指令的首地址。計(jì)算機(jī)就是用IP寄存器來(lái)控制指令序列的執(zhí)行流程的 PSW(PROGRAMSTATUSWORD)程序狀態(tài)字寄存器或稱標(biāo)志寄存器; 由狀態(tài)碼標(biāo)志和控制標(biāo)志構(gòu)成, OF溢出標(biāo)志;運(yùn)算結(jié)果超出機(jī)

7、器能表示的數(shù)值范圍稱溢出OF=1,否則OF=0; SF符號(hào)標(biāo)志;運(yùn)算結(jié)果的符號(hào)為負(fù)時(shí)置1否則置0 ZF;零標(biāo)志 CF進(jìn)位標(biāo)志 AF輔助進(jìn)位標(biāo)志 PF奇偶標(biāo)志 DF方向標(biāo)志 DF=1每次操作后使SI和DI減量,使串處理指令向低地址方向進(jìn)行 IF中斷標(biāo)志 TF跟蹤標(biāo)志 控制標(biāo)志是由系統(tǒng)程序或用戶程序根據(jù)需要用指令來(lái)設(shè)置的。AX寄存器(8086寄存器的一種.成為累加寄存器)AX寄存器是通用寄存器,是專門用來(lái)存放數(shù)據(jù)的寄存器。高8位成為AH,低8位成為AL。它是如何組織數(shù)據(jù)的?AX中有兩個(gè)字節(jié)字節(jié):用8個(gè)二進(jìn)制數(shù)表示一個(gè)字節(jié)字:用兩個(gè)字節(jié)表示一個(gè)字,即16位二進(jìn)制數(shù)據(jù)雙字:兩個(gè)字表示,即32位二進(jìn)制數(shù)

8、當(dāng)然還有4字的。CPU內(nèi)部是由哪些部件構(gòu)成的?1、 寄存器2、 運(yùn)算器(+-*/)3、 控制器,控制各器件運(yùn)行,發(fā)送一些命令(各個(gè)運(yùn)算器做什么有這個(gè)決定)4、 內(nèi)部總線連接各種器件,在它們之間進(jìn)行數(shù)據(jù)傳輸物理地址表示方法8086主板地址線20根進(jìn)行尋址必須一次傳20位二進(jìn)制數(shù),但是CPU最大一次只能床16個(gè)二進(jìn)制位,如何解決?比如有兩個(gè)小紙條,每張最低只能寫三位數(shù)字,要求用這兩張紙條來(lái)表示一個(gè)四位數(shù)字CPU也是類似于這樣進(jìn)行處理的。CPU用地址加法器完成這樣的功能如上圖,234成為基地址,23成為偏移地址CPU用基地址+偏移地址得到實(shí)際物理內(nèi)存地址內(nèi)存地址的表示方法:基地址:偏移地址=實(shí)際內(nèi)存

9、地址計(jì)算方法: 實(shí)際內(nèi)存地址 = 基地址 * 16 + 便宜地址解釋:我們?nèi)耸腔谑M(jìn)制運(yùn)算的,要想后面加一個(gè)0即加一位,所以用234*10 然后加23,而8086計(jì)算機(jī)是基于16進(jìn)制的,所以要乘以16然后加上偏移地址具體例子:1402:100;1402H * 16(10進(jìn)制,16基址的10H)+ 0100H = 14120H其中H表示16進(jìn)制。 CPU如何對(duì)內(nèi)存進(jìn)行邏輯的分段處理1000H轉(zhuǎn)化為基地址:偏移地址1000H:0000寄存器分為公用寄存器和段寄存器,通用寄存器用來(lái)存放普通的數(shù)據(jù),而段寄存器與這里的段地址是一個(gè)概念,就是存放基地址的。 段地址和偏移地址CS和IP寄存器主要內(nèi)容:CS

10、、IP寄存器;debug命令的使用;內(nèi)存訪問(wèn)1、 程序被載入內(nèi)存后,CPU是從哪里開(kāi)始執(zhí)行程序代碼的?在C語(yǔ)言中main函數(shù)是第一個(gè)被執(zhí)行的那么在匯編語(yǔ)言中是從哪里開(kāi)始的呢?我們知道,段地址*16 + 偏移地址 = 實(shí)際物理地址CS(code segment)寄存器保存了要被執(zhí)行的代碼的基地址寄存器保存了要被執(zhí)行代碼的偏移地址寄存器別名為指令指針寄存器也就是說(shuō):CS * 16 + IP = 實(shí)際地址2、Debug工具什么是debugeDebug是DOS、Windows都提供的實(shí)模式程序調(diào)試工具可以查看CPU各種寄存器中的內(nèi)容和機(jī)器碼級(jí)跟蹤程序的運(yùn)行Debug命令的使用Debug的R命令用來(lái)查看

11、和改變各個(gè)寄存器內(nèi)容Debug的D命令查看內(nèi)存中的內(nèi)容屏幕上的內(nèi)容有3部分:左邊顯示的是用“基地址:偏移地址”即“CS:IP”的形式表示內(nèi)存內(nèi)容。中間是用16進(jìn)制的形式表示內(nèi)存內(nèi)容。右邊是由ASCII的形式表示內(nèi)存內(nèi)容如果想查看某個(gè)寄存器的內(nèi)容,可以在d的后面加相應(yīng)的寄存器:0000然而用16進(jìn)制表示的內(nèi)容我們看不懂,如果希望用匯編語(yǔ)言顯示,則可以用下面的命令Debug的U命令將內(nèi)存機(jī)器碼轉(zhuǎn)為匯編指令下面用u cs:0100表示查找cs寄存器其中左邊是基地址:偏移地址。中間是16進(jìn)制表示的操作指令。右邊兩行表示的是匯編指令Debug的T命令跟蹤代碼運(yùn)行Debug的A命令以匯編指令格式在內(nèi)存中寫

12、入指令以上是把1234賦值給ax寄存器驗(yàn)證:CS IP指定的存地址中的內(nèi)容就是CPU要執(zhí)行的內(nèi)容第一步:看一下CS中當(dāng)前的內(nèi)容之后我們用T命令跟蹤程序的執(zhí)行看出:第一個(gè)cs=0B6F IP=0103 即ES:命令第二個(gè)CS=0B6F IP=0108 即JZ命令第三個(gè) CS=0B6F IP =010A 即CALL命令通過(guò)相鄰兩個(gè)ip的差可以算出上一個(gè)指令所占用的空間是多大下面看一個(gè)例子:int number ;int main()int a = 10 ;if(a0)a+ ;return 0 ;程序分為:數(shù)據(jù)段,,代碼段,堆棧段其中數(shù)據(jù)段用來(lái)存放應(yīng)用程序的全局變量,如本例的int number代碼

13、段:if(a0) a+ ;堆棧段:int a = 10;局部變量如果我們想為全局變量賦值,我們必須先找到其在內(nèi)存中的地址 CPU根據(jù)什么指定內(nèi)存中的哪些數(shù)據(jù)是我們定義的全局變量?即 DS寄存器(內(nèi)存訪問(wèn))CPU是根據(jù)DS(Data Segment)這個(gè)寄存器和任意一個(gè)通用寄存器的值或其他數(shù)值組成數(shù)據(jù)段的物理地址如:DS :0 或者 DS : BX第一個(gè)表示方法是將一個(gè)內(nèi)容直接保存在DS寄存器的一個(gè)地址中第二種表示時(shí)將一個(gè)內(nèi)容保存到另一個(gè)BX通用寄存器中當(dāng)然還有其他表示方式上面兩種方式表示的都是物理內(nèi)存中具體的地址因?yàn)槿肿兞勘4嬖趦?nèi)存地址中,因此我們要訪問(wèn)這些物理地址內(nèi)存的表示方法:在匯編語(yǔ)言

14、中表示內(nèi)存的兩種寫法mov ds:13ABH,1234H即把1234放入內(nèi)存地址ds*16 + 13AB中mov 13ABH ,1234H第二種更常見(jiàn)堆棧主要內(nèi)容:棧的概念 ss寄存器和sp寄存器 post和pop指令棧的數(shù)據(jù)結(jié)構(gòu):棧是一種具有特殊的訪問(wèn)方式的存儲(chǔ)空間,它的特殊性就在于,最后進(jìn)入這個(gè)空間的數(shù)據(jù),最先出去。數(shù)據(jù)出棧:在內(nèi)存中棧是從高字節(jié)向低字節(jié)存放數(shù)據(jù)堆棧段存放的是函數(shù)的局部變量,數(shù)據(jù)段存放的是全局變量ss、sp寄存器同代碼段和數(shù)據(jù)段一樣,CPU如何知道一段內(nèi)存空間被當(dāng)做棧使用?Cpu是根據(jù)ss這個(gè)段寄存器和sp這個(gè)通用寄存器來(lái)感知堆棧段的存在。也就是說(shuō),cpu從ss中取出一個(gè)值

15、,再?gòu)膕p中取出一個(gè)值,ss * 16 + sp 所指向的那個(gè)內(nèi)存單元即是棧內(nèi)存段寄存器ss存放棧的基地址,sp存放的是棧頂?shù)钠频刂穲?zhí)行入棧和出棧的時(shí)候,如何知道哪個(gè)單元是棧頂單元?cpu規(guī)定,任何時(shí)候ss:sp都指向站頂元素push指令的執(zhí)行過(guò)程:如果ax=1234h。即ax寄存器中存放的是1234這個(gè)16進(jìn)制的數(shù),現(xiàn)在想把它放入棧中,假設(shè)現(xiàn)在是空棧,ss:sp指針指向棧頂,此時(shí),將34壓入棧低,12放到棧頂,即先放低字節(jié)的數(shù),再放高字節(jié)的數(shù),最后ss:sp指針指向12具體過(guò)程:push ax(1) 將ax中的內(nèi)容送入ss:sp指向的內(nèi)存單元處,ss:sp此時(shí)指向新棧頂(2) Sp = s

16、p -2 ;通過(guò)這條指令使指針往上移(3) 入棧數(shù)據(jù)是從高字節(jié)往低字節(jié)進(jìn)行排列的,即最上面是高字節(jié)。出棧則相反Pop ax將ss:sp指向的內(nèi)存單元處的內(nèi)容賦值給ax寄存器,然后sp+2.,ss:sp此時(shí)指向新的棧頂出棧數(shù)據(jù)是從低字節(jié)往高字節(jié)排列操作解釋:a命令,用匯編語(yǔ)言的形式在內(nèi)存中寫入指令mov ax ,1234將1234賦值給ax寄存器之后分別是:將7ba1、2213分別寫入bx、cx寄存器push ax:將ax中的數(shù)據(jù)入棧之后分別是:將bx、cx入棧pop ax:將ax出棧之后分別是:將bx、cx出棧由于入棧順序和出棧順序相反,所以將三個(gè)數(shù)據(jù)經(jīng)過(guò)這樣的處理之后,三個(gè)數(shù)字的順序?qū)⒎粗?/p>

17、出。下面用t命令跟蹤程序驗(yàn)證:可以發(fā)現(xiàn)前三步分別對(duì)ax、bx、cx賦值了,顯著的變化時(shí)ax,bx,cx的值變了,而且ip的值每次加3繼續(xù)驗(yàn)證:這三步分別是將ax,bx,cx入棧,入棧時(shí)會(huì)將數(shù)據(jù)放到棧中,顯著的變化時(shí)sp的值每次減3下面繼續(xù)驗(yàn)證,出棧:這三步進(jìn)行了出棧操作,可以發(fā)現(xiàn)的顯著變化時(shí)sp每次加3。而且ax的值和cx的值對(duì)換了關(guān)于棧的疑問(wèn)1、 當(dāng)棧滿時(shí)再進(jìn)行入棧會(huì)發(fā)生什么情況?2、 當(dāng)??諘r(shí)再使用出棧指令會(huì)發(fā)生什么情況?棧頂越界是危險(xiǎn)的!因?yàn)槲覀兗热粚⒁欢慰臻g安排為棧,那么在??臻g之外的空間里很可能存放了具有其他用途的數(shù)據(jù)和代碼,這些數(shù)據(jù)或代碼可能是我們自己的程序,也可能是別的程序中的s

18、s:sp寄存器配合指定了棧頂位置,可是如何保證在入棧和出棧時(shí)棧頂不會(huì)超出??臻g?8086CPU不保證對(duì)棧的操作不會(huì)越界也即:8086CPU只知道棧頂在何處,(由ss:sp指示),而不知道讀者安排的??臻g有多在。第一個(gè)Hello World匯編程序匯編集成開(kāi)發(fā)環(huán)境如何利用匯編語(yǔ)言編寫一個(gè)簡(jiǎn)單的Hello world應(yīng)用程序?1、 匯編語(yǔ)言中變量又是如何定義的?2、 匯編語(yǔ)言如何把要顯示的內(nèi)容輸出到屏幕上呢?3、 匯編語(yǔ)言編寫的程序如何進(jìn)行調(diào)試?編寫包含多段的應(yīng)用程序msg是全局變量,應(yīng)該放在應(yīng)用程序的數(shù)據(jù)段中打印msg變量的是程序代碼,應(yīng)該放在應(yīng)用程序的代碼段中4、 如何讓匯編語(yǔ)言知道我們編寫的

19、程序是有多個(gè)段組成的?assume關(guān)鍵字assume關(guān)鍵字表示用來(lái)假設(shè)某一段寄存器和程序中的某一個(gè)用segmentends定義的段相關(guān)聯(lián) (假設(shè)的意思)db指令那么如何在數(shù)據(jù)段中定義全局變量msg并賦初值?使用db(define byte)指令來(lái)定義字節(jié)的內(nèi)容,語(yǔ)法:label db initalizer,initializer,initializerlabel 表示任選標(biāo)號(hào),相當(dāng)于C語(yǔ)言的變量名db表示define byte 定義個(gè)字節(jié)數(shù)據(jù)initalizer表示初始值msg db “hello world”這里寫單引號(hào)也行,在匯編中都一樣上面的語(yǔ)句相當(dāng)于C語(yǔ)言的:char msg = “h

20、ello world”下面研究如何打印出上面定義的數(shù)據(jù)觀察上面的內(nèi)存地址空間圖,我們說(shuō):只要我們把“hello world”這個(gè)字符串拷貝到顯存地址空間,我們的顯卡就自動(dòng)地把它顯示到屏幕上那么在CPU中哪一段地址空間是顯存地址空間呢?CPU已經(jīng)為我們安排好了!其中顯示地址中又分為很多種顯示模式vga顯存地址空間在內(nèi)存地址空間中,B8000HBFFFFH共32的地址空間80*25(列X行)彩色字符模式(vga)的顯示緩沖區(qū),只要向該地址空間寫入數(shù)據(jù),寫入的內(nèi)容就立刻顯示到屏幕中8個(gè)byte可以表示一個(gè)字符,緊跟其后的是8個(gè)byte表示顏色,即用16位二進(jìn)制數(shù)表示一個(gè)顏色的字符VGA的英文全稱是V

21、ideo Graphic Array,即顯示繪圖陣列。VGA支持在640X480的較高分辨率下同時(shí)顯示16種色彩或256種灰度,同時(shí)在320X240分辨率下可以同時(shí)顯示256種顏色. 肉眼對(duì)顏色的敏感遠(yuǎn)大于分辨率,所以即使分辨率較低圖像依然生動(dòng)鮮明。VGA由于良好的性能迅速開(kāi)始流行,廠商們紛紛在VGA基礎(chǔ)上加以擴(kuò)充,如將顯存提高至1M并使其支持更高分辨率如800X600或1024X768,這些擴(kuò)充的模式就稱之為VESA(Video Electronics Standards Association,視頻電子標(biāo)準(zhǔn)協(xié)會(huì))的Super VGA模式,簡(jiǎn)稱SVGA,現(xiàn)在的顯卡和顯示器都支持SVGA模式。

22、不管是VGA還是SVGA,使用的連線都是15針的梯形插頭,傳輸模擬信號(hào)高亮的意思是粗體顯示vag顯存地址空間在80*25彩色模式下顯示器可以顯示25行80列。每個(gè)字符可以有256種屬性(背景色前景色閃爍等)一個(gè)字符在顯存中占兩個(gè)字節(jié),分別存放ASCII碼值和屬性顯示緩沖總共分為8頁(yè),每頁(yè)4KB,顯卡可以顯示任意頁(yè)內(nèi)容一般情況下顯示第0頁(yè)內(nèi)容即B8000HB8F9FH(4K的空間)到目前學(xué)過(guò)的8086段寄存器有CS(CODESEGMENT)代碼段寄存器 、SS(STACKSEGMENT)堆棧段寄存器 、DS(DATASEGMENT)數(shù)據(jù)段寄存器這幾個(gè)寄存器都有它自己特定的功能,我們不能隨便給它們

23、賦值,那怎么辦呢?CPU還為我們分配了一個(gè)ES(EXTRASEGMENT)寄存器,叫做附加段寄存器,這個(gè)寄存器專門存放我們的段地址,即B800H這個(gè)段地址存放到這個(gè)ES寄存器中:mov es,0b800h上句說(shuō)明:給es寄存器賦值B800,因?yàn)槭?6進(jìn)制,所以后面加一個(gè)H,為了CPU能辨認(rèn)這是一個(gè)16進(jìn)制的數(shù),所以前面加了一個(gè)0,當(dāng)16進(jìn)制數(shù)第一個(gè)數(shù)字不是字母的時(shí)候就不用加0了但是CPU規(guī)定,我們不可以直接將一個(gè)常量直接賦值給一個(gè)ES寄存器,所以必須通過(guò)一個(gè)中間的通用寄存器中轉(zhuǎn)一下:mov bx,0b800hmov es,bx現(xiàn)在我們?cè)侔裩ello world的一個(gè)個(gè)的拷貝到以ES為段地址,以

24、0為偏移地址的寄存器中,現(xiàn)在用一個(gè)循環(huán)來(lái)做這個(gè)工作匯編中的循環(huán) loop關(guān)鍵字如何把我們定義的字符一個(gè)個(gè)的拷貝到顯存的緩沖區(qū)中?語(yǔ)法:標(biāo)號(hào):指令1指令2loop 標(biāo)號(hào)那么循環(huán)次數(shù)怎么指定呢?這個(gè)數(shù)字存放在CX寄存器中,循環(huán)的次數(shù)由CX寄存器中的數(shù)據(jù)來(lái)決定,循環(huán)完一句自動(dòng)減一。循環(huán)內(nèi)部如何實(shí)現(xiàn)功能?如何獲得在數(shù)據(jù)段中的每一個(gè)內(nèi)容?這涉及到內(nèi)存訪問(wèn)1、 我們知道hello world屬于數(shù)據(jù)段內(nèi)容,那么其中每個(gè)字符都可以通過(guò)數(shù)據(jù)段地址加上偏移地址獲得2、 匯編中數(shù)據(jù)段地址存放在ds寄存器中,那么要獲得數(shù)據(jù)段第一個(gè)字節(jié)內(nèi)容就要如下表示:ds:0或ds:si第一個(gè)表示獲得段地址在ds中,偏移地址是0.

25、在循環(huán)中偏移地址應(yīng)該是可變的,因此應(yīng)放在一個(gè)寄存器中si寄存器相當(dāng)于通用寄存器把H從數(shù)據(jù)段ds中拷貝到es寄存器中的代碼如下:mov es:0,ds:0 在loop中應(yīng)該用變量替換0mov si ,0/初始化為0mov bx,0s:mov es:bx,ds:si但是匯編中不支持這樣的語(yǔ)法,因?yàn)檫@只指定了初始地址,沒(méi)有指定結(jié)束語(yǔ)地址所以也需要一個(gè)中間的寄存器導(dǎo)一下s:mov ax,dssimov es,ax但是一個(gè)字符是8位的,但是ax是16位的,此時(shí)我們只用其一半就可以al和ah寄存器設(shè)計(jì)80*86cpu時(shí),為了能夠完全兼容8088cpu(8位cpu), 我們可以把通用寄存器AX,BX,CX,

26、DX分別當(dāng)作兩個(gè)8位寄存器來(lái)使用AX寄存器可以分成AH和AL兩個(gè)8位寄存器,其余類似s:mov al,dssimov es,al然后我們知道,字符的屬性緊跟在字符后面,我們用紅底綠字01000010bmov ah, 01000010bmov es:bx+1,ah然后si加1inc sibx要加2add bx,2最后循環(huán)結(jié)束loop s代碼段和數(shù)據(jù)段我們只是人為的規(guī)定了Assume cs:code,ds:data但是編譯器不知道,因此必須明確指定現(xiàn)在我們?yōu)槌绦騽澐殖隽舜a段和數(shù)據(jù)段,那么CPU是否就能夠執(zhí)行代碼段中的指令和數(shù)據(jù)中的數(shù)據(jù)呢?答案是否定的,因?yàn)檫@是我們?nèi)藶榻o予的標(biāo)記,方便我們閱讀CP

27、U卻完全不知道解決:把標(biāo)記了data的數(shù)據(jù)段地址賦給ds 段寄存器,mov ax,datamov ds,ax此時(shí)編譯器就知道了data代表了數(shù)據(jù)段代碼段CPU可以自動(dòng)獲得代碼段地址CPU可以獲得代碼段的段地址,卻不知道其偏移地址,此時(shí)可以在代碼首行加入一個(gè)start關(guān)鍵字,在最后加一個(gè)end start屏幕暫停:mov ax,4c00h int 21h所有代碼assume cs:code,ds:datadata segmentmsg db hello worlddata endscode segmentstart:mov ax,datamov ds,axmov bx,0b800hmov es,

28、bxmov cx,11mov si,0mov bx,0mov ah,01000010b s:mov al,ds:si mov es:bx,al mov es:bx+1,ah inc si add bx,2 loop s mov ax,4c00h int 21hcode endsend start中斷1、 中斷的概念a) 什么是中斷?任何一個(gè)通用CPU,比如8086都具備一種能力,可以執(zhí)行完成當(dāng)前正在執(zhí)行的指令后,檢測(cè)到從CPU外部或內(nèi)部產(chǎn)生的一種特殊信息,并立即對(duì)接收的信息進(jìn)行處理。這種信息稱之為中斷信息中斷的意思是指:CPU不再接著(剛剛執(zhí)行的指令)向下執(zhí)行,而是轉(zhuǎn)去處理這個(gè)特殊信息2、關(guān)于

29、中斷的疑問(wèn):中斷發(fā)生時(shí)CPU如何找到中斷處理程序?中斷處理程序有很多種,那么每個(gè)中斷程序存放在哪里?中斷處理完成之后,CPU如何繼續(xù)運(yùn)行之前的中斷的程序?中斷向量表中斷向量表在內(nèi)存中保存,其中存放著256個(gè)中斷所對(duì)應(yīng)的中斷處理程序的入口,如下0號(hào)中斷對(duì)應(yīng)的中斷處理的入口地址1號(hào)中斷對(duì)應(yīng)的中斷處理的入口地址2號(hào)中斷對(duì)應(yīng)的中斷處理的入口地址3號(hào)中斷對(duì)應(yīng)的中斷處理的入口地址那么中斷向量表一般存放在哪里呢?CPU規(guī)定了內(nèi)存中的某個(gè)地址專門存放中斷向量表中斷向量表一般保存在內(nèi)存0000 :0000到 0000:03FE那么在中斷向量表中一表項(xiàng)占多少內(nèi)存空間?一個(gè)表項(xiàng)存放一個(gè)中斷向量,也就是一個(gè)中斷程序入口地址,這個(gè)入口地址包括段地址和偏移地址因此每個(gè)表項(xiàng)占兩個(gè)字的空間,高地址存放段地址,低地址存放偏移地址 考慮一個(gè)問(wèn)題:當(dāng)CPU執(zhí)行完中斷處理程序后必須返回繼續(xù)執(zhí)行原來(lái)的命令,那么CPU根據(jù)什么能夠回到原來(lái)執(zhí)行代碼中斷執(zhí)行?遇到中斷時(shí)CPU把CS和IP內(nèi)存入棧暫時(shí)保存起來(lái),等中斷程序執(zhí)行結(jié)束后通過(guò)出棧指令重新獲得原來(lái)的

溫馨提示

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

評(píng)論

0/150

提交評(píng)論