單片機(jī)及工具微機(jī)接口匯編語言_第1頁
單片機(jī)及工具微機(jī)接口匯編語言_第2頁
單片機(jī)及工具微機(jī)接口匯編語言_第3頁
單片機(jī)及工具微機(jī)接口匯編語言_第4頁
單片機(jī)及工具微機(jī)接口匯編語言_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

匯編語言Ⅰ

匯編語言規(guī)范

匯編語言語句表達(dá)式

匯編語言數(shù)據(jù)32位可編程寄存器

匯編指令基本格式

匯編語言偽操作

匯編語言尋址方式授課約定R–通用寄存器,(R)–通用寄存器內(nèi)容SR–段寄存器,(SR)–段寄存器內(nèi)容BR–基址寄存器,IR–變址寄存器AC–累加器,(AC)–累加器內(nèi)容SRC–源操作數(shù),(SRC)–源操作數(shù)內(nèi)容DST–目的操作數(shù),(DST)–目的操作數(shù)內(nèi)容→信息傳送MEM–主存儲(chǔ)器,(MEM)–主存儲(chǔ)器內(nèi)容OPR–操作數(shù)D–立即數(shù)B/W/D–字節(jié)/字/雙字SA–段基址,EA–偏移地址,PA–物理地址匯編語言規(guī)范1.匯編語言定義匯編語言是一種用助記符代替指令的操作碼,用數(shù)字或符號(hào)代替指令中操作數(shù)或操作數(shù)存放位置的一種程序設(shè)計(jì)語言。例:MOVAL,10H將十六進(jìn)制數(shù)10H送入AL寄存器匯編語言不能為機(jī)器所識(shí)別,需先經(jīng)過編譯,將匯編語言文件轉(zhuǎn)換成目標(biāo)文件(后綴為“.OBJ”),再通過鏈接,將目標(biāo)文件轉(zhuǎn)換成可執(zhí)行文件(后綴為“.EXE”),才得以執(zhí)行。轉(zhuǎn)換中若源程序有誤,則編譯中會(huì)出現(xiàn)錯(cuò)誤提示,指出源程序錯(cuò)誤行數(shù)及錯(cuò)誤性質(zhì)。2.匯編程序運(yùn)行步驟⑴用編輯程序建立源文件(后綴為“.ASM)⑵用MASM程序?qū)SM文件轉(zhuǎn)換成OBJ文件⑶用LINK程序?qū)BJ文件轉(zhuǎn)換成EXE文件⑷用DOS命令鍵入文件名執(zhí)行程序匯編語言規(guī)范3.匯編語言源程序示例⑴程序的層次模塊結(jié)構(gòu)源程序堆棧段數(shù)據(jù)段代碼段DEBUG直接編程初始化輸入運(yùn)算處理轉(zhuǎn)換輸出返回

DOS數(shù)值運(yùn)算非數(shù)值運(yùn)算匯編語言規(guī)范⑵源程序的分段結(jié)構(gòu)及示例說明例:運(yùn)行程序,屏幕輸出顯示:“e!”

定義堆棧段指示段寄存器定義數(shù)據(jù)段初始化定義代碼段顯示輸出字符串運(yùn)行程序返回

DOS

源程序運(yùn)行結(jié)束匯編語言規(guī)范DATASEGMENT定義數(shù)據(jù)段及字節(jié)變量STRINGDB‘e!’DATAENDSCODESEGMENT定義代碼段ASSUMECS:CODE,DS:DATA指示段寄存器歸屬START:MOVAX,DATA程序段開始MOVDS,AX初始化數(shù)據(jù)段LEADX,STRING獲取串變量偏移地址MOVAH,09H顯示子字符串,字符串首址DS:DXINT21HMOVAX,4C00H自動(dòng)返回DOSINT21HCODEENDS代碼段結(jié)束ENDSTART程序段結(jié)束

設(shè)計(jì)、編寫源程序(數(shù)據(jù)結(jié)構(gòu)+算法+編碼)匯編語言源程序文件(*.ASM)目標(biāo)代碼程序文件(*.OBJ)可執(zhí)行程序文件(*.EXE)運(yùn)行正確?

調(diào)試運(yùn)行正確?結(jié)束否否否是是調(diào)試DEBUG編輯EDIT鏈接LINK執(zhí)行EXE匯編MASM匯編語言規(guī)范4.程序匯編連接與調(diào)試方法5.匯編示例匯編程序EXAMPLE.ASM、匯編軟件MASM.EXE、鏈接文件LINK.EXE均位于D盤子目錄MASM中。編譯:D:\MASM\masmexample.asm顯示如下:Assembling:example.asmexample.asm(12):errorA2006:undefinedsymbol:FIVE錯(cuò)誤提示,源程序第12行有錯(cuò),引用的符號(hào)FIVE未定義。改正錯(cuò)誤,重新編譯直到無錯(cuò)誤,生成example.obj。鏈接:D:\MASM\linkexample生成執(zhí)行文件example.exe。運(yùn)行:D:\MASM\example8匯編語言規(guī)范匯編語言數(shù)據(jù)1.數(shù)據(jù)表示⑴二進(jìn)制數(shù)二進(jìn)制數(shù)用帶后綴字母B表示,如10101100B⑵

十進(jìn)制數(shù)十進(jìn)制數(shù)可直接書寫或用帶后綴字母D表示,如123或456D。⑶

十六進(jìn)制數(shù)十六進(jìn)制數(shù)用帶后綴字母H表示。首位數(shù)字小于等于9時(shí)直接書寫數(shù)字0~9,后綴帶H,如80H。首位數(shù)字大于9時(shí)先寫0,再書寫字母A(10)~F(15),后綴帶H,如0A19CH。⑷

BCD數(shù)據(jù)BCD數(shù)據(jù)書寫時(shí)先直接書寫十進(jìn)制數(shù),帶后綴字母H。壓縮BCD碼用一個(gè)字節(jié)表示兩個(gè)數(shù)字,如00101000,書寫為28H。非壓縮BCD碼用一個(gè)字節(jié)表示一個(gè)數(shù)字,如00001000,書寫為8H。匯編語言數(shù)據(jù)⑸

非數(shù)值數(shù)據(jù)字符編碼:ASCII碼(美國(guó)標(biāo)準(zhǔn)信息交換碼),共128個(gè)字符。8位字節(jié)編碼和屬性各占據(jù)一個(gè)字節(jié)的低7位,兩個(gè)字節(jié)的最高位恒為0。漢字編碼:GB2312–80國(guó)標(biāo)編碼。16位字編碼。高位字節(jié)代表區(qū)號(hào),低位字節(jié)代表區(qū)內(nèi)位置號(hào),區(qū)號(hào)和區(qū)內(nèi)位置號(hào)各占據(jù)一個(gè)字節(jié)的低7位。兩個(gè)字節(jié)的最高位恒為1。2.數(shù)據(jù)類型字節(jié):8

位,可存放一個(gè)二進(jìn)制數(shù)、兩個(gè)壓縮

BCD

碼、一個(gè)非壓縮

BCD

碼或一個(gè)

ASCII

碼。字:16位,可劃分為高位字節(jié)和低位字節(jié)。雙字:32位,可劃分為高位字和低位字,低16位字還可以劃分為高位字節(jié)和低位字節(jié)。目前計(jì)算機(jī)根據(jù)需要,可進(jìn)行字節(jié)、字或雙字操作。指令基本格式1.指令基本格式大多數(shù)數(shù)據(jù)傳送類指令、算術(shù)運(yùn)算類指令、位操作類指令及串操作類指令,其指令有相同的語句格式和操作規(guī)定。指令一般由操作碼OP、尋址方式MOD和一個(gè)到多個(gè)操作數(shù)OD等字段組成。微機(jī)的多數(shù)指令有一個(gè)或兩個(gè)操作數(shù),也可以沒有操作數(shù),常見的表示形式如下:

單操作數(shù)指令:OP操作數(shù)雙操作數(shù)指令:OP目的操作數(shù)源操作數(shù)零操作數(shù)指令:OP操作碼OP尋址方式MOD操作數(shù)OD指令基本格式2.指令劃分⑴零操作數(shù)指令:可以無操作數(shù),也可以隱含操作數(shù)。隱含操作數(shù)是指在OD位置雖然未明確給出操作數(shù),但在指令OP中隱含有事先安排的操作數(shù)。隱含操作數(shù)可以是標(biāo)志寄存器中的某位或堆棧數(shù)據(jù)。例:CLC ;0→CF,將標(biāo)志寄存器進(jìn)位位CF清0ADD ;加法,無操作數(shù),數(shù)據(jù)來源于堆棧⑵單操作數(shù)指令:只需指定一個(gè)操作數(shù),也可默認(rèn)第二操作數(shù),未指定的操作數(shù)位于累加器中。例:INCAX ;(AX)+1→AXADDBX ;(AX)+(BX)→AX,AX為默認(rèn)操作數(shù)。⑶雙操作數(shù)指令:需要指定兩個(gè)操作數(shù),目的操作數(shù)和源操作數(shù)進(jìn)行運(yùn)算后,指令將結(jié)果回送目的操作數(shù)地址。例:SUBBX,CX ;(BX)–(CX)→BXANDAX,00FFH ;(AX)∧00FFH→AX地址相關(guān)信息1.存儲(chǔ)單元地址和內(nèi)容76543210FFFFFH00801H0010000121H字地址(00800H)=2198H1MB空間00800H1001100098H字節(jié)地址

(00800H)=98H

00001H高位字節(jié)00000H低位字節(jié)存儲(chǔ)器線性編址地址相關(guān)信息2.存儲(chǔ)器分段尋址分段尋址允許一個(gè)程序可以使用多個(gè)代碼段、數(shù)據(jù)段和堆棧段代碼段寄存器CS:存放正在執(zhí)行代碼的段基址數(shù)據(jù)段寄存器DS:存放正在執(zhí)行程序所用數(shù)據(jù)段的段基址堆棧段寄存器SS:存放正在執(zhí)行程序保留信息段的段基址附加段寄存器ES:存放程序的附加數(shù)據(jù)段的段基址,為程序設(shè)計(jì)使用多個(gè)數(shù)據(jù)段帶來方便存儲(chǔ)段內(nèi)每個(gè)單元的物理地址PA,可以用“段基址:段內(nèi)偏移地址”來表達(dá)。段地址:即SA×24,是相應(yīng)段的起始地址段內(nèi)偏移地址:即偏移地址或有效地址EA,是該單元的物理地址到段基址的相對(duì)距離,EA=PA–SA×24。地址相關(guān)信息3.物理地址的計(jì)算與形成設(shè)段基址=123AH,偏移量=341CH,則物理地址=段基址×24+偏移量=123AH×24+341CH

=123A0H+341CH=157BCH00000H123A0H16位段地址0000123A0H段地址+16位偏移量+

341CH偏移量341CH20位物理地址157BCH物理地址157BCH段基址=123AH,段地址=123AH×24=123A0HFFFFFH地址相關(guān)信息4.段的分配方式段寄存器CS0150H01500H64KB代碼DS4200H42000H64KB數(shù)據(jù)ES8C50H8C500H64KB附加數(shù)據(jù)SSC000HC0000H64KB堆棧存儲(chǔ)器每個(gè)段占用64KB的標(biāo)準(zhǔn)分配方式地址相關(guān)信息4.段的分配方式段寄存器CS0150H01500H16KB代碼DS4200H42000H4KB數(shù)據(jù)ES8C50H8C500H2KB附加數(shù)據(jù)SSC000HC0000H256B堆棧存儲(chǔ)器按實(shí)際需求的非標(biāo)準(zhǔn)分配方式地址相關(guān)信息5.堆棧存儲(chǔ)技術(shù)⑴堆棧概念由程序在RAM中開辟的一片存儲(chǔ)區(qū)域,用于存放臨時(shí)數(shù)據(jù)。設(shè)置堆棧段寄存器SS,用來指示堆棧起始位置。設(shè)置棧頂指針,用棧頂指針寄存器SP指示堆棧頂部到堆棧起始位置的距離。⑵堆棧分類堆棧分為向上生長(zhǎng)(先低后高)的堆棧和向下生長(zhǎng)(先高后低)的堆棧,目前多采用向上生長(zhǎng)的堆棧,存儲(chǔ)信息時(shí)先低地址后高地址。SP指向?qū)嵉亩褩卧?,即SP所指向單元已保存信息。入棧:(SP)+2→SP,(R)→(SP) 出棧:((SP))→R,(SP)-2→SP公式中+2、-2表示堆棧保存數(shù)據(jù)為16位,占據(jù)2個(gè)字節(jié)。地址相關(guān)信息⑶堆棧操作原則遵循“后進(jìn)先出”原則,后進(jìn)入堆棧的數(shù)據(jù)應(yīng)先彈出堆棧。例:PUSHAX ;先進(jìn)

PUSHBX ;后進(jìn)

:POPBX ;先出

POPAX ;后出在調(diào)用子程序之前,通常應(yīng)將CS、IP、EFLAGS寄存器壓入堆棧保存,返回時(shí)再依次彈出EFLAGS、IP和CS。另外,在子程序中使用的寄存器都應(yīng)該在進(jìn)入子程序之前保存,否則返回主程序后無法正常運(yùn)行程序。1.數(shù)據(jù)相關(guān)尋址⑴立即尋址匯編格式:n。n為立即操作數(shù)。操作數(shù)存放在存儲(chǔ)器中指令的下一單元中。例:MOVAX,10立即數(shù)為10,存放在指令的下一單元。執(zhí)行:10→AX,執(zhí)行后

(AX)=000AH⑵寄存器尋址匯編格式:R。R為寄存器。操作數(shù)存放在寄存器中。例:MOVAX,1234H ;傳送,直接數(shù)1234H→AXADDAX,100H ;加,目的操作數(shù)地址為寄存器,源操作數(shù)為直接數(shù)。(AX)+100H→AXSUBAX,BX ;(AX)–(BX)→AX指令n匯編語言尋址方式寄存器→操作數(shù)⑶直接尋址匯編格式:[A]。A位于指令操作碼之后,操作數(shù)在存儲(chǔ)器中。EA=A,PA=(DS)×24+A。例1:MOVAX,[2000H]設(shè):(DS)=3000H,EA=2000H,內(nèi)存單元(32000H)=5000H。PA=(DS)×24+A=3000H×24+2000=32000H指令執(zhí)行后AX=(32000H)=5000H。DS寄存器OP3000H20005000匯編語言尋址方式⊕×242000H32000H代碼段數(shù)據(jù)段匯編語言尋址方式⑷寄存器間接尋址匯編格式:[R]。寄存器R的內(nèi)容為操作數(shù)的偏移地址EA,寄存器通常為間址寄存器BX、BP、SI、DI。即EA=[BX]、[BP]、[DI]、[SI],操作數(shù)在存儲(chǔ)器中。通常BX、SI、DI作為數(shù)據(jù)段DS間址寄存器,物理地址為DS:BX、SI、DI。BP作為堆棧段SS間址寄存器,物理地址為SS:BP。例:寄存器和存儲(chǔ)器內(nèi)容分別為(BP)=3000H,(SS)=2000H,(23000H)=1234H執(zhí)行指令:MOVAX,[BP],PA=(SS)×24+(BP)=2000H×24+3000H=23000H,執(zhí)行后AX=(23000H)=1234H指令中也可指定段跨越前綴取得其他段中的數(shù)據(jù)。例:寄存器和存儲(chǔ)器內(nèi)容分別為:(BX)=1000H,(ES)=3000H,(31000H)=4567H。執(zhí)行指令MOVAX,ES:[BX]后AX=4567H。匯編語言尋址方式⑸寄存器相對(duì)尋址匯編格式:n[R]或X[R]。n為數(shù)字,X為變量。n和X表示偏移量。R表示間址寄存器BX、SI、DI或BP,操作數(shù)在存儲(chǔ)器中。操作數(shù)偏移地址EA=n+(R)或EA=(X)+(R)。例1:(DS)=2000H,(SI)=1000H,(21100H)=1357H執(zhí)行指令MOVAX,100(SI)后,PA=(DS)×24+(DI)+100H=2000H×24+1000H+100H=21100H,AX=(21100H)=1357H。

EA例2:(DS)=3000H,(DI)=2000H,(X)=100H,(32100H)=5000H,(AX)=500H執(zhí)行指令A(yù)DDX(DI),AX后,PA=(DS)×24+(DI)+(X)=3000H×24+2000H+100H=32100H(32100H)+(AX)=5000H+500H=5500H,(32100H)=5500H匯編語言尋址方式⑹基址變址尋址匯編格式:[BR][IR]或[BR+IR],BR–基址寄存器,IR–變址寄存器。操作數(shù)的偏移地址EA是指令中基址寄存器內(nèi)容加上變址寄存器內(nèi)容之和,操作數(shù)在存儲(chǔ)器中。BX、BP為基址寄存器BR,SI、DI為變址寄存器IR。EA=[BX]+[SI]或[BX]+[DI],或者EA=[BP]+[SI]或[BP]+[DI]。例:(DS)=1000H,(BX)=2000H,(DI)=3000H,(15000H)=0A1C2H則指令MOVAX,[BX][DI]或?qū)憺镸OVAX,[BX+DI]執(zhí)行時(shí),PA=(DS)×24+(BX)+(DI)=1000H×24+2000H+3000H=15000H。AX=(15000H)=0A1C2H該尋址方式適用于數(shù)組或表格處理。數(shù)組或表格首地址存放在基址寄存器中,更改變址寄存器的值用于訪問數(shù)組或表格中各個(gè)元素。匯編語言尋址方式⑺相對(duì)基址變址尋址匯編格式:X[BR]+[IR]或X[BR+IR]或[X+BR+IR]相對(duì)基址變址尋址方式中,操作數(shù)的偏移地址EA是指令中基址寄存器內(nèi)容、變址寄存器內(nèi)容、位移量X三項(xiàng)之和。例:設(shè)[DS]=3000H,[BX]=2000H,[SI]=1000H,[M]=100H,(33100H)=5000H。MOVAX,M[BX][SI]PA=(DS)×24+(BX)+(SI)+M=30000H+2000H+1000H+100H=33100H,AX=(33100H)=5000H匯編語言尋址方式2.轉(zhuǎn)移相關(guān)尋址轉(zhuǎn)移相關(guān)尋址方式用于確定轉(zhuǎn)移指令及CALL指令的轉(zhuǎn)移地址。⑴段內(nèi)直接尋址轉(zhuǎn)向的有效地址為當(dāng)前程序指針I(yè)P值和8位或16位偏移量之和。程序正常順序執(zhí)行時(shí),每取出一條指令執(zhí)行(IP)+n→IP,形成下一條指令地址。n為當(dāng)前取出指令的字節(jié)數(shù),PA=(CS)×24+(IP)。程序發(fā)生轉(zhuǎn)移時(shí),計(jì)算偏移地址EA并修改IP,操作對(duì)象是地址,稱之為程序轉(zhuǎn)移尋址,這種尋址方式適用于條件轉(zhuǎn)移和無條件轉(zhuǎn)移。條件轉(zhuǎn)移偏移量為8位,屬于短跳轉(zhuǎn),標(biāo)記為:JMPSHORTNEXT。無條件轉(zhuǎn)移指令偏移量為8位或16位,偏移量8位屬于短跳轉(zhuǎn),偏移量16位為近跳轉(zhuǎn),標(biāo)記為:JMPNEARPTRNEXT,NEXT為轉(zhuǎn)向的符號(hào)地址。指令編制中SHORT和NEARPTR可省略。例:JMPCONT,轉(zhuǎn)移至標(biāo)號(hào)為CONT的指令。,匯編語言尋址方式⑵段內(nèi)間接尋址轉(zhuǎn)向的有效地址是一個(gè)寄存器或內(nèi)存單元的內(nèi)容。這個(gè)寄存器或內(nèi)存單元的內(nèi)容可以用除了立即數(shù)方式之外的任何一種尋址方式獲得。用得到的轉(zhuǎn)向有效地址取代IP內(nèi)容,即EA→IP。例1:設(shè)(100H)=200H,執(zhí)行指令JMP[100H]后(IP)=200H例2:設(shè)(AX)=1000H,執(zhí)行指令JMPAX后(IP)=1000H⑶段間直接尋址用指令中直接提供的轉(zhuǎn)移偏移地址EA→IP,用指令同時(shí)直接提供的轉(zhuǎn)移段地址→CS,實(shí)現(xiàn)從一個(gè)代碼段轉(zhuǎn)移到另一個(gè)代碼段。指令格式為:JMPDWORDPTROPR。⑷段間間接尋址根據(jù)存儲(chǔ)器數(shù)據(jù)尋址方式獲得EA,將EA雙字單元第一個(gè)字的內(nèi)容作為轉(zhuǎn)移偏移地址→

IP,第二個(gè)字的內(nèi)容作為轉(zhuǎn)移段地址→

CS。指令格式為:JMPFARPTROPR,表明尋址2個(gè)字單元。數(shù)據(jù)尋址與數(shù)據(jù)結(jié)構(gòu)的關(guān)系1.簡(jiǎn)單變量尋址通常在數(shù)據(jù)段中定義變量,存取簡(jiǎn)單變量通常使用直接尋址方式。例:DATASEGMENTXDB?YDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMOVX,-3 ;X=-3MOVY,X*X ;Y=(-3)×(-3)=9MOVAX,Y ;AX=9CODEENDS ;代碼段結(jié)束數(shù)據(jù)尋址與數(shù)據(jù)結(jié)構(gòu)的關(guān)系2.數(shù)組或表格數(shù)據(jù)的尋址表格數(shù)據(jù)存取與數(shù)組數(shù)據(jù)存取相似,均可用寄存器、寄存器相對(duì)、基址變址和相對(duì)基址變址等尋址方式。⑴存取基本數(shù)組數(shù)組的基本地址→BX,某個(gè)元素到數(shù)組基本地址的距離→SI\/DI,則:EA=(BX)+(SI\/DI)或者位移量DISP=數(shù)組開始地址,(BX\/SI\/DI)=數(shù)組元素到數(shù)組開始地址的距離,則:EA=(BX\/SI\/DI)+DISP⑵應(yīng)用賦值語句A(i)=B(j)采用兩個(gè)變址寄存器。對(duì)應(yīng)元素A(i)使用DI;對(duì)應(yīng)元素B(j)使用SI,則兩組元素的地址分別為:EA1=SI+DISP1 ;DISP1=A數(shù)組開始地址EA2=DI+DISP2 ;DISP2=B數(shù)組開始地址數(shù)據(jù)尋址與數(shù)據(jù)結(jié)構(gòu)的關(guān)系⑶存取二維數(shù)組A(i,j)

數(shù)組起始地址→BX,BX兼行元素相對(duì)數(shù)組起始地址變址,而列元素相對(duì)行元素的變址量→SI\/DI,則存取某個(gè)元素應(yīng)有:

EA=(BX+SI)\/(BX+DI)

若DISP=數(shù)組元素的起始地址,BX=行元素變址量,SI或DI=列元素相對(duì)行元素的變址,則存取某個(gè)元素應(yīng)有:

EA=(BX)+(SI\/DI)+DISP

例:求二維數(shù)組ARRAY所有元素之和并顯示

DATASEGMENT ;定義數(shù)據(jù)段

ARRAYDB2DUP(1,2,3) ;定義二維數(shù)組

DATAENDS ;數(shù)據(jù)段結(jié)束

CODESEGMENT ;定義代碼段

ASSUMECS:CODE,DS:DATA ;定義段關(guān)系數(shù)據(jù)尋址與數(shù)據(jù)結(jié)構(gòu)的關(guān)系START:LEABX,ARRAY ;二維數(shù)組起始地址→BX MOVDX,0 ;用DX存放所有元素之和

MOVCX,2

;循環(huán)2次CONT:MOVSI,0 ;列起始地址0→SIL:MOVAX,BX+SI ;獲取二維數(shù)組某個(gè)元素

ADDDX,AX ;求二維數(shù)組所有元素之和

INCSI ;變換為下一列

CMPSI,3 ;判斷列是否超出

JNZL ;列值<3循環(huán)

ADDBX,3 ;列值>3變換行值

LOOPCONT ;循環(huán)2次數(shù)據(jù)尋址與數(shù)據(jù)結(jié)構(gòu)的關(guān)系 ANDDX,00FFH ;保留DL數(shù)值

MOVAH,02H INT21H ;在屏幕上顯示DL中數(shù)值

CODEENDS ;代碼段結(jié)束

ENDSTART ;程序結(jié)束數(shù)據(jù)尋址與數(shù)據(jù)結(jié)構(gòu)的關(guān)系3.記錄型數(shù)組的尋址數(shù)組和記錄結(jié)合使用。設(shè)雇員的記錄有三個(gè)數(shù)據(jù)項(xiàng)(雇員姓名、工齡和工資),由多個(gè)雇員的記錄組成一個(gè)數(shù)組,則任一雇員記錄項(xiàng)地址的形式描述為:F=f(M,I,J)其中,F(xiàn)為數(shù)組記錄項(xiàng)的地址,M為數(shù)組的基本地址,,I為數(shù)組的記錄項(xiàng),J為記錄的數(shù)據(jù)項(xiàng),f則表示記錄型數(shù)組。對(duì)此,存取任一記錄中的數(shù)據(jù)項(xiàng)(如工資項(xiàng))的操作數(shù)尋址對(duì)應(yīng)描述為:偏移地址=f(基址,變址,位移)實(shí)際上記錄型數(shù)組是一個(gè)二維數(shù)組,其中第一維表示記錄號(hào),即第幾個(gè)記錄。第二唯表示數(shù)據(jù)項(xiàng),即記錄中第幾項(xiàng)。假定用BX存放雇員記錄數(shù)組基址指針,用SI存放記錄號(hào)的變址值,記錄中項(xiàng)的位置用DISP記錄,則EA=(BX)+(SI)+DISP。匯編語言語句表達(dá)式1.語句格式指令語句的一般格式如下:[標(biāo)號(hào):]指令助記符[操作數(shù)][;注釋]標(biāo)號(hào):標(biāo)號(hào)是機(jī)器指令語句存放地址的符號(hào)表示,代表該指令目標(biāo)代碼的第一個(gè)字節(jié)地址,后面必須緊跟冒號(hào)“:”,如CONT:。指令助記符:指令助記符為語句的核心成分,表示了該語句的操作類型或性質(zhì)。操作數(shù):操作數(shù)表示指令助記符的操作對(duì)象。注釋:注釋均以分號(hào)開始,它可占一行或多行,一般放在一條語句的后面,既對(duì)指令功能做出注釋。2.數(shù)值表達(dá)式⑴常量①整數(shù)常量常量形式格式取值常例說明二進(jìn)制常量XX…XB0、101001011數(shù)據(jù)類型后綴為B八進(jìn)制常量XX…XO0~71357O數(shù)據(jù)類型后綴為O十進(jìn)制常量XX…X或XX…XD0~9135或246D數(shù)據(jù)類型后綴為D也可省略后綴十六進(jìn)制常量XX…XH0~9A~F3AC7H0A7CDH當(dāng)?shù)谝晃粩?shù)字為A~F時(shí),在數(shù)字前加0匯編語言語句表達(dá)式匯編語言語句表達(dá)式②字符串常量字符串常量是用單引號(hào)或雙引號(hào)引起來的一個(gè)或多個(gè)字符,如‘A’、‘Hello’。字符串常量以各字符的ASCⅡ碼表示。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。例:A$=‘A’,則A$中存放41H。

B$=‘A1B2’,則B$中存放41H,31H,42H,32H。③符號(hào)常量用等價(jià)語句EQU或者“=”語句定義的名字來表示常量,可以直接寫在匯編語句中以提高程序的可讀性,使用修改也很方便。ABCEQU60*60 ;ABC=3600CONT=1000 ;CONT=1000MOVECX,ABC ;ECX中存放3600匯編語言語句表達(dá)式⑵算術(shù)運(yùn)算符算術(shù)運(yùn)算符包括:+(加)、-(減)、*(乘)、/(除)、MOD(求模)、SHL(左移)、SHR(右移)幾種,它既可以用于數(shù)值表達(dá)式又可用于地址表達(dá)式。例:用算術(shù)運(yùn)算符進(jìn)行數(shù)值表達(dá)式運(yùn)算。NUM1EQU25*4–50 ;NUM1=50NUM2EQUNUM1/7 ;NUM2=7NUM3DB NUM1MOD7 ;NUM3=1NUM4EQU 0FH ;NUM4=00001111MOVAL,NUM4SHL4 ;(AL)=11110000BMOVBL,NUM4SHR4 ;(BL)=00000000B匯編語言語句表達(dá)式⑶邏輯運(yùn)算符邏輯運(yùn)算包括四種運(yùn)算:邏輯乘(與,AND),口訣:見0為0。邏輯加(或,OR),口訣:見1為1。按位加(異或,XOR),口訣:相同為0,相異為1。邏輯非(取反,NOT),口訣:“0”、“1”互換。由于邏輯運(yùn)算按位操作,且在匯編過程中完成,因而運(yùn)算的結(jié)果仍為整數(shù)常量。例:用邏輯運(yùn)算符進(jìn)行運(yùn)算。MOVAL,44HAND0FH ;04H→ALMOVBL,05HOR40H ;45H→BLMOVCX,NOT00FFH ;0FF00H→CXMOVDX,789AHXOR000FH ;7895H→DX。匯編語言語句表達(dá)式⑷關(guān)系運(yùn)算符關(guān)系運(yùn)算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)運(yùn)算結(jié)果為真時(shí)數(shù)值為“0FFFFH”,為假時(shí)數(shù)值為“0”。例:用關(guān)系運(yùn)算符進(jìn)行數(shù)值表達(dá)式運(yùn)算。NUM1 DB10LT5 ;NUM1=0NUM2 DB0AAAAHGT7FFFH ;NUM2=0FFFFHMOV AX,‘A’EQ41H ;0FFFFH→AXMOV BX,NUM2LTNUM1 ;0→BX匯編語言語句表達(dá)式3.標(biāo)號(hào)與地址表達(dá)式⑴標(biāo)號(hào)標(biāo)號(hào)是指令語句的符號(hào)地址。在匯編源程序中,需要轉(zhuǎn)向一條指令時(shí),為該指令設(shè)置標(biāo)號(hào),以便在轉(zhuǎn)移類指令中直接引用這個(gè)標(biāo)號(hào)。NEAR(近程)類型標(biāo)號(hào)表示段內(nèi)標(biāo)號(hào)。需要用2字節(jié)(16位方式)給出標(biāo)號(hào)所在的段內(nèi)EA。FAR(遠(yuǎn)程)類型標(biāo)號(hào)表示段間標(biāo)號(hào)。需要用2字節(jié)(16位方式)或者4字節(jié)(32位方式)給出標(biāo)號(hào)所在的段地址以及EA。⑵變量變量是內(nèi)存數(shù)據(jù)區(qū)的名字,作為指令的存儲(chǔ)器操作數(shù)來使用。變量的類型用DB(字節(jié)),DW(字),DD(雙字),和DQ(四字)定義。例:OKDB5 :定義變量OK,類型為字節(jié),數(shù)值5VAR

DD123

:定義變量VAR類型為雙字,數(shù)值123匯編語言語句表達(dá)式⑶地址表達(dá)式匯編語句的地址表達(dá)式形成的結(jié)果是存儲(chǔ)器地址,用來表示指令中的標(biāo)號(hào)或者變量操作數(shù),有三個(gè)屬性:段地址,EA和類型。變量?jī)H對(duì)應(yīng)于數(shù)據(jù)區(qū)的第一個(gè)數(shù)據(jù)項(xiàng),如果對(duì)其他數(shù)據(jù)項(xiàng)操作,必須要用地址表達(dá)式指出那一個(gè)數(shù)據(jù)項(xiàng)是指令的操作數(shù)。例:ARRAYDD2,0,0,2,6,1,8,9,40,4 ;定義10個(gè)雙字類型的數(shù)據(jù)

MOVEAX,ARRAY+36 ;取第10個(gè)元素,EAX=4MOVESI,36 ;第10個(gè)元素的地址偏移量送ESISUBESI,4 ;ESI–4=36–4=32→ESIADDEAX,ARRAY[ESI] ;EA=ARRAY+32,EAX內(nèi)容與第9個(gè)元素值相加,相加結(jié)果EAX=4+40=44。匯編語言語句表達(dá)式4.屬性替換運(yùn)算符⑴段地址取代運(yùn)算符“:”又稱為段地址運(yùn)算或者跨段前綴。用于臨時(shí)給定變量,標(biāo)號(hào)或者地址表達(dá)式指定一個(gè)段屬性,地址表達(dá)式EA和類型保持不變。在指令中替代默認(rèn)的段以形成新的物理地址。例:MOVDX,ES:[BX+DI] ;EA=(BX+DI),PA=(ES)×24+EA,用擴(kuò)展段ES臨時(shí)替換默認(rèn)的數(shù)據(jù)段DS。⑵短取代運(yùn)算符SHORT告訴匯編程序,目標(biāo)標(biāo)號(hào)在本條指令的-128~+127個(gè)字節(jié)范圍內(nèi),可生成節(jié)省一個(gè)字節(jié)的機(jī)器指令,若省略則無法節(jié)省。例:JMPSHORTNEXT(也可用JMPNEXT)…NEXT:MOVEAX,ECX匯編語言語句表達(dá)式⑶強(qiáng)制類型轉(zhuǎn)換PTR運(yùn)算符格式:類型PTR地址表達(dá)式PTR可定義與PTR右邊地址表達(dá)式類型不同的新變量名或新標(biāo)號(hào),但不另分配存儲(chǔ)單元。例:BYTEDB0,2,4,6,8 :定義BYTE為字節(jié)型變量MOVAX,WORDPTRBYTE :將字節(jié)變量臨時(shí)作為字變量使用MOV[BX],5,該指令試圖將立即數(shù)5送至BX寄存器內(nèi)容指定的存儲(chǔ)單元,但指令運(yùn)行時(shí)匯編程序無法判定是存入字節(jié)單元還是字單元。為說明屬性,應(yīng)該改為:MOVBYTEPTR[BX],5存入字節(jié)單元MOVWORDPTR[BX],5存入字單元匯編語言語句表達(dá)式⑷定義類型運(yùn)算符THIS與PTR類似,用于建立一個(gè)指定類型(BYTE、WORD或DWORD)或指定距離(NEAR或FAR)的地址操作數(shù)。該操作數(shù)的段地址和偏移量與下一個(gè)存儲(chǔ)單元地址相同。例1:BVAREQUTHISBYTE;定義BVAR為字節(jié)

WVARDW8800H ;定義WVAR為字

MOVAL,B_VAR ;BVAR與WVAR地址相同

MOVAX,W_VAR ;AL=00H,AX=8800H例2:STARTEQUTHISFARMOVCX,100MOV指令有一個(gè)FAR屬性的地址START,這樣就允許其他段的JMP指令可以直接跳轉(zhuǎn)到START來。匯編語言語句表達(dá)式5.屬性分離運(yùn)算符⑴SEG格式:SEG變量或標(biāo)號(hào),分離其后變量或標(biāo)號(hào)段地址。⑵OFFSET格式:OFFSET變量或標(biāo)號(hào),分離其后變量或標(biāo)號(hào)偏移地址。例:ARRAYDW20DUP(0)….START:MOVAX,SEGARRAY ;ARRAY段地址→AXMOVDS,AX MOVBX,OFFSETARRAY;ARRAY的EA→BX⑶TYPE格式:TYPE變量或標(biāo)號(hào),分離其后變量或標(biāo)號(hào)的類型。變量將回送變量類型值,DB為1,DW為2,DD為4,DQ為8,DT為10。標(biāo)號(hào)將回送標(biāo)號(hào)類型值,NEAR為-1,F(xiàn)AR為-2。匯編語言語句表達(dá)式例:ARRAYDW1,2,3ADDAX,TYPEARRAY ;TYPEARRAY=2匯編程序匯編時(shí)將形成:ADDAX,26.返回值運(yùn)算⑴LENGTH運(yùn)算符格式:LENGTH變量,功能:對(duì)于變量中使用DUP的情況,將會(huì)回送分配給該變量的單元數(shù),其他情況則回送1。例:DATA SEGMENTADB ‘ABCDEF’BDW10DUP(0)CDB 1,2,3DATA ENDS匯編語言語句表達(dá)式MOVAX,LENGTHA ;1→AXMOVBX,LENGTHB ;10→BXMOVCX,LENGTHC ;1→CX⑵SIZE運(yùn)算符格式:SIZE變量,功能:取出變量所含的數(shù)據(jù)存儲(chǔ)區(qū)大小。其返回值為:SIZE變量=LENGTH變量×TYPE變量例:對(duì)上例中A、B、C三變量SIZEA=LENGTHA×TYPEA=1×1=1SIZEB=LENGTHB×TYPEB=10×2=20SIZEC=LENGTHC×TYPEC=1×1=1匯編語言語句表達(dá)式⑶字節(jié)分離運(yùn)算符字節(jié)分離運(yùn)算符包括:HIGH和LOW。格式:HIGH常量或地址表達(dá)式

LOW常量或地址表達(dá)式功能:HIGH用來分離出16位常量或地址表達(dá)式偏移量的高字節(jié),LOW用來分離出16位常量或地址表達(dá)式偏移量的低字節(jié)。例:KKEQU3A19HMOV

AH,HIGHWVAL;取KK高位字節(jié)3AH→AHMOV

AL,LOWWVAL;取KK低位字節(jié)19H→AL上兩個(gè)語句在匯編時(shí),將轉(zhuǎn)換成:

MOVAH,3AHMOVAL,19H49匯編語言語句表達(dá)式7.運(yùn)算符優(yōu)先級(jí)別優(yōu)先級(jí)運(yùn)算符1LENGTH、SIZE、()、<>、[]2跨段前綴算符(:)3PTR、OFFSET、SEG、TYPE、THIS4HIGH、LOW5*、/、MOD、SHL、SHR6+、-7EQ、NE、LT、LE、GT、GE8NOT9AND10OR、XOR32位可編程寄存器1.通用寄存器AX–累加器,可作為默認(rèn)寄存器,存放中間運(yùn)行結(jié)果。I/O端口字操作時(shí),用AX存放傳輸數(shù)據(jù),字節(jié)操作時(shí),用AL存放傳輸數(shù)據(jù)。BX–基址器,地址計(jì)算時(shí),用作存放基地址的寄存器CX–計(jì)數(shù)器,某些指令隱含作為計(jì)數(shù)器DX–數(shù)據(jù)寄存器,端口地址寄存器,某些輸入輸出指令用來存放外部設(shè)備的I/O地址,實(shí)現(xiàn)間接尋址。SI–源變址寄存器,通常用于源變址尋址。DI–目的變址寄存器,通常用于目的變址尋址。BP–基址指針:作為堆棧數(shù)據(jù)存取操作的基本地址指針寄存器。SP–棧指針:堆棧棧頂指針寄存器,指示堆棧的當(dāng)前偏移地址,即指示棧頂。2.標(biāo)志寄存器EFLAGS⑴控制標(biāo)志方向標(biāo)志DF:DF=0,處理從低位地址開始,DF=1,處理從高位地址開始中斷允許標(biāo)志IF:IF=1,CPU允許中斷,否則關(guān)閉中斷跟蹤標(biāo)志TF:TF=1,機(jī)器進(jìn)入單步工作方式,TF=0,機(jī)器處于連續(xù)工作方式32位可編程寄存器……IDVIPVIFACVMRFNTIOPLOFDFIFTFSFZFAFPFCFID標(biāo)識(shí)虛擬中斷掛起虛擬中斷允許對(duì)齊虛擬8086標(biāo)志恢復(fù)任務(wù)嵌入I/O特權(quán)級(jí)溢出方向中斷允許自陷符號(hào)零輔助進(jìn)位奇偶進(jìn)位312221201918161513121110987642032位可編程寄存器⑵條件標(biāo)志:反映包含在ALU中算術(shù)邏輯運(yùn)算后的結(jié)果特征SF–符號(hào)標(biāo)志,運(yùn)算結(jié)果為負(fù)時(shí)SF=1,否則SF=0ZF–零標(biāo)志,運(yùn)算結(jié)果為0時(shí)ZF=1,否則ZF=0AF–輔助進(jìn)位,BCD運(yùn)算D3

位有進(jìn)位時(shí)AF=1,否則AF=0PF–齊偶標(biāo)志,運(yùn)算結(jié)果操作數(shù)中有偶數(shù)個(gè)“1”時(shí),PF=1,否則PF=0CF–進(jìn)位標(biāo)志,記錄運(yùn)算操作時(shí)最高有效位D7產(chǎn)生的進(jìn)位值,有進(jìn)位時(shí)CF=1,否則CF=0OF–溢出標(biāo)志,運(yùn)算結(jié)果超出表示范圍時(shí)OF=1,否則OF=03.指令指針I(yè)P/EIPIP/EIP指出程序執(zhí)行過程中要取出的下條指令的地址。當(dāng)取出一條指令后,IP/EIP自動(dòng)加上當(dāng)前指令長(zhǎng)度或者強(qiáng)制形成轉(zhuǎn)移地址,指向下一條指令的地址,控制指令的執(zhí)行順序。32位可編程寄存器4.段寄存器CS–代碼段寄存器:存放當(dāng)前正在執(zhí)行代碼的段起始地址DS–數(shù)據(jù)段寄存器:存放當(dāng)前正在執(zhí)行程序所用數(shù)據(jù)的段起始地址。SS–堆棧段寄存器:存放當(dāng)前正在執(zhí)行程序暫時(shí)保留信息的堆棧段起始地址。ES–附加段寄存器:存放程序的附加數(shù)據(jù)段起始地址,為程序設(shè)計(jì)使用多個(gè)數(shù)據(jù)段帶來方便。FS和GS–擴(kuò)展附加段寄存器,用途同ES寄存器。程序執(zhí)行時(shí)由段寄存器值與偏移量確定尋址地址。代碼段尋址–CS:IP,數(shù)據(jù)段尋址–DS:SI(DI),堆棧段尋址SS:BP,附加段尋址ES(FS、GS):SI(DI)。匯編語言偽操作偽操作又稱偽指令,與機(jī)器指令不同,它不在程序運(yùn)行期間由計(jì)算機(jī)來執(zhí)行,而是在匯編程序?qū)υ闯绦騾R編編譯期間由匯編程序處理。它完成數(shù)據(jù)定義、存儲(chǔ)區(qū)分配、指示程序結(jié)束等功能。偽指令語句格式:[變量]助記符[參數(shù),…參數(shù)][;注釋]變量:符號(hào)名是偽指令語句的一個(gè)可選項(xiàng)。助記符:偽指令符指定匯編程序要完成的偽操作。參數(shù)表:偽指令后面的操作數(shù)可以是常數(shù)、字符串、變量、表達(dá)式等,其個(gè)數(shù)由具體的偽指令決定,各個(gè)操作數(shù)之間以“,”分隔。注釋:偽指令的注釋必須以“;”開始,說明偽操作功能。為了告訴匯編程序怎樣進(jìn)行匯編,識(shí)別哪種類型的CPU指令系統(tǒng),以保證擴(kuò)充功能的指令能夠正確匯編,采用方式偽指令來制定具體的指令系統(tǒng)。匯編語言偽操作1.數(shù)據(jù)定義及存儲(chǔ)分配偽操作DB:字節(jié)定義,每個(gè)操作數(shù)占用一個(gè)字節(jié)(8位)DW:字定義,每個(gè)操作數(shù)占用一個(gè)字(16位),低位字節(jié)在第一個(gè)字節(jié)地址中,高位字節(jié)在第二個(gè)字節(jié)地址中。DD:雙字定義,每個(gè)操作數(shù)占用兩個(gè)字(32位)。DQ:四字定義,每個(gè)操作數(shù)占用四個(gè)字(64位)。DT:十字節(jié)定義,每個(gè)操作數(shù)占用十個(gè)字節(jié)(80位),形成壓縮BCD碼。DUP:復(fù)制操作符,格式:重復(fù)數(shù)DUP(操作數(shù),…,操作數(shù))重復(fù)數(shù)可以是一個(gè)表達(dá)式或常數(shù),表示制定括號(hào)中操作數(shù)的重復(fù)次數(shù)。匯編語言偽操作例1:DATA_BYTEDB100

;定義一個(gè)字節(jié),賦值100DATA_WORDDW100H,-5

;定義兩個(gè)字,賦值100H,-5DATA_WORD=100H,DATA_WORD+2=-5DATA_DWDD3×20

;定義一個(gè)雙字,賦值60$1DB‘AB’

;定義兩個(gè)字節(jié)字符串,數(shù)值‘A’和數(shù)值‘B’$2DW2DUP(‘AB’)

;定義兩個(gè)字字符串,數(shù)值‘AB’,‘AB’$241AB4241AB42$142B41ADATA_DW006000003CDATA_WORDFF

-5FB01100H00DATA_BYTE64100匯編語言偽操作例2:ARRAY1DB2DUP(0,1,2,?)ARRAY2DB100DUP(?)第一個(gè)語句等價(jià)于:ARRAY1DB0,1,2,?,0,1,2,?共占用8個(gè)字節(jié)第二個(gè)語句等價(jià)于:ARRAY2DB?,?,?

100個(gè)共占用100個(gè)字節(jié)ARRAY2-100個(gè)字節(jié)

:::-ARRAY1-

8個(gè)字節(jié)020100-020100匯編語言偽操作2.表達(dá)式賦值偽操作EQU格式:符號(hào)名EQU表達(dá)式功能:為常量、表達(dá)式及其他各種符號(hào)定義一個(gè)等價(jià)的符號(hào)名,但它不申請(qǐng)存儲(chǔ)單元。用符號(hào)表示常量、數(shù)值表達(dá)式,即定義符號(hào)常量。使用符號(hào)常量可使程序簡(jiǎn)單明了,增強(qiáng)程序的可讀性和通用性。例:DATAEQU25 ;DATA=25ALPHAEQUDATA–7×5 ;ALPHA=–10ADDR1EQU[BX] ;ADDR1=DS:(BX)ADDR2EQUES:[BP+8] ;ADDR2=ES:(BP)+8注意,當(dāng)EQU語句表達(dá)式中包含某一變量時(shí),在該語句之前必須對(duì)變量定義。用“=”替換EQU是另一種賦值偽操作,該操作允許重復(fù)定義。匯編語言偽操作3.段定義偽操作格式:segmentnameSEGMENT:segmentnameENDS段名是為該段起的名字,用來指出匯編程序?yàn)樵摱畏峙涞拇鎯?chǔ)區(qū)域起始位置。刪節(jié)號(hào)“:”部分對(duì)于數(shù)據(jù)段、附加段或堆棧段來說,一般為存儲(chǔ)單元定義、分配等偽操作,對(duì)于代碼段則是指令或偽操作。例:DATASEGMENT:存儲(chǔ)單元定義、分配等偽操作

DATAENDSCODESEGMENT:指令或偽操作

CODEENDS匯編語言偽操作段定義偽操作還可以增加類型及屬性說明,其格式如下:segmentnameSEGMENT[定位類型][組合類型]

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論