匯編語言課件_第1頁
匯編語言課件_第2頁
匯編語言課件_第3頁
匯編語言課件_第4頁
匯編語言課件_第5頁
已閱讀5頁,還剩178頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

匯編語言

第1章基礎(chǔ)知識機(jī)器語言匯編語言的產(chǎn)生和組成存儲器指令和數(shù)據(jù)存儲單元CPU對存儲器的讀寫三總線結(jié)構(gòu)一、機(jī)器語言機(jī)器指令:是一系例由二進(jìn)制數(shù)(0或1)組成的代碼構(gòu)成的,機(jī)器唯一能正確執(zhí)行的命令。機(jī)器語言:機(jī)器指令的集合。

例:S=768+12288–1280

機(jī)器碼:

101100000000000000000011000001010000000000110000001011010000000000000101機(jī)器語言特點(diǎn):

難記憶、可讀性差、不易修改,直接面向機(jī)器,所以不同的微處理器可有不同的機(jī)器語言。但編寫的程序占用內(nèi)存小,運(yùn)行速度快,能直接對硬件控制。二、匯編語言的產(chǎn)生匯編語言:是機(jī)器語言便于記憶的書寫格式。例:操作;將寄存器BX中的內(nèi)容送到AX中機(jī)器指令:1000100111011000匯編指令:MOV AX,BX特點(diǎn):兼有機(jī)器語言的優(yōu)點(diǎn),比機(jī)器語言易記易學(xué),但通用性差,隨機(jī)而異。寄存器:是CPU中可以存儲數(shù)據(jù)的器件。機(jī)器語言由0、1組成的二進(jìn)制代碼:1000100111011000匯編語言是機(jī)器語言的助記格式:MOV AX,BX高級語言是更接近于生活用語的書寫格式:C、BASIC、PASCAL、FORTRAN注:計(jì)算機(jī)只能執(zhí)行機(jī)器指令,所以用非機(jī)器語言寫出的程序都必須翻譯成機(jī)器語言后才能被計(jì)算機(jī)執(zhí)行。源程序:用高級語言(包括匯編)編寫的程序。匯編:用匯編程序?qū)⒃闯绦蚍g成機(jī)器代碼的過程。源程序編譯器機(jī)器語言計(jì)算機(jī)三、匯編語言的組成由以下幾類組成:匯編指令(指令性語句):機(jī)器碼的助記符,有對應(yīng)的機(jī)器碼。(例:MOVAX,BX)偽指令:沒有對應(yīng)的機(jī)器碼,由編譯器識別,沒有對應(yīng)的機(jī)器碼。(例:SEGMENT…..)其它符號(運(yùn)算符):+、-、*、/等,由編譯器識別,沒有對應(yīng)的機(jī)器碼。注:匯編語言的核心是匯編指令,本課程主講80X86指令。數(shù)據(jù)傳送指令:MOV、XCHG、LEA、PUSH、POP算術(shù)運(yùn)算指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV邏輯運(yùn)算和移位指令:AND、OR、XOR、SAL/SHL、SAR/SHR、ROL、ROR串操作指令:MOVS、CMPS、REP、LODS程序控制指令:JMP、CALL、RET、JNS、JNE、JL、JG、LOOP、INT輸入輸出指令:IN、OUT四、存儲器

存儲器(內(nèi)存)是計(jì)算機(jī)中僅次于CPU的核心部件,由它向CPU提供要運(yùn)行和處理的數(shù)據(jù)。存儲器外部存儲器內(nèi)部存儲器(光盤、軟盤、硬盤)(ROM、RAM)CPU數(shù)據(jù)數(shù)據(jù)結(jié)果注:CPU不能直接和磁盤交換數(shù)據(jù),必須由內(nèi)存來交換。五、指令和數(shù)據(jù)指令:是告訴計(jì)算機(jī)做什么工作。數(shù)據(jù):是計(jì)算機(jī)(CPU)要處理的對象。注:指令和數(shù)據(jù)在形式上完全相同,都是一組二進(jìn)制信息,但應(yīng)用上意義不同。例:數(shù)據(jù)89D8H——1000100111011000指令MOV AX,BX——1000100111011000六、存儲單元

將存儲器劃分成若干個(gè)基本的存儲單位,稱為存儲單元。給每個(gè)存儲單元從0開始順序編號,稱為存儲單元的地址。內(nèi)存0123....127100111000110111111100011存儲單元位(bit):計(jì)算機(jī)的最小信息單位,即一位二進(jìn)制數(shù)(0或1)字節(jié)(Byte):1Byte=8bit

一個(gè)存儲單元可以存儲一個(gè)字節(jié)即8bit的信息。1KB=1024B1MB=1024KB1GB=1024MB1TB=1024GB七、CPU對存儲器的讀寫CPU可以從存儲器中取出數(shù)據(jù)進(jìn)行處理(讀)CPU將處理后的數(shù)據(jù)放到存儲器中保存(寫)思考:CPU如何選擇要讀/寫的對象(寄存器、ROM、RAM、接口)CPU如何找到要處理的數(shù)據(jù)。CPU傳送的三種信息存儲單元的地址(地址信息)選擇芯片、讀或?qū)懙拿睿刂菩畔ⅲ┳x或?qū)憙?nèi)存的數(shù)據(jù)內(nèi)容(數(shù)據(jù)信息)CPU2331089C3B12543210地址總線3數(shù)據(jù)總線控制總線0808讀內(nèi)存命令→機(jī)器碼:101000000000001100000000匯編指令MOV AX,[3]八、地址總線CPU地址總線內(nèi)存數(shù)據(jù)總線控制總線訪問地址為12的內(nèi)存單元時(shí),地址總線上傳送的內(nèi)容?一個(gè)CPU有N根地址線,則可說這個(gè)CPU的地址總線寬度為N??蓪ぶ房臻g為2N個(gè)存儲單元。思考:1個(gè)CPU的尋址空間為1KB,那么它的地址總線的寬度為多少?所能表示的地址范圍為多少?九、數(shù)據(jù)總線

數(shù)據(jù)總線的寬度決定了CPU和外界的數(shù)據(jù)傳送速度,N根數(shù)據(jù)線一次可以傳送N個(gè)bit的數(shù)據(jù)。8088CPU數(shù)據(jù)總線內(nèi)存地址總線控制總線十、控制總線

CPU對外部器件的控制是通過控制總線進(jìn)行的,控制總線是一些不同控制線的集合。有多少根控制總線,就意味著,這個(gè)CPU提供了對外部器件的多少種控制,所以控制總線的寬度決定了CPU對外部器件的控制能力。小結(jié)匯編指令是機(jī)器指令的助記符,同機(jī)器指令一一對應(yīng)每一種CPU都有自己的匯編指令集CPU可以直接使用的信息在存儲器中存放在存儲器中指令和數(shù)據(jù)沒有任何區(qū)別,都是二進(jìn)制信息存儲單元從零開始順序編號一個(gè)存儲單元可以存儲8個(gè)bit小結(jié)每一個(gè)CPU芯片都有許多管腳,這些管腳和總線相連。也可以說,這些管腳引出總線。一個(gè)CPU引出的三種總線的寬度標(biāo)志了這個(gè)CPU的不同方面的性能:(1)地址總線的寬度決定了CPU的尋址能力;(2)數(shù)據(jù)總線的寬度決定了CPU與其它器件進(jìn)行數(shù)據(jù)傳送時(shí)的一次數(shù)據(jù)傳送量;(3)控制總線寬度決定了CPU對系統(tǒng)中其它器件的控制能力。檢測點(diǎn)1.1(1)一個(gè)CPU尋址能力為8KB,那么它的地址總線寬度為?(2)8080、8088、80286、80386的地址總線寬度分別為16、20、24、32根,它們的尋址能力?(3)8080、8088、8086、80286、80386的地址總線寬度分別為8、8、16、16、32根,它們一次傳送的數(shù)據(jù)為多少bit?十一、內(nèi)存地址空間(概述)

一個(gè)CPU可以尋到的內(nèi)存單元的范圍稱為該CPU的內(nèi)存地址空間。

例:8086CPU的地址總線為20根,所以其內(nèi)存地址空間為00000H—FFFFFH,共有1MB。十二、主板十三、接口卡十四、各類存儲器芯片隨機(jī)存儲器(RAM) 用于存放供CPU使用的絕大部分程序和數(shù)據(jù)。裝有BIOS的只讀存儲器(ROM)接口卡上的RAM十五、內(nèi)存地址空間CPU在控制各類存儲器時(shí),把它們都當(dāng)作內(nèi)存來對待,把它們總的看作一個(gè)由若干存儲單元組成的邏輯存儲器,這個(gè)邏輯存儲器就是我們這里所說的內(nèi)存地址空間。CPU內(nèi)存地址空間總線RAM主存儲器ROM系統(tǒng)BIOSRAM顯存ROM顯卡、網(wǎng)卡BIOS8088/86微處理器的內(nèi)部結(jié)構(gòu)執(zhí)行部分EU總線接口部分BIU返回寄存器組AXBXCXDXSPBPSIDI8位8位AHALAXBHBLBXCHCLCXDHDLDX16位寄存器通用寄存器累加器基址計(jì)數(shù)器數(shù)據(jù)指針寄存器變址寄存器堆棧指針基數(shù)指針源變址目的變址寄存器組IPPSWCSDSSSES控制寄存器段寄存器狀態(tài)標(biāo)志指令指針代碼段數(shù)據(jù)段堆棧段附加段提供相應(yīng)的段地址。一、通用寄存器8086CPU的內(nèi)部寄存器都是16位。將AX、BX、CX、DX四個(gè)寄存器稱為通用寄存器。通用寄存器可分為兩個(gè)獨(dú)立的8位寄存器來用。AX寄存器的邏輯結(jié)構(gòu)15141312111098765432100000000000010010MOVAX,18MOVAX,20000010011100010000016位寄存器分成兩個(gè)8位寄存器的使用情況AX寄存器的邏輯結(jié)構(gòu)1514131211109876543210AX寄存器的邏輯結(jié)構(gòu)15141312111098765432107654321076543210AHAL0100111000100000寄存器寄存器中的數(shù)據(jù)所表示的值A(chǔ)XAHAL010011100010000020000(4E20H)0100111078(4EH)0010000032(20H)一個(gè)8位寄存器所能存儲的數(shù)據(jù)的最大值是多少?一個(gè)16位寄存器所能存儲的最大值又是多少?二、字在寄存器中的存儲字節(jié)(Byte):由8個(gè)比特組成;可以存在8位寄存器中。字(word):由兩個(gè)字節(jié)組成;這兩個(gè)字節(jié)分別稱為這個(gè)字的高位字節(jié)和低位字節(jié)。注:一個(gè)16位寄存器中的數(shù)據(jù)即可以看成一個(gè)字型數(shù)據(jù),也可以看作兩個(gè)字節(jié)型數(shù)據(jù)。例:可看成一個(gè)字型數(shù)據(jù)20000存在AX中,也可看成兩個(gè)獨(dú)立的字節(jié)型數(shù)據(jù)分為為78和32。01001110001000000100111000100000三、幾條匯編指令注:在匯編語言中英文字母不區(qū)分大小字。匯編指令控制CPU完成的操作用高級語言描述MOVAX,18將18送入寄存器AXAX=18MOVAH,78將78送入寄存器AHAH=78ADDAX,8將寄存器AX中的數(shù)值加上8AX=AX+8MOVAX,BX將寄存器BX中的數(shù)據(jù)送入AXAX=BXADDAX,BX將AX和BX中的數(shù)值相加,結(jié)果保存在AX中AX=AX+BX程序段中的指令A(yù)X中的數(shù)據(jù)BX中的數(shù)據(jù)MOVAX,4E20HADDAX,1406HMOVBX,2000HADDAX,BXMOVBX,AXADDAX,BX設(shè)原AX=BX=0000H,分析下列指令執(zhí)行后AX,BX中的數(shù)據(jù)為多少?4E20H0000H6226H0000H6226H2000H8226H2000H8226H8226H8226H+8226H=1044CH AX=?044CH8226H注:當(dāng)所保存的數(shù)據(jù)位數(shù)大于寄存器的位數(shù)時(shí),高位的數(shù)據(jù)會丟失,稱為數(shù)據(jù)溢出。程序段中的指令A(yù)X中的數(shù)據(jù)BX中的數(shù)據(jù)MOVAX,001AHMOVBX,0026HADDAL,BLADDAH,BLADDBH,ALMOVAH,0ADDAL,85HADDAL,93H001AH 0000H001AH 0026H0040H 0026H2640H 0026H2640H 4026H0040H 4026H00C5H 4026H0058H 4026H注:當(dāng)通用寄存器作為8位寄存器使用時(shí),低8位和高8位相當(dāng)于兩個(gè)獨(dú)立的寄存器,它們之間沒有直接關(guān)系,不能產(chǎn)生進(jìn)位。ADDAX,85HAX=?ADDAX,93HAX=?注意:

在進(jìn)行數(shù)據(jù)傳送或運(yùn)算時(shí),要注意指令的操作數(shù)的位數(shù)要匹配。例:數(shù)據(jù)位數(shù)不匹配的指令 MOV AX,BL MOV BH,AX MOV AL,20000 ADD AL,100H練習(xí):使用4條指令計(jì)算2的4次方四、物理地址

我們給每個(gè)存儲單元給了唯一的一個(gè)編號,這個(gè)編號就是這個(gè)內(nèi)存單元的物理地址。在8086/8088CPU中對外有20根地址線尋址,所以其系統(tǒng)中的內(nèi)存單元物理地址為20位的地址編號。地址總線內(nèi)存......20根線,每根可表0/1,總共可表多少數(shù)?即為地址編號總數(shù)。存儲單元按序編號,即為其物理地址。00000HFFFFFH是否給我們這樣一個(gè)概念?尋址功能輸入:20位二進(jìn)制串(地址)輸出:8/16位二進(jìn)制串(數(shù)值)8086具有20根地址總線,16根數(shù)據(jù)總線五、16位結(jié)構(gòu)的CPU16位機(jī):運(yùn)算器一次最多可以處理16位的數(shù)據(jù)。寄存器的最大寬度為16位;寄存器和運(yùn)算器之間的通路為16位。六、8086CPU給出物理地址的方法1)CPU中的段寄存器(CS)提供段地址,指令指針寄存器(IP)提供偏移地址;2)段地址和偏移地址通過內(nèi)部總線送入地址加法器;3)地址加法器將兩個(gè)16位地址合成一個(gè)20位的物理地址;4)地址加法器將20位的物理地址送輸入輸出控制電路;5)輸入輸出控制電路將20位物理地址送上外部地址總線;6)地址總線將20位物理地址送入內(nèi)存,尋址。其他部件地址加法器輸入輸出控制電路偏移地址段地址16位物理20位內(nèi)存20位物理地址8位數(shù)據(jù)總線16位控制總線CPU物理地址=段地址×16+偏移地址=段地址(左移4位)+偏移地址8088CPU訪問內(nèi)存單元工作過程

訪問地址為123C8H的內(nèi)存單元時(shí),地址加法器的工作過程(數(shù)據(jù)皆為十六進(jìn)制表示)CSIP寄存器組地址加法器1230H00C8H相關(guān)部件提供段地址和偏移地址段地址和偏移地址送入地址加法器123000C8段地址左移4位(×

16)1230000C812300+00C8123C8段地址+偏移地址形成20位物理地址輸出20位物理地址123C8H地址加法器的工作過程段地址:×16=左移4位(2進(jìn)制)=左移1位(16進(jìn)制)左移位數(shù)二進(jìn)制十六進(jìn)制十進(jìn)制010B2H22×201100B4H42×2121000B8H82×22310000B10H162×234100000B20H322×24一個(gè)數(shù)據(jù)的二進(jìn)制形式左移N位,相當(dāng)于該數(shù)據(jù)乘以2N加法器左移4位相當(dāng)于乘以24(16)七、“段地址×16+偏移地址=物理地址”的本質(zhì)含義

本質(zhì)含義:CPU在訪問內(nèi)存時(shí),用一個(gè)基礎(chǔ)地址(段地址×16)和一個(gè)相對于基礎(chǔ)地址的偏移地址相加,給出了內(nèi)存單元的物理地址。八、段的概念

段是我們?yōu)榱斯芾韮?nèi)存而引入的一個(gè)虛擬的概念,我們可以將內(nèi)存地址連續(xù)、起始地址為16的倍數(shù)的一組內(nèi)存單元看作一個(gè)段來管理,但事實(shí)上,內(nèi)存并沒有被真正劃分成段。注:段地址×16必然是16的倍數(shù),所以一個(gè)段的起始地址一定是16的倍數(shù)(即:XXXX0H);偏移地址為16位,所以一個(gè)段的長度最大為64KB。思考:觀察下面的地址物理地址 段地址 偏移地址21F60H 2000H 1F60H 2100H 0F60H 21F0H 0060H 21F6H 0000H 1F00H 2F60HCPU可以用不同的段地址和偏移地址形成同一個(gè)物理地址。從這里可看出,分段僅僅是一個(gè)虛擬的概念。如果給定一個(gè)段地址,僅通過變化偏移地址來進(jìn)行尋址,最多可定位多少內(nèi)存單元?九、段寄存器 在CPU中提供段地址的寄存器符號名稱作用配合寄存器CS代碼段提供(程序、指令)段地址IPDS數(shù)據(jù)段用于存放數(shù)據(jù)的存儲器段的起始地址。(包含程序使用的大部分?jǐn)?shù)據(jù)的存儲區(qū)域)SS堆棧段定義堆棧的存儲區(qū)SPES附加段存放附加存儲器段的段地址。常用于存放數(shù)據(jù)或串操作中作目標(biāo)數(shù)據(jù)段十、CS和IPCS—代碼段:提供當(dāng)前要執(zhí)行的指令的段地址。IP—指令指針寄存器:指向當(dāng)前要執(zhí)行的指令的偏移地址。 由CS和IP分別提供一個(gè)16位的段地址和偏移地址,經(jīng)地址加法器合成一個(gè)20位的物理地址,該地址為當(dāng)前要執(zhí)行的指令所在的位置(CS:IP)。AXBX其他部件CSIP指令緩沖器執(zhí)行控制器地址加法器輸入輸出控制電路2000A20009D8200080120007D820006892000500200040320003BB2000201200012320000B8CPU內(nèi)存地址總線數(shù)據(jù)總線Movax,0123HMovbx,0003HMovax,bxAddax,bx若當(dāng)前CPU中的狀態(tài)為:CS=2000,IP=00002000000020000200002000020000B82301B82301000100020003000320003B8230120003B823012000320003BB03000123BB0300000620006B9D8000800032000801D8000A00032000A0006AXBX其他部件CSIP指令緩沖器執(zhí)行控制器地址加法器輸入輸出控制電路2000A20009D8200080120007D820006892000500200040320003BB2000201200012320000B8CPU內(nèi)存地址總線數(shù)據(jù)總線Movax,0123HMovbx,0003HMovax,bxAddax,bx(1)從CS:IP指向內(nèi)存單元讀取指令,讀取的指令進(jìn)入指令緩沖器;IP+nN=所取指令的長度。(2)IP=IP+N,從而指向下一條指令;(3)執(zhí)行和處理取到的指令,重復(fù)步驟(1)由CS:IP指向CPU將要執(zhí)行的指令所在的物理地址,取到指令后,IP會自動(dòng)增加N指向下一條指令所在的位置;從而使計(jì)算機(jī)能夠自動(dòng)連續(xù)的執(zhí)行一個(gè)完整的程序。十一、修改CS、IP的指令若想同時(shí)修改CS、IP的內(nèi)容,可用jmp 段地址:偏移地址指令例:jmp 2AE3:3則CS=2AE3H,IP=0003H若只修改IP的內(nèi)容,可用jmp某一合法寄存器 指令例:jmpAX則執(zhí)行后IP=AX注意:CS和IP不充許直接賦值。MOVCS,1000HMOVCS,AXMOVIP,2000HA6622B8E3FFD88B0000B80123B820005H20006H20004HJmp1000:320003H20009HMovcx,ax20008H20007H20002H20001HMovax,6622H20000H10009HJmpbx10008H10007HMovbx,ax10006H10005H10004HMovax,0000H10003H10002H10001HMovax,0123H10000H已知:CPU的初始狀態(tài):CS=2000H,IP=0000H,內(nèi)存單元情況見右表,試分析指令執(zhí)行序列。MOVAX,6622HJMP1000:3MOVAX,0000H2000:00002000:00031000:0003MOVBX,AX1000:0006JMPBX1000:0008AX=6622HBX=0000HAX=6622HBX=0000HAX=0000HBX=0000HAX=0000HBX=0000HAX=0000HBX=0000H1000:0000MOVAX,0123HAX=0123HBX=0000H1000:0003十二、代碼段段:我們可以根據(jù)需要將內(nèi)存中從XXXXH:0000H開始到XXXXH:YYYYH之間一段連續(xù)的內(nèi)存空間做為一個(gè)段來使用。代碼段:用來存放指令的段稱為代碼段,代碼段由CS:IP來確定。小結(jié)16位CPU的內(nèi)部結(jié)構(gòu)寄存器段地址、偏移地址、物理地址CPU執(zhí)行指令的過程一、內(nèi)存中字的存儲110001111111011000111001內(nèi)存單元寄存器的邏輯結(jié)構(gòu)1514131211109876543210字單元:即存放一個(gè)字型數(shù)據(jù)(16位)的內(nèi)存單元,由兩個(gè)地址連續(xù)的內(nèi)存單元組成。高地址內(nèi)存單元中存放字型數(shù)據(jù)的高位字節(jié),低地址內(nèi)存單元中存放字型數(shù)據(jù)的低位字節(jié)。0110111110011100字單元020H14EH212H300H45例:1)0地址單元中存放的字節(jié)型數(shù)據(jù)是多少?2)0地址字單元中存放的字型數(shù)據(jù)是多少?3)2地址單元中存放的字節(jié)型數(shù)據(jù)是多少?4)2地址字單元中存放的字型數(shù)據(jù)是多少?5)1地址字單元中存放的字型數(shù)據(jù)是多少?二、DS和[address]DS—數(shù)據(jù)段寄存器:提供數(shù)據(jù)所在內(nèi)存的段地址。[address]:表示一個(gè)偏移地址為address的內(nèi)存單元。例:[1234H]指偏移地址為1234H的內(nèi)存單元。

[AX]指偏移地址為(AX)的內(nèi)存單元。10000H20H10001H4EH10002H12H10003H00H10004H10005HMOV BX,1000HMOV DS,BXMOV AL,[0000H]CPU要存取內(nèi)存中的數(shù)據(jù)時(shí),段地址默認(rèn)在DS寄存器中,偏移地址在指令中給出。通用寄存器AX、BX、CX、DX、BP、SP、SI、DI、AL、AH、BL、BH、CL、CH、DL、DH存儲器立即數(shù)段寄存器CS、DSES、SSCS只能作源操作數(shù)MOV AX,1234HMOV BL,12HMOV CX,03HMOV [0],12HMOV [0200H],1234HMOV [AX],03HMOV AX,BXMOV DX,AXMOV BL,ALMOV AX,[0]MOV [0],AXMOV BL,[AX]MOV AX,DSMOV DS,AXMOV AX,CSMOV CS,AX

MOV DS,[0]MOV [1],ESMOV [AX],CS判斷下列指令是否正確,若錯(cuò)誤,為什么?1、MOVCL,1000H2、MOV AL,[1000H]3、MOV[BX],[SI]4、MOVAH,BH5、MOVAX,[SI]6、MOV 1234H,BX7、MOVCL,AX8、MOVCS,AX9、MOV DS,CS問題:試寫幾條指令,將AL中的數(shù)據(jù)保存到內(nèi)存單元12345H中。 MOV BX,1000H MOV DS,BX MOV [2345H],AL三、字的傳送MOV BX,1000HMOV DS,BXMOV AX,[0] ;將1000:0處的字型數(shù)據(jù)送入AX中MOV [0],CX ;將CX中的16位數(shù)據(jù)送到1000:0處MOV BH,[0]

;將1000:0處的字節(jié)型數(shù)據(jù)送入BH當(dāng)向內(nèi)存單元中存取數(shù)據(jù)時(shí),若操作的為字節(jié)型數(shù)據(jù)則一次讀寫一個(gè)內(nèi)存單元,若為字型數(shù)據(jù)則按低地址為低8位,高地址為高8位的原則存取數(shù)據(jù)。例:內(nèi)存單元中的情況如圖所示,寫出下面指令執(zhí)行后寄存器AX,BX,CX中的值。

MOV AX,1000H MOV DS,AX MOV AX,[0] MOV BX,[2] MOV CX,[1] ADD BX,[1] ADD CX,[2]10000H23H10001H11H10002H22H10003H66HAX=1000HDS=1000HAX=1123HBX=6622HCX=2211HBX=8833HCX=8833H例:內(nèi)存單元中的情況如圖所示,寫出下面指令執(zhí)行后內(nèi)存中的值。

MOV AX,1000H MOV DS,AX MOV AX,11316 MOV [0],AX MOV BX,[0] SUB BX,[2] MOV [2],BX10000H23H10001H11H10002H22H10003H11HAX=1000HDS=1000HAX=2C34HBX=2C34HBX=1B12H34H2CH12H1BH四、 MOV、ADD、SUB指令一條指令包括如下內(nèi)容:1)操作碼:指令所執(zhí)行的操作。2)操作數(shù):指令操作的對象,包括操作數(shù)的來源,操作結(jié)果的去向。操作對象通常為存儲器地址,寄存器或立即數(shù)。例:MOVAX,03HMOV操作碼操作數(shù)AX,03H目的操作數(shù)AX源操作數(shù)03H通用寄存器AX、BX、CX、DX、BP、SP、SI、DI、AL、AH、BL、BH、CL、CH、DL、DH存儲器立即數(shù)段寄存器CS、DSES、SSMOV AX,8MOV AX,BXMOV AX,[0]MOV [0],AXMOV DS,AXCS只能作源操作數(shù)MOV AX,DSMOV AX,CSMOV [0],DSMOV [0],CSMOV DS,[0]MOV CS,AXADD DS,AXADD DS,[0]五、 數(shù)據(jù)段XXXX001H12H23H34H45H56H67H78H89H9AHABH123B0H123B1H123B2H123B3H123B4H123B5H123B6H123B7H123B8H123B9H123BAHDS[address]地址加法器MOV AX,123BHMOV DS,AXMOV AL,0ADD AL,[0]ADD AL,[1]ADD AL,[2]六、棧(堆棧)棧:是具有特殊的訪問方式的存儲空間。棧有兩個(gè)基本操作:入棧;出棧。DCBADCBADCBA七、CPU提供的棧機(jī)制、PUSH和POP指令堆棧指令PUSH堆棧壓入指令格式:

PUSHOP(操作數(shù))功能:將OP中的內(nèi)容放入堆棧段中POP堆棧彈出指令格式:POPOP功能:將堆棧段中的內(nèi)容彈出到OP。說明:OP可以是段寄存器(CS除外)、通用寄存器或內(nèi)存的字單元。PUSH AXPUSH DSPUSH[0]POP AXPOP DSPOP[0]10000H10009H1000AH1000BH1000CH1000DH1000EH1000FH設(shè)現(xiàn)有10000H—1000FH為一棧段MOV AX,0123HPUSHAX0123MOVBX,2266HPUSHBX2266MOVCX,1122HPUSHCX1122POPAXAX=1122HPOPBXBX=2266HPOPCXCX=0123HCPU如何知道堆棧段在哪里?執(zhí)行PUSH、POP指令時(shí),CPU如何找到要操作的位置?CPU執(zhí)行指令——CS:IPCPU讀寫內(nèi)存數(shù)據(jù)—DS:[address]CPU進(jìn)行堆棧操作—SS:SPSS—堆棧段寄存器:指定堆棧段的段地址SP—堆棧指針寄存器:指向棧頂?shù)钠频刂啡我鈺r(shí)刻,SS:SP指向棧頂?shù)刂?。PUSH入棧過程10000H1000BH1000CH1000DH1000EH231000FH01當(dāng)前:SS=1000H,SP=000EH,AX=2266HPUSHAX棧頂66棧頂1)SP=SP-2,SS:SP指向當(dāng)前棧頂前面的單元,以當(dāng)前棧頂前面的單元為新的棧頂。222)將AX中的內(nèi)容送入SS:SP指向的內(nèi)存單元處,SS:SP此時(shí)指向新棧頂。POP出棧過程10000H1000BH1000CH1000DH1000EH231000FH01POPAX棧頂66棧頂1)將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入AX中;222)SP=SP+2,SS:SP指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂。當(dāng)??諘r(shí),棧頂?shù)奈恢脼槎嗌??八、棧頂超界的問題10000H1000BH1000CH1000DH1000EH1000FH10010H??臻gSS:SP768798235645342312當(dāng)棧滿時(shí)再執(zhí)行PUSH指令入棧,或在??諘r(shí)執(zhí)行POP指令出棧,都將發(fā)生棧頂超界的問題。在8086CPU中沒有預(yù)防棧超界的機(jī)制,所以程序員必須自己考慮,防止棧超界。九、PUSH、POP指令例:編程,將10000H—1000FH這段空間當(dāng)作棧,初始狀態(tài)棧是空的,將AX,BX,DS中的數(shù)據(jù)入棧。MOVAX,1000HMOVSS,AXMOVSP,0010HPUSHAXPUSHBXPUSHDS例:編程:將10000H—1000FH這段空間當(dāng)作棧,初始狀態(tài)是空的;設(shè)置AX=001AH,BX=001BH;將AX,BX中的數(shù)據(jù)入棧;然后將AX、BX清零;從棧中恢復(fù)AX、BX原來的內(nèi)容;MOVAX,1000MOVSS,AXMOVSP,0010HMOVAX,001AHMOVBX,001BHPUSHAXPUSHBXSUBAX,AXSUBBX,BXPOPBXPOPAX例:編程將10000H—1000FH這段空間作棧,初始狀態(tài)棧是空的;設(shè)置AX=002AH,BX=002BH;利用棧,交換AX和BX中的數(shù)據(jù)。MOVAX,1000HMOVSS,AXMOVSP,0010HMOVAX,002AHMOVBX,002BHPUSHAXPUSHBXPOPAXPOPBX例:如果要將10000H處寫入字型數(shù)據(jù)2266H,可以用以下指令完成:

MOVAX,1000H MOVDS,AX MOVAX,2266H MOV[0],AX補(bǔ)全下面的代碼,使它能夠完成同樣的功能————————————————————————MOVAX,2266HPUSHAX一、一個(gè)源程序從寫出到執(zhí)行的過程第一步:編寫匯編源程序產(chǎn)生文本文件(.txt)第二步:對源程序編譯產(chǎn)生目標(biāo)文件(.obj)第三步:對目標(biāo)文件連接產(chǎn)生可執(zhí)行文件(.exe)第四步:執(zhí)行可執(zhí)行文件程序二、源程序

匯編源程序:用匯編語言寫出的程序代碼ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADDAX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND匯編指令:告訴計(jì)算機(jī)如何處理數(shù)據(jù)的命令。例:MOVADDSUBJMPPUSHPOP注:每條匯編指令都有一一對應(yīng)的機(jī)器代碼,編譯后產(chǎn)生對應(yīng)的機(jī)器碼,最終被CPU執(zhí)行。1、偽指令:不要求CPU執(zhí)行具體操作,匯編時(shí)不產(chǎn)生機(jī)器碼,僅僅給匯編程序提供相應(yīng)的匯編信息。(程序中段的信息、堆棧的大小、調(diào)用的數(shù)據(jù)庫)ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD

AX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND匯編指令偽指令標(biāo)號(1)段定義偽指令SEGMENT和ENDS

一個(gè)完整的源程序可由3個(gè)段組成:堆棧段、數(shù)據(jù)段、代碼段。其中堆棧段和數(shù)據(jù)段可以沒有,但代碼段是必須的。SEGMENT:定義一個(gè)段開始。(注:一個(gè)段必須有一個(gè)名稱來標(biāo)識。)ENDS:說明一個(gè)段的結(jié)束,和SEGMENT成對使用。格式:

段名SEGMENT段名ENDSASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD

AX,BX ADDAX,AX MOV AX,4C00H INT 21HCODESG ENDSEND代碼段(CODE)、數(shù)據(jù)段(DATA)、堆棧段(STACK)(2)匯編結(jié)束偽指令END格式:

END[標(biāo)號]功能:表示源程序到此結(jié)束。說明:一個(gè)源程序必須有且只能有一個(gè)END語句,一般放在源程序的最后一行。ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD

AX,BX ADDAX,AX MOV

AX,4C00H INT21HCODESG ENDSEND(3)ASSUME段分配偽指令格式:

ASSUME段寄存器:段名[,段寄存器:段名,…] 用于說明源程序中定義的段或組由哪個(gè)寄存器去尋址,即建立寄存器與段間的對應(yīng)關(guān)系。例:

ASSUMECS:CODE,DS:DATA,SS:STACKCODESEGMENT MOVAX,1234H MOVDS,AXCODE ENDS一般放在源程序首行或代碼段前ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD

AX,BX ADDAX,AX MOV

AX,4C00H INT21HCODESG ENDSEND2、源程序中的“程序”ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD

AX,BX ADDAX,AX MOVAX,4C00H INT 21HCODESG ENDSEND描述信息B82301BB560403C303C0B8004CCD21編譯連接MOVAX,0123HMOVBX,0456HADD

AX,BXADDAX,AXMOV AX,4C00HINT 21H3、標(biāo)號:代表某一存儲單元地址的名字。字母:A~Z

數(shù)字:0~9特殊字符:?.@_$例:BINASC:MOVAX,BX S2:

MOVAX,BX BIG?:MOVAX,BX注意:數(shù)字不能作名稱的第一個(gè)字符。圓點(diǎn)只能用作第一個(gè)字符,標(biāo)號最長為31個(gè)字符。ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD

AX,BX ADDAX,AX MOV

AX,4C00H INT21HCODESG ENDSEND4、匯編語言源程序的結(jié)構(gòu)

一般來說,一個(gè)完整的匯編源程序應(yīng)由三個(gè)程序段組成,即代碼段、數(shù)據(jù)段和堆棧段,每個(gè)段都以SEGMENT開始,以ENDS結(jié)束,代碼段包含程序要執(zhí)行的指令;堆棧段用來在內(nèi)存中建立一個(gè)堆棧區(qū);數(shù)據(jù)段用來在內(nèi)存中建立一個(gè)適當(dāng)容量的工作區(qū),以存放程序中所需的數(shù)據(jù)。注意:一個(gè)源程序中,代碼段是必須的,而數(shù)據(jù)段和堆棧段可以沒有或有其中一個(gè)。段定義時(shí)一般最后定義代碼段。4、匯編語言源程序的結(jié)構(gòu)

一般來說,一個(gè)完整的匯編源程序應(yīng)由三個(gè)程序段組成,即代碼段、數(shù)據(jù)段和堆棧段,每個(gè)段都以SEGMENT開始,以ENDS結(jié)束,代碼段包含程序要執(zhí)行的指令;堆棧段用來在內(nèi)存中建立一個(gè)堆棧區(qū);數(shù)據(jù)段用來在內(nèi)存中建立一個(gè)適當(dāng)容量的工作區(qū),以存放程序中所需的數(shù)據(jù)。注意:一個(gè)源程序中,代碼段是必須的,而數(shù)據(jù)段和堆棧段可以沒有或有其中一個(gè)。段定義時(shí)一般最后定義代碼段。ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTACK SEGMENT DB 500 DUP(0)STACK ENDSDATA SEGMENTDATA ENDSCODE SEGMENTMAIN: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX

CODE ENDS END MAIN定義堆棧段定義數(shù)據(jù)段定義代碼段SEGMENTENDSSEGMENTENDSSEGMENTENDSEND MAINASSUME段分配段結(jié)束例:編程運(yùn)算235、程序返回ASSUME CS:CODESGCODESG SEGMENTSTART: MOVAX,0123H MOVBX,0456H ADD

AX,BX ADDAX,AX

MOV

AX,4C00H INT21HCODESG ENDSEND6、語法錯(cuò)誤和邏輯錯(cuò)誤語法錯(cuò)誤:程序在編譯時(shí)被編譯器發(fā)現(xiàn)的錯(cuò)誤。邏輯錯(cuò)誤:源程序編譯后運(yùn)行時(shí)發(fā)生的錯(cuò)誤。一個(gè)源程序執(zhí)行的過程三、編寫匯編源程序使用工具:可使用各種文本編輯工具(記事本、寫字板、WORD等),我們使用DOS下的EDIT文本編輯器。功能:產(chǎn)生一個(gè)存儲源程序的文本文件。使用方法:在DOS下運(yùn)行EDIT.EXE程序。1、C:\EDIT2、輸入?yún)R編源程序并保存為.asm文件。四、對源程序進(jìn)行編譯使用工具:使用MASM5.0編譯器功能:使用編譯器對源程序文件進(jìn)行編譯,生成包含機(jī)器代碼的目標(biāo)文件(.obj)。使用方法:在DOS下運(yùn)行MASM.EXE程序。1、C:\MASM\MASM.EXE2、輸入要進(jìn)行編譯的源程序文件路徑及名稱。3、輸入進(jìn)行編譯后產(chǎn)生的目標(biāo)文件保存的路徑及名稱。4、輸入列表文件名:5、輸入交叉文件名:五、對目標(biāo)文件進(jìn)行連接使用工具:使用LINK.EXE連接器功能:對目標(biāo)文件進(jìn)行連接,從而得到一個(gè)可執(zhí)行文件.EXE。使用方法:在DOS下運(yùn)行LINK.EXE程序。1、C:\MASM\LINK.EXE2、輸入要進(jìn)行連接的目標(biāo)文件路徑及名稱。3、輸入進(jìn)行連接后產(chǎn)生的可執(zhí)行文件.Exe保存的路徑及名稱。4、輸入映像文件名:5、輸入庫文件名:連接的作用:當(dāng)源程序較大時(shí),編譯器會將源程序文件分成多個(gè)部分來編譯,每個(gè)源程序編譯成為目標(biāo)文件后,再用連接程序?qū)⑺鼈冞B接在一起,生成一個(gè)可執(zhí)行文件。程序中調(diào)用了某個(gè)庫文件中的內(nèi)容時(shí),需要將這個(gè)庫文件和該程序生成的目標(biāo)文件連接在一起。一個(gè)源程序編譯后,得到了存有機(jī)器碼的目標(biāo)文件,目標(biāo)文件中有的內(nèi)容不能直接生成可執(zhí)行文件,必須通過連接程序?qū)⑦@些內(nèi)容處理為最終可執(zhí)行的信息。六、以簡化的方式進(jìn)行編譯和連接忽略中間文件,將產(chǎn)生的目標(biāo)文件和可執(zhí)行文件保存在當(dāng)前路徑下。C:\MASM\MASMXXX;C:\MASM\LINKXXX;七、可執(zhí)行文件.exe的執(zhí)行八、可執(zhí)行文件中的程序裝入內(nèi)存并運(yùn)行的原理CPU內(nèi)存硬盤DATASEGMENTDATAENDSCODESEGMENTCODEENDScommand操作系統(tǒng)的外殼操作系統(tǒng)是由多個(gè)功能模塊組成的龐大、復(fù)雜的軟件系統(tǒng)。任何通用的操作系統(tǒng),都要提供一個(gè)稱為外殼(shell)的程序,用戶使用這個(gè)程序來操作計(jì)算機(jī)系統(tǒng)進(jìn)行工作。DOS中有一個(gè)程序,在DOS中稱為命令解釋器,也就是DOS系統(tǒng)的外殼。DOS啟動(dòng)時(shí),先完成其他重要的初始化工作,然后運(yùn)行command,command運(yùn)行后,在屏幕上顯示出“C:\”,然后等待用戶的輸入。如果用戶要執(zhí)行一個(gè)程序,則輸入該程序的可執(zhí)行文件的名稱,command首先根據(jù)文件名找到可執(zhí)行文件,然后將這個(gè)可執(zhí)行文件中的程序加載入內(nèi)存,設(shè)置CS:IP指向程序的入口。此后,command暫停運(yùn)行,由CPU運(yùn)行程序。程序運(yùn)行結(jié)束后,返回到command中。九、程序執(zhí)行過程的跟蹤使用工具:Debug使用方法:在DOS下運(yùn)行DEBUG.EXE程序。1、C:\DEBUGxxx.EXE在DOS中可執(zhí)行文件.EXE中程序加載的過程內(nèi)存xxxx:0000PSPxxxx+10h:0000程序1、找到一段起始地址為xxxx:0000的容量足夠的空閑內(nèi)存區(qū)。2、在這段內(nèi)存區(qū)的前256個(gè)字節(jié)中,創(chuàng)建一個(gè)稱為程序段前綴(PSP)的數(shù)據(jù)區(qū),DOS要利用PSP來和被加載的程序進(jìn)行通信;3、從xxxx+10H:0開始,將程序裝入,程序的地址被設(shè)為xxxx+10H:04、將該內(nèi)存區(qū)的段地址存入DS中,初始化其他相關(guān)寄存器后,設(shè)置CS:IP指向程序入口。注意:PSP區(qū)和程序區(qū)雖然物理地址連續(xù),但為更好的區(qū)分,DOS將它們劃分到不同的段中。程序加載后,ds=xxxx為程序加載的段地址。數(shù)據(jù)區(qū)堆棧區(qū)代碼區(qū)1、編程(保存在test.asm)assumecs:codedatasegmentdboffsetstartdataendscodesegmentstart:movax,data movds,ax movbx,[0] jmpbxcodeendsendstart示例一2、匯編Masmtest.asm——生成test.obj3、連接linktest——生成test.exe4、調(diào)試debugtest.exe——使用實(shí)驗(yàn)一命令將AL中的數(shù)據(jù)保存到內(nèi)存單元12345H中

assumecs:codecodesegmentstart:movax,1234h movds,ax movbx,5 moval,12 mov[bx],al;bx能否換成其它寄存器?codeendsendstartMasm匯編器中mov[5],al會出現(xiàn)錯(cuò)誤注意:Debug和masm有些不同,在Debug可用的,masm可能有錯(cuò)示例二1、安裝并運(yùn)行DOXBOX64位WIN7DEBUG解決方案2、把debug.exe放在d:/asm,在DOSBOX運(yùn)行窗口執(zhí)行:

mountcd:/asm

c:

debug(目錄d:/asm即為DOSBOX的C盤)3、在DOSBOX中使用MASM編譯源程序1把masm放在d:\asm下2、進(jìn)入C盤使用MASM如前面所講的方法對源程序進(jìn)行編譯調(diào)試幾個(gè)約定[BX]:指偏移地址為(BX)的內(nèi)存單元。例:MOVAX,[BX]MOVAL,[2000H]LOOP循環(huán)指令():指內(nèi)容。例:若AX=1234H則(AX)=1234H,(AL)=34H(20000H)用idata表示常量(立即數(shù))例:movax,[idata]movax,[0] movax,idatamovax,1234h

例:用()描述下列指令的功能MOVAX,[2](AX)=(DS:2)MOV[2],AX

(DS:2)=(AX)ADDAX,2

(AX)=(AX)+2ADDAX,BX

(AX)=(AX)+(BX)ADDAX,[2]

(AX)=(AX)+(DS:2)PUSHAX

(SP)=(SP)-2(SS:SP)=(AX)POPAX(AX)=(SS:SP)(SP)=(SP)+2一、[BX]EA:偏移地址;SA:段地址;PA:物理地址;例1:

MOVAX,[BX]EA=(BX)SA=(DS)PA=((DS):(BX))5.2

我們常用[BX]來提供內(nèi)存單元的偏移地址,通過修改BX的值,可由DS:[BX]來尋址不同地址的內(nèi)存單元。程序和內(nèi)存中的情況如下圖,寫出程序執(zhí)行后,21000H—21007H單元中的內(nèi)容。Mov ax,2000hMov ds,axMov bx,1000hMov ax,[bx]Inc bxInc bxMov [bx],axInc bxInc bxMov [bx],axInc bxMov [bx],alInc bxMov [bx],al內(nèi)存情況BE21000H0021001H21002H21003H21004H21005H21006H21007HAx=2000hDs=2000hBx=1000hAx=00BEHBX=1001HBX=1002H(21002H)=00BEHBE00BX=1003HBX=1004H(21004H)=00BEHBx=1005H(21005H)=BEHBE00BEBx=1006H(21006H)=BEHBE二、循環(huán)控制指令LOOP

用CX作計(jì)數(shù)器控制程序的循環(huán)。格式:LOOP標(biāo)號;CX≠0循環(huán)功能:當(dāng)CX≠0時(shí),(CX)=(CX)-1;轉(zhuǎn)移到標(biāo)號處循環(huán)執(zhí)行。

CX和LOOP指令配合實(shí)現(xiàn)循環(huán)功能的三個(gè)要點(diǎn):1、在CX中存放循環(huán)次數(shù)2、LOOP指令中的標(biāo)號所標(biāo)識地址要在前面3、要循環(huán)執(zhí)行的程序段寫在標(biāo)號和LOOP指令之間。利用LOOP指令編程計(jì)算212ASSUME CS:CODECODE SEGMENT MOVAX,2 MOVCX,11S: ADDAX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND例2:編程,用加法計(jì)算123×236,結(jié)果存在AX中。三、在DEBUG中跟蹤用LOOP指令實(shí)現(xiàn)的循環(huán)程序ASSUME CS:CODECODE SEGMENT MOVAX,0FFFFH MOVDS,AX MOVBX,6 MOVAL,[BX] MOVAH,0 MOVDX,0 MOVCX,3S: ADDDX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND在匯編源程序中,數(shù)據(jù)不能以字母開頭。ASSUME CS:CODECODE SEGMENT MOVAX,0FFFFH MOVDS,AX MOVBX,6 MOVAL,[BX] MOVAH,0 MOVDX,0

MOVCX,123S: ADDDX,AX LOOPS MOVAX,4C00H INT 21HCODE ENDSEND使用P命令可以將循環(huán)指令一次執(zhí)行結(jié)束。也可用“GXXXX”命令來執(zhí)行到循環(huán)結(jié)束。四、DEBUG和匯編編譯器MASM對指令的不同處理在DEBUG中我們可以使用下面指令來讀寫內(nèi)存:MOV AX,[0]MOV AL,[2]MOV BX,[1234H]但在匯編程序中只能使用[寄存器]來尋址內(nèi)存:例:MOV AX,[BX]在匯編編譯器處理中,MOVAX,[1234H]=MOV AX,1234H五、LOOP和[BX]的聯(lián)合使用 計(jì)算:FFFF:0—FFFF:B單元中的數(shù)據(jù)的和,結(jié)果保存在DX中XXFFFF0HXXFFFF1HXXFFFF2HXXFFFF3HXXFFFF4HXXFFFF5HXXFFFF6HXXFFFF7HXXFFFF8HXXFFFF9HXXFFFFAHXXFFFFBH運(yùn)算結(jié)果是否會超出DX能否將數(shù)據(jù)直接加到DX中能否將數(shù)據(jù)直接加到DL中辦法:將內(nèi)存單元中的8位數(shù)據(jù)賦到一個(gè)16位寄存器AX中,再將AX加到DX上。 movax,0ffffh movds,ax movdx,0

moval,ds:[0] movah,0 adddx,ax moval,ds:[1] movah,0 adddx,ax moval,ds:[2] movah,0 adddx,ax . . moval,ds:[0bh] movah,0 adddx,axAssumecs:codeCode segment movax,0ffffh movds,ax movdx,0六、段前綴

在訪問內(nèi)存單元的指令中,用于顯式地指明內(nèi)存單元的段地址的“段寄存器:”,在匯編語言中稱為段前綴。例:

MOV AX,DS:[BX]MOV AX,CS:[BX]MOV AX,ES:[BX]MOV AX,SS:[0]MOV AL,CS:[1234H]注意:當(dāng)指令中給出段前綴時(shí),該數(shù)據(jù)的段地址由指定的段寄存器提供。例:MOVAX,CS:[BX]PA=((CS):(BX))七、一段安全的空間 匯編語言程序直接面向機(jī)器,如果我們要向內(nèi)存空間寫入數(shù)據(jù)時(shí),要保證所寫入的內(nèi)存中沒有重要的數(shù)據(jù),否則會影響系統(tǒng)的正常運(yùn)行,在一般的PC機(jī)中都不使用0:200—0:300這段內(nèi)存空間,所以我們可以放心使用這段安全的空間。八、段前綴的使用 編程將內(nèi)存FFFF:0—FFFF:B單元中的數(shù)據(jù)拷貝到0:200—0:20B單元中。FFFF0HFFFF1HFFFF2HFFFF3HFFFF4HFFFF5HFFFF6HFFFF7HFFFF8HFFFF9HFFFFAHFFFFBH00200H00201H00202H00203H00204H00205H00206H00207H00208H00209H0020AH0020BH movbx,0 movcx,12S: movax,0ffffh movds,ax movdl,[bx]

movax,0020h mov ds,ax mov[bx],dl inc bx loops movax,4c00h int 21h movbx,0 movcx,12

movax,0ffffh movds,ax movax,0020h moves,axS: movdl,[bx] moves:[bx],dl inc bx loops movax,4c00h int 21h 題目:按下面的程序框架編程,使用循環(huán)語句計(jì)算1+2+3+…+100,并把結(jié)果保存在物理地址12345H指向的字存儲單元中。CODESSEGMENTASSUMECS:CODESSTART: ;此處輸入功能實(shí)現(xiàn)代碼MOVAH,4CHINT21HCODESENDSENDSTART匯編作業(yè)一補(bǔ)全下面程序?qū)?nèi)存0:300H—0:31FH處的數(shù)據(jù)復(fù)制到0:200H處。XX00300HXX00301HXX00302HXX00303HXX00304HXX00305HXX00306H.........XX0031EHXX0031FH00200H00201H00202H00203H00204H00205H00206H...0021EH0021FHAssume cs:codeCode segment movax,

movds,ax movax,0020h moves,ax movbx,0 movcx,

S: moval,[bx] moves:[bx],al incbx loops movax,4c00h int21hCode endsend0030h0020h補(bǔ)全下面程序?qū)ⅰ癿ovax,4c00h”之前的指令復(fù)制到內(nèi)存0:200H處。XXXXXXXXXXXXXX......XXXX00200H00201H00202H00203H00204H00205H00206H...0021EH0021FHAssume cs:codeCode segment movax,

movds,ax movax,0020h moves,ax movbx,0 movcx,

S: moval,[bx] moves:[bx],al incbx loops movax,4c00h int21hCode endsendCS23PSPCS:0DS:0DS:FF一、在代碼段中使用數(shù)據(jù)(將數(shù)據(jù)定義在代碼段中)例:計(jì)算以下8個(gè)數(shù)據(jù)的和,結(jié)果保存在AX中:0123H,0456H,0789H,0ABCH,0DEFH,0FEDH,0CBAH,0987H。思路1:MOVAX,0ADDAX,0123HADDAX,0456HADDAX,0789H . . .ADDAX,0CBAHADDAX,0987H思路2:

MOVAX,XXXXHMOVDS,AXMOVBX,0MOVCX,nMOVAX,0S:ADDAX,[BX]ADDBX,2LOOPS23XXXX0156048907..09將數(shù)據(jù)定義在代碼段中ASSUME CS:CODECODE SEGMENT DW 0123H,0456H,0789H,

0ABCH,0DEFH,

0FEDH,0CBAH,0987H MOV BX,0 MOV AX,0 MOV CX,8S: ADD AX,CS:[BX] ADD BX,2 LOOP S MOV AX,4C00H INT 21HCODE ENDSEND 定義數(shù)據(jù)偽指令:DW—字型數(shù)據(jù)DB—字節(jié)型數(shù)據(jù)DD—雙字?jǐn)?shù)據(jù)格式:DW(DB)數(shù)據(jù)1,數(shù)據(jù)2,數(shù)據(jù)3,……23015604..BA0C8709BB0000B80000..CS:0CS:0FASSUME CS:CODECODE SEGMENT DW0123H,0456H,0789H,0ABCH,

0DEFH,0FEDH,0CBAH,0987HSTART: MOV BX,0 MOV AX,0 MOV CX,8S: ADD AX,CS:[BX] ADD BX,2 LOOP S MOV AX,4C00H INT 21HCODE ENDSEND START

END 標(biāo)號標(biāo)號—為程序中第一條要執(zhí)行的指令的標(biāo)號。在編譯中向編譯器提供程序的入口地址和結(jié)束地址。二、在代碼段中使用棧利用堆棧,編程將程序中定義的數(shù)據(jù)逆序存放。Assume cs:codeCode segmentDw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hCode endsend23015604..數(shù)據(jù)BA0C8709..CS:0CS:0FDw 0,0,0,0,0,0,0,00000……0000CS:10CS:1F棧段Start: movax,cs movss,ax movsp,

movbx,0 movcx,8S: pushcs:[bx] addbx,2 loops movbx,0 movcx,8S0: popcs:[bx] addbx,2 loops0 movax,4c00h int21h Code endsEnd start20h檢測點(diǎn)6.1

補(bǔ)全程序,使下面程序?qū)崿F(xiàn)依次用內(nèi)存0:0—0:F單元中的內(nèi)容改寫程序中的數(shù)據(jù)。Assume cs:codeCode segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hStart: movax,0 movds,ax movbx,0 movcx,8S: movax,[bx]

addbx,2 loops mov ax,4c00h int 21hCode endsEnd startMovcs:[bx]

溫馨提示

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

評論

0/150

提交評論