第五章程序設(shè)計(jì)_第1頁
第五章程序設(shè)計(jì)_第2頁
第五章程序設(shè)計(jì)_第3頁
第五章程序設(shè)計(jì)_第4頁
第五章程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1 第5章匯編語言程序設(shè)計(jì) 2 主要內(nèi)容 匯編語言源程序的結(jié)構(gòu)匯編語言語句格式偽指令功能調(diào)用匯編語言程序設(shè)計(jì) 3 5 1匯編語言源程序機(jī)器語言 二進(jìn)制數(shù)形式的指令和數(shù)據(jù) B064是什么意思 這就是機(jī)器語言 既不直觀 又不易理解和記憶 MOVAL 64H 很容易記憶理解 這就是助記符 助記符 用便于記憶的英語單詞表示的指令操作碼 它反映了指令的功能和主要特征 便于人們理解和記憶 4 操作數(shù)可能放在存儲器中 這就涉及操作數(shù)的地址 程序中遇到轉(zhuǎn)移指令或調(diào)用指令 也需要知道轉(zhuǎn)移地址 若采用具體地址就很不方便 一旦有錯 改動也很麻煩 于是人們采用標(biāo)號或符號來代替地址 例 LP1 movax VAR loopLP1匯編語言 指令助記符 符號地址 標(biāo)號 偽指令等語言元素的集合以及這些元素使用的規(guī)則 用匯編語言編寫的程序叫匯編語言源程序 指令除了操作碼以外 還有一個操作數(shù)問題 5 匯編程序 源程序的編譯程序 匯編程序 匯編語言源程序 機(jī)器語言目標(biāo)程序 匯編源程序需翻譯成機(jī)器語言 變成可執(zhí)行文件 機(jī)器才能執(zhí)行 這個翻譯過程叫匯編 高級語言中稱該過程為 解釋 或 編譯 執(zhí)行翻譯的程序稱為 匯編程序 6 匯編語言大小寫不分AmericanNationalStandardsInstitute ANSI 美國國家標(biāo)準(zhǔn)學(xué)會 7 匯編語言程序設(shè)計(jì)與執(zhí)行過程 輸入?yún)R編語言源程序源文件 ASM匯編 編譯 目標(biāo)文件 OBJ鏈接可執(zhí)行文件 EXE調(diào)試最終程序 8 5 1 1匯編語言源程序的結(jié)構(gòu) 匯編語言源程序通常由一個或幾個程序模塊組成 每個模塊一般由三個邏輯段組成 數(shù)據(jù)段 存放數(shù)據(jù) 變量堆棧段 堆棧區(qū)域代碼段 存放程序指令 9 一個基本的匯編語言程序框架如下 stackSEGMENTPARA stack DB100DUP stack stackENDSdataSEGMENTdataENDScodeSEGMENTASSUMECS code DS data ES datastart MOVAX dataMOVDS AXMOVES AXMOVAL 4CHINT21HcodeENDSENDstart 堆棧段 數(shù)據(jù)段 代碼段 10 5 1 2匯編語言的語句與格式 匯編語言的語句有兩種 指令性語句 由8086指令助記符構(gòu)成的語句指示性語句 由偽指令構(gòu)成的語句指令性語句的格式為 標(biāo)號 指令助記符目的操作數(shù) 源操作數(shù) 注釋指示性語句的格式為 名字偽指令操作數(shù)1 操作數(shù)2 操作數(shù)n 注釋注 各部分之間至少要用一個空格作為分隔符 11 指令性語句由CPU執(zhí)行 每一條指令性語句都有一條機(jī)器碼指令與其對應(yīng) 指示性語句由匯編程序執(zhí)行 它指出匯編程序應(yīng)如何對源程序進(jìn)行匯編 如何定義變量 分配存儲單元以及指示程序開始和結(jié)束等 指示性語句無機(jī)器碼指令與其相對應(yīng) 指令性語句匯編時生成機(jī)器碼 指示性語句匯編時不生成機(jī)器碼 12 語句的構(gòu)成元素 標(biāo)號 指令的符號地址 用來代表指令在存儲器中的地址 只能出現(xiàn)在指令性語句中 標(biāo)號后應(yīng)加上冒號 名字 段 過程 變量的名字 用來代表它們在存儲器中的地址 只能出現(xiàn)在指示性語句中 名字后不加冒號 指令助記符 8086助記符 偽指令操作數(shù) 即指令的操作對象對指令性語句 0 1 2個對指示性語句 根據(jù)需要而定操作數(shù)之間以逗號分隔操作數(shù)可以是 寄存器 存儲單元 常數(shù)或表達(dá)式例如 AX DI BX 10 200 16 8 TABLE 等等 13 注釋 以分號開頭 可放在指令后 也可單獨(dú)一行 注意注解的寫法 要寫指令 段 在程序中的作用 而不要寫指令的操作 例如 以下為同一條指令寫的注釋1 MOVCX 100 傳送100到CX2 MOVCX 100 循環(huán)計(jì)數(shù)器置初值顯然 第二種寫法要比第一種寫法要好 14 匯編語言的一個實(shí)例 hello asmdataSEGMENTHelloDB Hello world 0DH 0AH dataENDSprogSEGMENTASSUMECS prog DS datastart MOVAX dataMOVDS AXLEADX hello 取字符串首地址MOVAH 9INT21H 顯示字符串MOVAH 4CHINT21H 退回DOSprogENDSENDstart 名字 標(biāo)號 15 5 1 3數(shù)據(jù)項(xiàng)與表達(dá)式 數(shù)據(jù)項(xiàng)包括常量 變量 標(biāo)號及表達(dá)式 1 常量二進(jìn)制數(shù) 以B結(jié)尾 如01001101B 十進(jìn)制數(shù) 如85 十六進(jìn)制數(shù) 以H結(jié)尾 第1個數(shù)字為A F時 前面應(yīng)加0 如0F160H 字符串 用引號括起來的1個或多個字符 如 ERROR a 匯編時被翻譯成對應(yīng)的ASCII碼45H 52H 52H 4FH 52H 21H和61H 16 1 指令語句中源操作數(shù)中作立即數(shù) 它應(yīng)與目的操作數(shù)的位數(shù)相一致 可以是8位或16位 例如 MOVAX 0A5F1H 2 在指令語句的基址加變址的尋址方式中作位移量 例如 MOVBX SI 32H 3 在數(shù)據(jù)定義偽指令中 例如 DB12H 定義一個字節(jié)數(shù)據(jù)DW1234H 定義一個字?jǐn)?shù)據(jù)DD12345678H 定義一個雙字?jǐn)?shù)據(jù)DB ABCD 定義4個字節(jié)的字符串?dāng)?shù)據(jù) 17 有三個屬性 段地址 即標(biāo)號所在段的段地址 偏移量 標(biāo)號所代表存儲單元的段內(nèi)偏移地址 類型 NEAR或FAR NEAR 表示標(biāo)號所在語句與轉(zhuǎn)移指令 調(diào)用指令在同一碼段內(nèi) 跳轉(zhuǎn)時只需改變IP即可 FAR 標(biāo)號所在語句與轉(zhuǎn)移指令 調(diào)用指令不在同一代碼段內(nèi) 若沒有對類型進(jìn)行說明 默認(rèn)為NEAR 標(biāo)號通常作為轉(zhuǎn)移指令或CALL指令的轉(zhuǎn)移地址 2 標(biāo)號 指令所在內(nèi)存單元的符號地址 18 變量 即內(nèi)存中的存儲單元或數(shù)據(jù)區(qū) 變量名 是存儲單元 數(shù)據(jù)區(qū) 的符號地址或名字 變量也有三個屬性 段地址 變量所在段的段地址偏移量 變量單元地址與段首地址之間的位移量 類型 有BYTE WORD和DWORD三種 變量在程序中作為存儲器操作數(shù)被引用 3 變量 19 標(biāo)號和變量名的使用規(guī)則組成 A Z 不分大小寫 0 9 不能以數(shù)字開頭 句號 只能作為首字符長度小于31個字符不能與保留字 指令助記符 偽指令 預(yù)定義符號等 重名不能重復(fù)定義例如 正確的 LP1 AGAIN NEXT GO OK 1錯誤的 4M LOOP AAA HELP ONE 20 DATA1DB12HDATA2DB34HDATA3DW5678H MOVAL DATA1MOVAX DATA3 21 5 表達(dá)式 表達(dá)式是常數(shù) 寄存器 標(biāo)號 變量與運(yùn)算符的組合 有數(shù)字表達(dá)式和地址表達(dá)式兩種 匯編時按優(yōu)先規(guī)則對表達(dá)式進(jìn)行計(jì)算 計(jì)算出具體的數(shù)值或地址 運(yùn)行時不能改變 表達(dá)式中的運(yùn)算符有6類 算術(shù) 邏輯 關(guān)系 取地址 屬性 雜類 22 用于數(shù)字表達(dá)式 例 MOVAX 4 1024匯編后的形式為 MOVAX 4096用于地址表達(dá)式 例 LEASI TAB 3若TAB的偏移地址為1000H 則匯編后的形式為 LEASI 1003H 1 算術(shù)運(yùn)算符 MOD 23 邏輯運(yùn)算符只能用于數(shù)字表達(dá)式中 例 MOVCL 36HAND0FH經(jīng)匯編后 MOVCL 06H注意 不要把邏輯運(yùn)算符與邏輯運(yùn)算指令混淆 例 ANDAX 3FC0HAND0FF00H匯編后源操作數(shù)被翻譯為 3F00H 所以上述指令與ANDAX 3F00H等價 2 邏輯運(yùn)算符 AND OR XOR NOT 24 關(guān)系運(yùn)算的結(jié)果是一個邏輯值 真或假關(guān)系為真 結(jié)果為全1關(guān)系為假 結(jié)果為全0例 MOVBX PORTGT300H若PORT的值大于300H 則匯編后為 MOVBX 0FFFFH否則匯編后為 MOVBX 0 3 關(guān)系運(yùn)算符 EQ NE LT GT LE GE 25 SEG 取變量 標(biāo)號的段地址OFFSET 取變量 標(biāo)號的偏移地址例 VARDB12H MOVBX OFFSETVAR 取變量VAR的偏移地址MOVAX SEGVAR 取變量VAR的段地址注意 以下指令的異同 MOVBX OFFSETVARLEABX VAROFFSET只能取靜態(tài)的偏移地址 LEA指令即可取靜態(tài)的偏移地址 也可取動態(tài)的偏移地址 4 取地址運(yùn)算符 SEG OFFSET 26 TYPE取變量的類型 1 2 4 LENGTH取所定義變量的長度 即變量中元素的個數(shù) SIZE取所定義存儲區(qū)的字節(jié)數(shù) TYPE LENGTH 例 VARDW1 2 3 4 5則TYPEVAR 2LENGTHVAR 5SIZEVAR 10 5 取值運(yùn)算符 TYPE LENGTH SIZE 27 6 屬性運(yùn)算符 PTR 用來指定地址操作數(shù)的類型 格式 PTR類型 BYTE WORD DWORD NEAR FAR BYTE WORD DWORD用于描述數(shù)據(jù)存儲單元 變量 地址NEAR FAR用于描述轉(zhuǎn)移 調(diào)用的目的地址 28 例 MOVBYTEPTR DI 0 字節(jié)類型MOVWORDPTR DI 0 字類型MOV DI 0B5H 類型不定PTR也可用來進(jìn)行強(qiáng)制類型轉(zhuǎn)換例 STR1DW STR1定義為字類型MOVAX STR1 合法MOVAL STR1 非法MOVAL BYTEPTRSTR1 合法 29 5 2偽指令 數(shù)據(jù)定義偽指令符號定義偽指令段定義和段寄存器指定偽指令過程定義偽指令結(jié)束偽指令 由匯編程序執(zhí)行的指令 它本身不被匯編成機(jī)器指令 常用的偽指令有 30 5 2 1數(shù)據(jù)定義偽指令 用于定義變量 即內(nèi)存單元或數(shù)據(jù)區(qū) 數(shù)據(jù)定義偽指令的格式為 變量名數(shù)據(jù)定義偽指令操作數(shù) 操作數(shù) 常用的數(shù)據(jù)定義偽指令有如下幾種 DB定義字節(jié)DW定義字DD定義雙字操作數(shù)可以是常數(shù) 變量或表達(dá)式 31 例1 DATA BDB10 5 10HDATA WDW100H 4DATA DDD0FFFBH匯編后的內(nèi)存分配情況如右圖所示 05H 10H 00H 01H FCH FFH FBH FFH 00H 00H 0AH Q DATA B DATA W DATA D 10 5 10H 100H 4 0FFFBH movAL DATA BMovAX wordPTRDATA B 32 STRING2DW AB CD EF STRING3DD AB CD 33 操作數(shù) 用來保留存儲空間 但不存入數(shù)據(jù) 例3 ABCDB0 1 2 3 4 OK RSVDW 復(fù)制操作符DUP 重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符DUP 如上面RSV亦可寫成 RSVDW8DUP 若操作數(shù)中若使用 則表示的是地址計(jì)數(shù)器的當(dāng)前值 34 例 TABLEDB10DUP BUFFERDWTABLE 3設(shè)TABLE的偏移地址為0080H 則匯編后如下圖所示 BUFFER 0080H 80H TABLE 008AH008BH008CH008DH 8FH 00H 00H 0089H 10Bytes 35 5 2 2符號定義偽指令 把一個表達(dá)式用一個符號表示 以后凡出現(xiàn)該表達(dá)式的地方都可用這個符號表示 類似于C語言中的 define 符號定義偽指令有兩種 EQU 用EQU定義的符號未清除前 不能重新定義 清除EQU定義可用PURGE偽指令 用 定義的符號可在任何時候進(jìn)行重定義 二者均不占用存儲空間 僅是給符號賦值 36 例 FIVEEQU5COUNTEQUCXTENEQU10DIST BYTEPTR SI BP GOTO JMP MOVAX TENMOVCX COUNTADDDIST FIVEDIST WORDPTR SI BP 1 ADDDIST AXGOTOLABEL 定義 引用 37 5 2 3段定義偽指令 匯編語言程序是按段來組織程序和數(shù)據(jù)的 和存儲器的物理段相對應(yīng) 匯編語言程序中的段稱為邏輯段 匯編連接后被映射到物理段中 三類段 代碼 程序 數(shù)據(jù) 堆棧段定義偽指令 SEGMENT ENDS ASSUME ORG定義一個段的基本格式 段名SEGMENT 定位類型 組合方式 類別 段名ENDS 38 這兩個偽指令總是成對出現(xiàn) 二者前面的段名應(yīng)一致 SEGMENT說明了一個段的開始 ENDS說明了一個段的結(jié)束 對數(shù)據(jù)段和堆棧段 段中的語句一般是變量定義 對代碼段則是指令語句 如 dataSEGMENTdataENDS SEGMENT和ENDS偽指令 39 ASSUME偽指令 在代碼段中 還必須明確段和段寄存器的關(guān)系 這由ASSUME語句來指定 如ASSUMECS code DS data ES data語句中的code和data為段名 這個語句說明 1 CS將指向名字為code的代碼段2 DS和ES將指向名字為data的數(shù)據(jù)段 40 但要注意 ASSUME偽指令只是告知匯編程序有關(guān)段寄存器與段的關(guān)系 并沒有給段寄存器賦予實(shí)際的初值 故下面的語句MOVAX DATAMOVDS AXMOVES AX將段基址裝入段寄存器 如果程序中用到堆棧段 則SS也需裝入實(shí)際的初值 代碼段基地址不需要程序員裝入CS寄存器 而由OS負(fù)責(zé)裝入 41 SEGMENT語句后可以帶有可選參數(shù) 用以規(guī)定邏輯段的其他一些屬性 1 定位類型說明如何確定邏輯段的邊界 有四種 PARA Paragraph 邏輯段從一個節(jié) 16個字節(jié) 的邊界開始 即段的起

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論