微型計算機原理與接口技術(馮博琴第2版)第4章_第1頁
微型計算機原理與接口技術(馮博琴第2版)第4章_第2頁
微型計算機原理與接口技術(馮博琴第2版)第4章_第3頁
微型計算機原理與接口技術(馮博琴第2版)第4章_第4頁
微型計算機原理與接口技術(馮博琴第2版)第4章_第5頁
已閱讀5頁,還剩82頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章

匯編語言程序設計1主要內容匯編語言源程序的結構匯編語言語句格式偽指令功能調用匯編語言程序設計24.1匯編語言源程序機器語言

二進制代碼,計算機識別,執行速度快,不易理解記憶。匯編語言程序

采樣用助記符、符號地址、標號、偽指令等匯編程序匯編程序匯編語言源程序機器語言目標程序1.匯編語言與匯編程序34.1匯編語言源程序輸入匯編語言源程序(EDIT)匯編(MASM)鏈接(LINK)調試(DEBUG)源文件.ASM目標文件.OBJ可執行文件.EXE最終程序2.匯編語言程序設計與執行過程44.1.1匯編語言源程序結構數據段名SEGMENT…數據段名ENDS附加段名SEGMENT…附加段名ENDS堆棧段名SEGMENT

…堆棧段名ENDS代碼段名SEGMENT

…代碼段名ENDSEND

標準程序結構P147例4-15DATASEGMENTDAIDB ‘INPUTSTRING:$’BUFDMA DB80HDUP(?)DATA

ENDSSTACKSEGMENTSTACKME1DB80HDUP(?)STACKENDSCODE SEGMENTASSUME

CS:CODE,DS:DATA,SS:STACK,ES:DATASTART:MOVAX,DATA

MOV DS,AX ;DATA→DS

MOV AX,4C00HINT 21HCODEENDSENDSTART返回DOS程序開始程序結束數據段堆棧段代碼段段賦值64.1.2匯編語言語句類型及格式71.匯編語言語句類型指令性語句指示性語句CPU執行的語句,能夠生成目標代碼CPU不執行,而由匯編程序執行的語句,不生成目標代碼82.匯編語言語句格式

指令性語句:[標號:][前綴]指令助記符[操作數],[操作數][;注釋]指令的符號地址標號后要有冒號操作碼注釋前加分號Next:MOVAX,BX;注釋9指示性語句格式[名字]偽指令助記符

操作數[,操作數,…][;注釋]變量的符號地址其后不加冒號指示性語句中至少有一個操作數103.標號、名字英文字母、數字及專用字符組成,最大長度不能超過31個,且不能由數字打頭,不能用保留字(如寄存器名,指令助記符,偽指令)。標號和名字區別標號后有冒號,在指令性語句前;名字后不加冒號,在指示性語句前。 114.1.3數據項及表達式指令性語句:第3章學過指示性語句:4.2學操作數寄存器存儲器單元數據項常量標號變量表達式算術運算邏輯運算關系運算取值運算和屬性運算其它運算下節[標號]指令助記符

操作數[,操作數,…][;注釋][名字]偽指令助記符

操作數[,操作數,…][;注釋]121.常量數字常量10進制:字母D結尾或不加結尾,23D2進制:字母B結尾,10110B16進制:字母B結尾,64H,

對字母A~F開頭的要加0,例:0ABH字符串常量:用單引號引起的字符或字符串例:‘A’MOVAL,’A’132.標號不能與助記符、偽指令重名,不能數字開頭,不超過31個字符標號的屬性:(了解)段值:標號所在段的段地址偏移量:標號單元地址與段首地址之間的位移量類型:NearFar

143.變量存儲器中,某個存儲區的名字。字母開頭,長度不超過31個字符變量的屬性段值:變量所在段的段地址偏移量:變量單元地址與段首地址之間的位移量類型:BYTE(字節)、WORD(字)、DWORD(2字)、QWORD(4字)、TBYTE(10)153.變量變量類型與指令要求相符

MOVAX,VAR1;要求VAR1必需是字類型變量MOVBL,VAR2;VAR2是字節類型變量為對應數據區的首地址:如果多個數據,必須修改地址

MOVAL,BUF+1;AL=‘E’164.表達式算術運算邏輯運算關系運算取值運算和屬性運算其它運算171)算術運算算術運算符+,-,*,/,MOD例:MOVAL,8+4等價MOVAL,12MOVAX,BUFF+(8-1)*2

將數組BUFF的第7項賦給AX,既:AX=BUFF[7]182)邏輯運算符邏輯運算符AND,OR,NOT,XOR區分邏輯命令和邏輯運算符號例:MOVAL,8AND4MOVAL,8+4-1193)關系運算符參與關系運算的必須是兩個數值關系成立,結果=FFFFH關系不成立,結果=0。運算符:EQ,NE,LT,GT,LE,GE例:MOVAL,3LT4204)取值運算符分析運算符:OFFSET*取偏移地址MOVBX,OFFSETDATA等價LEABX,DATASEG取段地址MOVBX,SEGDATA

應該還有,書上沒講TYPESIZELENGTH215)屬性運算符用于指定其后存儲器操作數的類型

運算符:PTR例:

VARDW1234H;VAR字類型變量MOVAL,VAR;非法,操作數長不匹配MOVAL,BYTRPTRVAR;合法,AL=34HMOVAL,BYTRPTR[2000H];[2000H]字節226)其它運算符方括號:“[]”

方括號中內容為操作數的偏移地址段重設符:“:”

用于修改默認的段基地址例:MOVAX,ES:[DI]返回23§4.2

偽指令由匯編程序執行的“指令系統”作用:定義變量;分配存儲區定義邏輯段;指示程序開始和結束;定義過程等。24常用偽指令數據定義偽指令符號定義偽指令段定義偽指令結束偽指令過程定義偽指令宏命令偽指令254.2.1數據定義偽指令格式:

[變量名]偽指令助記符操作數,…;[注釋]表示符號地址定義變量類型定義變量值及區域大小1.格式26DB定義的變量為字節型DW定義的變量為字類型(雙字節)DD定義的變量為雙字型(4字節)DQ定義的變量為4字型(8字節)DT定義的變量為10字節型數據定義偽指令助記符4.2.1數據定義偽指令27DATA1DB11H,22H,33H,44HDATA2DW11H,22H,3344HDATA3DD11H*2,22H,33445566H數據定義偽指令例4.2.1數據定義偽指令28可是常數、表達式、字符串數據元素不能超過規定范圍

例:

DATADBXXH;不能超過0~255定義字符串必須用DB偽指令

例:

STR1DB‘ABCD’“?”:表示未賦初始值

例:

DATADB?‘A’‘B’‘C’‘D’41H42H43H44H66H2.操作數4.2.1數據定義偽指令格式:[變量名]偽指令助記符操作數,…;[注釋]293.重復操作符作用:為一個數據區的各單元設置相同的初值格式:

[變量名]偽指令助記符nDUP(初值,…)例:DATADB20DUP(0);20個元素的數組,初值0BUFFDB20DUP(?);數組課本P153例4-3

303.重復操作符問題:定義1個數據段DATA,包括:1個字變量W,初值為01H1個字符串STR,初值為’Hello’1個包含5個字節類型元素的數組BUFF1,初值為10H~15H1個20個字類型數據的數組BUFF2,初值任意DATASEGMENTWDW01HSTRDB‘Hello’BUFF1DB10H,11H,12H,13H,14H,15HBUFF2DW20DUP(?)DATAENDS314.2.2符號定義偽指令功能:多次出現的表達式,為表示方便,定義為一個符號格式:符號名EQU 表達式操作:用符號名取代后邊的表達式,不可重新定義例:

CREQU0DH

XEQU0AH

YEQUX*2+54

程序可以:

MOVAL,CRMOVBL,Y“C語言”#definepi3.14EQU說明的表達式不占用內存空間324.2.3段定義偽指令說明邏輯段的起始和結束;說明不同程序模塊中同類邏輯段之間的聯系形態334.2.3段定義偽指令段名

SEGMENT[定位類型][組合類型][’類別’]

┇段名

ENDS說明邏輯段的起點說明不同模塊中同名段的組和連接方式段定義偽指令格式344.2.3段定義偽指令1.定位類型2.組合類型3.類別了解354.2.4設定段寄存器偽指令向匯編程序說明所定義邏輯段的性質。告訴匯編程序當前使用各段的名字,放在哪個寄存器中格式:

ASSUME段寄存器名:段名[,段寄存器名:段名,…]36一個完整源程序結構例4-5CSEG

SEGMENT

ASSUMECS:CODE,DS:DATA,ES:EDATA,SS:STACK

START:MOVAX,DATAMOVDS,AX;賦值DS段寄存器MOVAX,EDATAMOVES,AX;賦值ES段寄存器MOVAX,STACKMOVSS,AX;賦值SS段寄存器┇CSEG

ENDS

END

START注意:

代碼段CS不用賦值374.2.5過程定義偽指令用于定義一個過程體格式:

過程名

PROC[NEAR/FAR]┇

RET

過程名

ENDP過程入口的符號地址384.2.5過程定義偽指令定義一個延時子程序

DELAY

PROCNEARPUSHCX;保護現場MOVCX,1000HNEXT:LOOPNEXT;循環延時POPCX

RET;過程返回DELAY

ENDP394.2.6宏命令偽指令宏:

源程序中由匯編程序識別的具有獨立功能的一段程序代碼格式:

宏命令名

MACRO

<形式參數>

ENDM404.2.6宏命令偽指令例4-7:SUM

MACRO

X,Y,ZMOVAX,XADDAX,YMOVZ,AX

ENDM使用:SUMdata1,data2,data3414.2.7其它偽指令表示源程序結束格式:

END[標號]42§4.3功能調用操作系統提供了許多底層功能(輸入輸出/基本硬件/文件管理/),應用程序員可以直接調用,而無需自己編寫.通常有兩種功能調用BISO功能調用DOS功能調用43§4.3功能調用BIOS功能調用BIOS是固化在計算機主板FlashROM的一組程序提供與硬件直接相關功能,使程序員在不必了解硬件具體細節,通過簡單參數設置,就可調用相應功能又稱:低級調用DOS功能調用

DOS是操作系統級的調用,不依賴具體的硬件又稱:高級調用44BIOS/DOS功能調用具體參考附錄D.2D.3E

只介紹簡單DOS功能調用,BIOS類似DOS系統功能調用,中斷類型碼固定為21H45BIOS/DOS功能調用調用基本步驟:AH功能號指定寄存器放入相應入口參數執行INTnH分析出口參數464.3.1BIOS功能調用類似DOS功能調用自學了解474.3.1鍵盤輸入調用方法:

MOVAH,01HINT21H輸入的字符在AL中1、單字符輸入481.單字符輸入GET_KEY:

MOV AH,1

INT 21H

CMP AL,’Y’ JZ YES CMP AL,’N’ JZ NO JNZ GET_KEY

YES:┇ NO: ┇492.字符串輸入調用方法:

DS:DX;字符串存放地址MOVAH,0AHINT21H502.字符串輸入用戶自定義緩沖區格式:最大可鍵入字符數實際鍵入字符數存放鍵入的字符,包括回車CR(0DH)N1N2存放字符個數:≤65533512.字符串輸入

輸入一個20個字符的字符串DATA1DB21,?,21DUP(?)┇

LEADX,DATA1MOVAH,0AHINT21H數據段中定義522.字符串輸入例4-13:從鍵盤輸入字符串“HELLO”,并在結尾加‘$’DATASEGMENTSTRDB10,0,10DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

LEADX,STRMOVAH,0AHINT21HMOVCL,STR+1XORCH,CHADDDX,CXMOVBX,DXMOVBYTEPTR[BX+2],‘$’MOVAH,4CHINT21HCODEENDSENDSTART53調用方法:

MOVAH,02HMOVDL,CH;CH待輸出的字符INT21H3、單字符顯示輸出例:輸出字符‘A’MOV DL,’A’MOV AH,02INT 21H

544、字符串輸出顯示被顯示的字符串必須以‘$’結束,且所顯示的內容不應出現非可見的ASCII碼調用方法:

DS:DX;帶顯示的字串的偏移地址MOVAH,09HINT21H55字符串輸出顯示:例4-14DATA SEGMENTSTRDB‘HelloWorld!’,0DH,0AH,’$’DATAENDSCODESEGMENT ┇LEA DX,STRMOV AH,09HINT 21H┇564.3.3返回DOS用戶程序執行完后,應該把控制權交還給操作系統DOSHLT指令,只是單純停止CPU運行,不能把控制權交還給DOS借助DOS功能調用

MOVAH,4CHINT21H57§4.4匯編語言程序設計1.設計步驟:根據實際問題抽象出數學模型確定算法畫程序流程圖

分配內存工作單元和寄存器程序編碼調試582.匯編語言程序結構順序結構循環結構先判定型后判定型分枝結構單分枝多分枝子程序結構594.4.2順序程序例4-14

編寫S=86H×34H-21H的程序,式中三個數均為無符號數。初始化取被乘數取乘數求乘積取第3個操作數將被減數擴為16位做減法保存結果結束604.4.2順序程序DATASEGMENTNUMDB86H,34H,21HRESULTDW?DATAENSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,NUMLEADI,RESULTMOVAL,[SI];AL=86HMOVBL,[SI+1];BL=34HMULBL;AX=86H*34HMOVBL,[SI+2];BL=21HMOVBH,0;BH=0SUBAX,BXMOV[DI],AX;保存結果MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART614.4.3分枝程序例4-17

DATA1開始的80個單元存儲80位同學成績,編寫程序統計≥90,90~80,..<60人數,并將結果存放到DATA2開始的5個單元中。分析:

成績為正數,看為無符號數,比較用JB/JNAE/JC/JS80個成績,需要循環結果存放:DATA2[0],….,DATA2[4],624.4.3分枝程序開始循環CX=80結束>90CX>0AL[SI]SI->DATA1計數1加1YN>80計數2加1YN……SI+1634.4.3分枝程序DATASEGMENTDATA1DB80(?)DATA2DB5(?)DATAENSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,DATA1LEADI,DATA2MOVCX,80AGAIN:MOVAL,[SI]CMPAL,90JBNEXT1INCBYTEPTR[DI]JMPSTONEXT1:CMPAL,80JBNEXT2INCBYTEPTR[DI+1]JMPSTONEXT2:CMPAL,70JBNEXT3INCBYTEPTR[DI+2]JMPSTONEXT3:CMPAL,60JBNEXT4INCBYTEPTR[DI+3]JMPSTONEXT4:INCBYTEPTR[DI+4]STO:INCSILOOPAGAINMOVAH4CHINT21HCODEENDSENDSTART644.4.4循環程序習題4.17分析:

方法1:普通循環,每次賦值55H,AAH,共循環50次方法2:字符串指令STOSW,AX=AA55H,DF=0,循環50次65習題4.17方法1LEASI,BUFFMOVCX,50MOVAX,0AA55HNEXT:MOV[SI],AXADDSI,2DECCXJNZNEXTMOVAX,DSMOVES,AXLEADI,BUFFMOVCX,50CLDMOVAX,0AA55HREPSTOSW

方法2664.4.4循環程序習題4.19分析:

F(n)=F(n-1)+F(n-2)循環20-2=18次67習題4.19DATASEGMENTBUFFDW0,1,18DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,BUFFMOVCX,18NEXT:MOVAX,[SI]ADDAX,[SI+2]MOV[SI+4],AXADDSI,2LOOPNEXTHLTCODEENDSENDSTART684.4.4循環程序例4-20

把MEM開始的100個16位無符號數按從大到小排序。分析:

無符號數,比較用JB/JNAE/JC/JS內循環:第I個數和第I+1個數比較,若大則保持不變,若小,則交還位置,如此,小數逐漸下移。循環完時,最小數在最末尾,即找到最小數放在最后。外循環,99次找到最小數,在排序完畢。694.4.4循環程序01234…989910234…9899因為[SI]<[SI+2],所以交還位置SISI12034…9899因為[SI]<[SI+2],所以交還位置SI12034…990因為[SI]<[SI+2],所以交還位置SI704.4.4循環程序For(i=0;i<N-1;i++)For(j=0;j<N-1-i;j++){

循環體;}For(i=N-1;i>0;i--)For(j=0;j<i;j++){

循環體;}714.4.4循環程序開始DI<-偏移地址BL<-外循環次數SI<-偏移地址CL<-內循環次數取一個操作數修改地址指針大于?交換位置NYCL-1CL=0?YNBL-1BL=0?YN結束與第2個比較724.4.4循環程序DATASEGMENTMEMDW100(?)DATAENSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADI,MEMMOVBL99;外循環NEXT1:MOVSI,DIMOVCL,BLNEXT2:MOVAX,[SI]ADDSI,2CMPAX,[SI]JNCNEXT3

MOVDX,[SI]MOV[SI-2],DXMOV[SI],DXNEXT3:DECCLJNZNEXT2DECBLJNZNEXT1MOVAH,4CHINT21HCODEENDSENDSTART

734.4.5子程序設計子程序調用注意:

參數傳遞常見參數傳遞有:寄存器、變量、地址表、堆棧現場保護:寄存器(用戶程序做)、標志寄存器(系統做了)多層調用每次調用都要保存返回地址(CS:IP),所以多重調用考慮堆棧溢出的問題,特別是遞規程序。744.4.5子程序設計例4-21

從一個字符串中刪除一個字符。分析:

在子程序里實現找到字符,并刪除。待刪除的字符CH,通過堆棧傳遞給子程序754.4.5子程序設計DATASEGMENTSTRDB‘Exxperience…’LENDW$-STR;串長KEYDB‘x’DATAENSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXMOVES,AXLEABX,STRLEACX,LEN

PUSHBX;STR地址PUSHCX;STR長度

MOVAL,KEY;待找字符

CALLDELCHAR

MOVAH,4CHINT21HMAINENDP(BX)(CX)(IP)SP764.4.5子程序設計DELCHARPROCPUSHBPMOVBP,SPPUSHSIPUSHDICLDMOVSI,[BP+4]MOVCX,[SI]MOVDI,[BP+6]

REPNESCASB

JNEDONE

BP返回地址SP(BX)(CX)(IP)原(BP)(SI)(DI)(CX)774.4.5子程序設計;找到字符MOVSI,[BP+4]DECWORDPTR[SI];個數減1MOVSI,DIDECDIREPMOVSBDONE:POPDIPOPSIPOPBPRETDELCHARENDPCODEENDSENDSTARTDIXXXXXXAXXXXXXXX待刪字符784.4.5子程序設計利用子函數MyADDProc實現2個數的加法Z=X+Y利用堆棧傳遞參數調用前,壓入輸入參數調用后,彈出執行結果79DATASEGMENTxdw12hydw24hzdw0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXpushzpushypushx

CALLMyADDProc

;popx;popypopzMOVAH,4CHINT21HMAINENDPMyADDProc

PROCPUSHBPMOVBP,SPpushax

movax,[bp+4]addax,[bp+6]

mov[bp+8],axpopaxPOPBPRET4MyADDProc

ENDPCODEENDSENDSTART返回地址BPSPX(CS)(IP)原(BP)YAXZ804.4.6常用程序設計舉例例4-23

ASCII表示的數,轉換為二進制數。

分析:

引號擴起來的數在內存以起ASCII碼存儲‘0’…‘9’的ASCII碼為30H~39H,’A’…’F’的ASCII碼為41H~46H如果輸入的數不在‘0’~‘9’和‘A’~’F’內認為非法。例如:ASCII碼形式的4字節數’2‘’6‘’A’’1’轉化為2字節數26A1H814.4.6常用程序設計舉例程序流程:

DX=0;//存放轉換結果For(I=0;I<4;I++){取一個字符ALIf(AL<‘0’){error}If(AL<=‘9’)//’0’…’9’{AL=AL-30H}Else//’A’…’F’{

If(AL<‘A’){error}

If(AL>‘F’){error}AL=AL-’A’+10=AL-37H}DX=DX+AL;DX=DX<<4;}824.4.6常用程序設計舉例DATASEGMENTMASCDB‘2’,’6’,’A’,’1’MBINDB2DUP(?)DATAENSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCL,4MOVCH,CLLEASI,MASCCLDXORAX,AXXORDX,DXNEXT1:LODSB;DS:SI->ALANDAL,7FCMPAL,’0’JBERRORCMPAL,’9’JANEXT2SUBAL,30HJMPNEXT3NEXT2:CMPAL,’A’JBERRORCMPAL,’F’JAERRORSUBAL,37HNEXT

溫馨提示

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

評論

0/150

提交評論