




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章第4章:匯編語言的特點匯編語言是一種以處理器指令系統(tǒng)為基礎的低級程序設計語言,它采用助記符表達指令操作碼,采用標識符號表示指令操作數(shù)利用匯編語言編寫程序的主要優(yōu)點是可以直接、有效地控制計算機硬件,因而容易創(chuàng)建代碼序列短小、運行快速的可執(zhí)行程序在有些應用領域,匯編語言的作用是不容置疑和無可替代的匯編程序設計的過程是與其他高級語言程序設計大致相同第4章:教學重點匯編語言源程序格式與開發(fā)常量、變量和標號匯編語言程序設計方法順序程序設計分支程序設計循環(huán)程序設計子程序設計匯編語言語句行匯編語言源程序的格式標號/名字:操作碼操作數(shù);注釋源程序由若干各段組成。每段以SEGMENT開始,以ENDS結束,整個源程序以END結束。4.2語句行的構成1.標記1).IBM宏匯編的字符集字母、數(shù)字、特殊符號注意:除上述字符之外,其他字符均按空格處理。緊接在回車換行后的&按空格處理。2).界符:特殊符號,表示標記的結束。注意:有界符時可以不用分隔符。3).常量表示一個固定的數(shù)值數(shù)字常量字符串常量4).標識符字母、數(shù)字、特殊符號注意:不用數(shù)字開頭5).保留字(ReservedWord)是匯編程序已經(jīng)利用的標識符(也稱為關鍵字),主要有:硬指令助記符——例如:MOV、ADD偽指令助記符——例如:DB、DW操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS預定義符號——例如:@data6).注釋語句中由分號“;”開始的部分為注釋內容,用以增加源程序的可讀性必要時,一個語句行也可以由分號開始作為階段性注釋匯編程序在翻譯源程序時將跳過該部分,不對它們做任何處理2.符號1).寄存器2).變量存在存儲單元中的操作數(shù),是與數(shù)據(jù)項的第一個字節(jié)相對應的標記符,表示該數(shù)據(jù)項第一個字節(jié)在現(xiàn)行段內的偏移量。屬性:段值、偏移量、類型3).標號用符號表示的地址屬性:段值——標號對應的指令首字節(jié)所在的段地址偏移量——標號對應的指令首字節(jié)的段內偏移量屬性——NEAR、FAR注意:沒說明時認為是NEAR型。再轉移和調用指令常把標號作為轉移的目標地址3.表達式由標記和符號通過運算符組合而來,即由運算符和運算對象組成運算符:算術、邏輯、關系、分析、合成運算對象:常量、變量、標號、操作數(shù)等1).操作數(shù)常量操作數(shù)允許范圍:-65535~65535存儲器操作數(shù):通常是標識符(標號、變量)④.分析運算符把存儲器操作數(shù)分解為它的組成部分⑤.合成運算符由已知的存儲器操作數(shù)生成一段值和偏移量相同,而類型不同的新存儲器操作數(shù)。4.3.2數(shù)據(jù)定義語句數(shù)據(jù)定義的匯編語言格式為:
變量名偽指令初值表變量名為用戶自定義標識符,表示初值表首元素的邏輯地址,常稱為符號地址。變量名也可以沒有初值表是用逗號分隔的參數(shù),主要由常量、數(shù)值表達式或“?”組成。其中“?”表示未賦初值多個存儲單元如果初值相同,可以用復制操作符DUP進行定義:
重復次數(shù)DUP(重復參數(shù))變量定義偽指令有DB、DW、DD等1.字節(jié)定義語句DB(DefineByte)DB偽指令用于分配一個或多個字節(jié)單元,并可以將它們初始化為指定值說明:表達式值或數(shù)據(jù)項表的每一項是一個字節(jié)數(shù),從符號名地址開始按字節(jié)連續(xù)存放,直到表中數(shù)據(jù)項結束。即:地址表達式中的變量名稱表示該變量的第一個存儲單元的偏移地址初值表中每個數(shù)據(jù)一定是字節(jié)量,存放一個8位數(shù)據(jù):可以是0~255的無符號數(shù)或是-128~+127帶符號數(shù)也可以是字符串常數(shù)[名字]DB<數(shù)據(jù)項表或表達式〉2.字定義偽指令DW(DefineWord)[名字]DW<數(shù)據(jù)項表或表達式〉DW偽指令用于分配一個或多個字單元,并可以將它們初始化為指定值初值表中每個數(shù)據(jù)是字量,一個字單元可用于存放任何16位數(shù)據(jù):一個段地址一個偏移地址兩個字符0~65535之間的無符號數(shù)-32768~+32767之間的帶符號數(shù)3.雙字定義偽指令DD(DefineDoubleword)[名字]DD<數(shù)據(jù)項表或表達式〉DD偽指令用于分配一個或多個雙字單元,并可以將它們初始化為指定值初值表中每個數(shù)據(jù)是一個32位的雙字量:可以是有符號或無符號的32位整數(shù)也可以用來表達16位段地址(高位字)和16位的偏移地址(低位字)的遠指針4.八字節(jié)定義語句DQ5.十個字節(jié)定義語句DT注意:1.地址表達式中的變量或標號可與常數(shù)值相加減,變量運算結果類型不變,標號運算后表示標號中的偏移地址。例:SUMDB?SUM+22.變量或標號不能相加,但可相減,結果是沒有屬性的純數(shù)值。7.組合運算符1).定義符號名為新類型<類型>PTR<符號名>2).指定新類型THIS<類型>例:LABCEQUTHISBYTELABDDW4321H,2255HMOVAL,LABC;AL=21HMOVAX,LABD;AX=4321H注意:類型在THIS中指定,段地址和偏移量是匯編時的當前值。4.3.3段定義語句(P127)完整段定義利用SEGMENT和ENDS一對偽指令定義邏輯段同時需要配合ASSUME偽指令指明邏輯段是代碼段、堆棧段、數(shù)據(jù)段還是附加段4.3.4過程定義語句(P131)匯編語言中,子程序要用一對過程偽指令PROC和ENDP聲明,格式如下:
過程名
PROC[NEAR|FAR] …… ;過程體
過程名
ENDP可選的參數(shù)指定過程的調用屬性。沒有指定過程屬性,則采用默認屬性NEAR屬性(段內近調用)的過程只能被相同代碼段的其他程序調用FAR屬性(段間遠調用)的過程可以被相同或不同代碼段的程序調用4.3.5結束語句(P132)匯編結束表示匯編程序到此結束將源程序翻譯成目標模塊代碼的過程源程序的最后必須有一條END偽指令
END[標號]可選的“標號”參數(shù)指定程序開始執(zhí)行點,連接程序據(jù)此設置CS和IP值(例題中采用了start標識符)4.5匯編語言程序設計及舉例沒有分支、循環(huán)等轉移指令的程序,會按指令書寫的前后順利依次執(zhí)行,這就是順序程序順序結構是最基本的程序結構完全采用順序結構編寫的程序并不多見4.5.1順序程序設計4.5.2分支程序設計分支程序根據(jù)條件是真或假決定執(zhí)行與否判斷的條件是各種指令,如CMP、TEST等執(zhí)行后形成的狀態(tài)標志轉移指令Jcc和JMP可以實現(xiàn)分支控制分支結構有單分支結構雙分支結構多分支結構編寫分支程序,需留心分支的開始和結束1、單分支結構條件成立跳轉,否則順序執(zhí)行分支語句體注意選擇正確的條件轉移指令和轉移目標地址3、多分支結構多分支結構是多個條件對應各自的分支語句體,哪個條件成立就轉入相應分支體執(zhí)行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNorah,ah ;=cmpah,0jzfunction0decah ;=cmpah,1jzfunction0decah ;=cmpah,2jzfunction04.5.3循環(huán)程序設計循環(huán)程序結構是滿足一定條件的情況下,重復執(zhí)行某段程序循環(huán)結構的程序通常有3個部分:循環(huán)初始部分——為開始循環(huán)準備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的數(shù)值等循環(huán)體部分——指重復執(zhí)行的程序部分,其中包括對循環(huán)條件等的修改程序段循環(huán)控制部分——判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán)關鍵是什么?1、循環(huán)控制循環(huán)結構程序的設計關鍵是循環(huán)控制部分循環(huán)控制可以在進入循環(huán)之前進行,也可以在循環(huán)體后進行,于是形成兩種結構:“先判斷、后循環(huán)”結構“先循環(huán)、后判斷”結構循環(huán)結束的控制可以用循環(huán)次數(shù),還可以用特定條件等,于是又有:計數(shù)控制循環(huán)條件控制循環(huán)圖示先循環(huán)后判斷的循環(huán)結構
結束
初始化
循環(huán)的初始狀態(tài)
循環(huán)體
循環(huán)的工作部分及修改部分
計數(shù)控制循環(huán)條件控制循環(huán)修改部分控制條件YN1、計數(shù)器控制循環(huán)計數(shù)控制循環(huán)利用循環(huán)次數(shù)作為控制條件易于采用循環(huán)指令LOOP和JCXZ實現(xiàn)初始化:將循環(huán)次數(shù)或最大循環(huán)次數(shù)置入CX循環(huán)體循環(huán)控制:用LOOP指令對CX減1、并判斷是否為02、條件控制循環(huán)條件控制循環(huán)需要利用特定條件判斷循環(huán)是否結束條件控制循環(huán)用條件轉移指令判斷循環(huán)條件轉移指令可以指定目的標號來改變程序的運行順序,如果目的標號指向一個重復執(zhí)行的語句體的開始或結束,便構成了循環(huán)控制結構4.5.4子程序設計把功能相對獨立的程序段單獨編寫和調試,作為一個相對獨立的模塊供程序使用,就形成子程序子程序可以實現(xiàn)源程序的模塊化,可簡化源程序結構,可以提高編程效率主程序(調用程序)需要利用CALL指令調用子程序(被調用程序)子程序需要利用RET指令返回主程序子程序編寫注意事項(1)⑴子程序要利用過程定義偽指令聲明⑵子程序最后利用RET指令返回主程序,主程序執(zhí)行CALL指令調用子程序⑶子程序中對堆棧的壓入和彈出操作要成對使用,保持堆棧的平衡⑷子程序開始應該保護使用到的寄存器內容,子程序返回前相應進行恢復⑸子程序應安排在代碼段的主程序之外,最好放在主程序執(zhí)行終止后的位置(返回DOS后、匯編結束END偽指令前),也可以放在主程序開始執(zhí)行之前的位置子程序編寫注意事項(2)⑹子程序允許嵌套和遞歸⑺子程序可以與主程序共用一個數(shù)據(jù)段,也可以使用不同的數(shù)據(jù)段(注意修改DS),還可以在子程序最后設置數(shù)據(jù)區(qū)(利用CS尋址)⑻子程序的編寫可以很靈活,例如具有多個出口(多個RET指令)和入口,但一定要保證堆棧操作的正確性⑼處理好子程序與主程序間的參數(shù)傳遞問題⑽提供必要的子程序說明信息4.5.4參數(shù)傳遞主程序與子程序間一個主要問題是參數(shù)傳遞入口參數(shù)(輸入?yún)?shù)):主程序調用子程序時,提供給子程序的參數(shù)出口參數(shù)(輸出參數(shù)):子程序執(zhí)行結束返回給主程序的參數(shù)參數(shù)的具體內容傳數(shù)值:傳送數(shù)據(jù)本身傳地址:傳送數(shù)據(jù)的主存地址常用的參數(shù)傳遞方法寄存器共享變量堆棧1、使用寄存器傳遞參數(shù)最簡單和常用的參數(shù)傳遞方法是通過寄存器,只要把參數(shù)存于約定的寄存器中就可以了由于通用寄存器個數(shù)有限,這種方法對少量數(shù)據(jù)可以直接傳遞數(shù)值,而對大量數(shù)據(jù)只能傳遞地址采用寄存器傳遞參數(shù),注意帶有出口參數(shù)的寄存器不能保護和恢復,帶有入口參數(shù)的寄存器可以保護、也可以不保護,但最好能夠保持一致2、使用共享變量傳遞參數(shù)子程序和主程序使用同一個變量名存取數(shù)據(jù)就是利用共享變量(全局變量)進行參數(shù)傳遞如果變量定義和使用不在同一個源程序中,需要利用PUBLIC、EXTREN聲明如果主程序還要利用原來的變量值,則需要保護和恢復利用共享變量傳遞參數(shù),子程序的通用性較差,但特別適合在多個程序段間、尤其在不同的程序模塊間傳遞數(shù)據(jù)3、用堆棧傳遞參數(shù)參數(shù)傳遞還可以通過堆棧這個臨時存儲區(qū)。主程序將入口參數(shù)壓入堆棧,子程序從堆棧中取出參數(shù);子程序將出口參數(shù)壓入堆棧,主程序彈出堆棧取得它們采用堆棧傳遞參數(shù)是程式化的,它是編譯程序處理參數(shù)傳遞、以及匯編語言與高級語言混合編程時的常規(guī)方法例4-1兩個32位無符號數(shù)乘法程序程序name 32bitmultiplydata segmentmulnum dw 0000,0ffffh,0000, 0ffffh,4dup(?)data endsstack segmentparastack′stack′ db 100dup(?)stack endscode segment assumecs:code,ds:data, ss:stack,es:datastart proc farbegin: push ds ;DS中包含的是程序段前綴的起 始地址 mov ax,0 push ax ;設置返回至DOS的段值和IP值 mov ax,data mov ds,ax mov es,ax ;置段寄存器初值 lea bx,mulnummulu32:mov ax,[bx] ;B→AX mov si,[bx+4] ;D→SI mov di,[bx+6] ;C→DI mul si ;B×D mov [bx+8],ax ;保存部分積1 mov [bx+0ah],dx mov ax,[bx+2] ;A→AX mul si ;A×D add ax,[bx+0ah] adc dx,0 ;部分積2的一部分與部分積1的相應部 分相加 mov [bx+0ah],ax mov [bx+0ch],dx ;保存 mov ax,[bx] ;B→AX mul di;B×C add ax,[bx+0ah] ;與部分積3的相應部分相加 adc dx,[bx+0ch]mov [bx+0ah],ax mov [bx+0ch],dx pushf ;保存后一次相加的進位位 mov ax,[bx+2] ;A→AX mul di;A×C popf adc ax,[bx+0ch] ;與部分積4的相應部分相加 adc dx,0 mov [bx+0ch],ax mov [bx+0eh],dx retstart endpcode endsend begin例4-2在一串給定個數(shù)的數(shù)中尋找最大值(或最小值),并且放至指定的存儲單元。每個數(shù)用16位表示。NAME SEARCH_MAXDATA SEGMENTBUFFER DW X1,X2,…,XnCOUNT EQU $-BUFFERMAX DW ?DATA ENDSSTACK SEGMENT PAPASTACK′STACK′ DB 64DUP(?)TOP EQU $-STACKSTACK ENDSCODE SEGMENTSTART PROC FAR ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AXMOV CX,COUNT LEA BX,BUFFER MOV AX,[BX] INC BX DEC CXAGAIN: CMP AX,[BX] JGE NEXT MOV AX,[BX]NEXT: INC BX LOOP AGAINSTART ENDPCODE ENDS END BEGIN例4-3從頭搜索字符串的結束標志,統(tǒng)計搜索的字符個數(shù)程序name length_of_stringdata segmentstring db ′abcduvwxyz′,0dhll db ?cr equ 0dhdata endsstack segment para stack′stack′ db 100dup(?)stack endscode segment assumecs:code,ds:data,es:data,ss:stackStart proc farbegin: push ds mov ax,0 push ax mov ax,data mov ds,ax mov es,ax lea di,string;設串的地址指針 mov dl,0;置串長度初值為0 mov al,cr;串結束標志→ALagain: scasb ;搜索串je done;找到結束標志停止 inc dl;串長度加1 jmp againdone: lea bx,ll mov [bx],dl retstart endpcode endsend begin例4-5若有一個二進制數(shù)碼串,要把每一個字節(jié)中的二進制轉換為兩位十六進制數(shù)的ASCII碼,高4位的ASCII碼放在地址高的單元。串中的第一個字節(jié)為串的長度(小于128)程序name hex_change_to_asciidata segmentl1 dw 2string db 34h,98hl2 dw ?buffer db 2*2dup(?)data endsstack segment parastack′stack′ db 100dup(?)stack endscode segment assumecs:code,ds:data,es:data,ss:stackstart proc farbegin: push ds mov ax,0 push ax mov ax,data mov ds,ax mov es,ax mov cx,l1 lea bx,string lea si,buffer mov ax,cxsal cx,1 mov l2,cx mov cx,axagain: mov al,[bx] mov dl,al and al,0fh call change mov al,dl push cx mov cl,4 shr al,cl pop cxcall change inc bx loop again retstart endpchange proc cmp al,10 jl add_0 add a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 太陽能熱電聯(lián)產(chǎn)項目可行性研究的目的和意義
- 2025年河南工業(yè)貿(mào)易職業(yè)學院單招職業(yè)技能測試題庫附答案
- 輸電線路遷改的技術要求
- 2024銷售人員個人工作總結和計劃(32篇)
- 第二章第二節(jié)海陸的變遷教學設計第 2課時 2023-2024學年人教版地理七年級上冊
- 2025年湖南省郴州市單招職業(yè)傾向性測試題庫學生專用
- 2025至2030年中國廣告燈箱布基布數(shù)據(jù)監(jiān)測研究報告
- 茶樓員工2025年度勞動合同與勞動合同續(xù)簽條件
- 2025年度智能物流貨運合同格式規(guī)范
- 二零二五年度商業(yè)設施定期清潔合同
- 水利水電工程施工質量管理及驗收規(guī)程講課稿課件
- 介入科規(guī)章制度
- GB/T 44723-2024氫燃料內燃機通用技術條件
- 駕駛員職業(yè)健康知識培訓
- 【課件】程式與意蘊-中國傳統(tǒng)繪畫+課件高中美術人美版(2019)美術鑒賞
- 光纖布拉格光柵(FBG)
- 機電設備及工藝作業(yè)指導書
- 能源崗位招聘面試題與參考回答2024年
- 新版《鐵道概論》考試復習試題庫(含答案)
- 實驗室安全自檢自查表
- 河西走廊紀錄片文化傳承歷史科普宣傳
評論
0/150
提交評論