第5章 匯編語言程序設(shè)計1.ppt_第1頁
第5章 匯編語言程序設(shè)計1.ppt_第2頁
第5章 匯編語言程序設(shè)計1.ppt_第3頁
第5章 匯編語言程序設(shè)計1.ppt_第4頁
第5章 匯編語言程序設(shè)計1.ppt_第5頁
已閱讀5頁,還剩64頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

微機原理及接口 教學(xué)課件 第5章匯編語言程序設(shè)計 微機原理及接口 教學(xué)課件 主要內(nèi)容5 1匯編語言程序格式5 2偽指令5 3匯編語言程序設(shè)計5 4DOS和BIOS功能調(diào)用 匯編語言的特點 匯編語言是一種以處理器指令系統(tǒng)為基礎(chǔ)的低級程序設(shè)計語言 它采用助記符表達指令操作碼 采用標(biāo)識符號表示指令操作數(shù)利用匯編語言編寫程序的主要優(yōu)點是可以直接 有效地控制計算機硬件 因而容易創(chuàng)建代碼序列短小 運行快速的可執(zhí)行程序在有些應(yīng)用領(lǐng)域 匯編語言的作用是不容置疑和無可替代的匯編程序設(shè)計的過程是與其他高級語言程序設(shè)計大致相同 匯編語言源程序 匯編程序 可執(zhí)行指令和偽指令 DEBUG ASM MASM 機器語言 匯編語言的特點 匯編語言源程序示例 DATASEGMENTM1DW00FFHM2DW00FFHP1DW P2DW DATAENDSSTACKSEGMENTSTDB100DUP TOPEQULENGTHSTSTACKENDSCODESEGMENTASSUMECS CODE DS DATASS STACKSTART MOVAX DATAMOVDS AXMOVAX STACKMOVSS AXMOVSP TOP MOVBX OFFSETM1MOVAX BX MOVDX 00HMOVBX OFFSETM2MULWORDPTR BX MOVBX OFFSETP1MOV BX AXMOVBX OFFSETP2MOV BX DXHLTMOVAH 4CHINT21HCODEENDSENDSTART 5 1匯編語言源程序格式 完整的匯編語言源程序由段組成一個匯編語言源程序可以包含若干個代碼段 數(shù)據(jù)段 附加段或堆棧段 段與段之間的順序可隨意排列需獨立運行的程序必須包含一個代碼段 并指示程序執(zhí)行的起始點 一個程序只有一個起始點所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi) 說明性語句可根據(jù)需要位于任一段內(nèi)通常 程序還需要一個堆棧段整個程序以END結(jié)束 源程序由語句序列構(gòu)成 一 匯編語言的語句格式 執(zhí)行性語句 執(zhí)行性語句用于表達處理器指令 也稱為硬指令 匯編后對應(yīng)一條指令代碼 由處理器指令組成的代碼序列是程序設(shè)計的主體標(biāo)號 硬指令助記符操作數(shù) 注釋 說明性語句 說明性語句用于表達偽指令 指示源程序如何匯編 變量怎樣定義 過程怎么設(shè)置等名字偽指令助記符參數(shù) 注釋 1 標(biāo)號 名字與標(biāo)識符 標(biāo)號是反映硬指令位置 邏輯地址 和屬性的標(biāo)識符 后跟一個冒號分隔名字是反映偽指令位置 邏輯地址 和屬性的標(biāo)識符 后跟空格或制表符分隔 沒有冒號標(biāo)識符 Identifier 一般最多由31個字母 數(shù)字及規(guī)定的特殊符號 如 組成 不能以數(shù)字開頭 默認(rèn)情況下 匯編程序不區(qū)別標(biāo)識符中的字母大小寫一個源程序中 每個標(biāo)識符的定義是唯一的 且不能是匯編系統(tǒng)所采用的保留字 名字和標(biāo)號的屬性 名字和標(biāo)號是用戶自定義的標(biāo)識符 名字用于偽指令 標(biāo)號用于硬指令 名字和標(biāo)號一經(jīng)使用便具有兩類屬性 邏輯地址屬性 名字和標(biāo)號對應(yīng)存儲單元的邏輯地址 含段地址和偏移地址 類型屬性 變量名的類型可以是BYTE 字節(jié) WORD 字 和DWORD 雙字 等 標(biāo)號 段名 子程序名的類型可以是NEAR 近 和FAR 遠 分別表示段內(nèi)或段間調(diào)用匯編程序提供有關(guān)操作符 以便獲取這些屬性值 保留字 保留字 ReservedWord 是匯編程序已經(jīng)利用的標(biāo)識符 也稱為關(guān)鍵字 主要有 硬指令助記符 例如 MOV ADD偽指令助記符 例如 DB DW操作符 例如 OFFSET PTR寄存器名 例如 AX CS預(yù)定義符號 例如 data 匯編語言對大小寫不敏感 2 硬 指令和偽指令 指令是目標(biāo)機器所能執(zhí)行的代碼 為目標(biāo)cpu所執(zhí)行使CPU產(chǎn)生動作 并在程序執(zhí)行時才處理的指令 硬指令就是第4章學(xué)習(xí)的處理器指令 與具體的處理器有關(guān) 與匯編程序無關(guān)偽指令是匯編程序所執(zhí)行的一些操作 為交叉匯編機器所執(zhí)行不產(chǎn)生CPU動作 在程序執(zhí)行前由匯編程序處理的說明性指令 偽指令與具體的處理器類型無關(guān) 但與匯編程序有關(guān) 不同版本的匯編程序支持不同的偽指令 3 操作數(shù)和參數(shù) 處理器指令中的操作數(shù)可以是立即數(shù) 寄存器和存儲單元偽指令中的參數(shù)可以是常數(shù) 變量名 表達式等 可以有多個 參數(shù)之間用逗號分隔匯編語言程序中 指令參數(shù)有數(shù)值型 主要形式是常數(shù)和數(shù)值表達式 和地址型 主要形式是標(biāo)號和名字 包括變量名 段名 過程名等 例如 硬指令的操作數(shù)有立即數(shù) 寄存器和存儲單元 其中 立即數(shù)就要用數(shù)值型參數(shù)表達 存儲單元就應(yīng)該用地址型參數(shù) 存儲器操作數(shù) 表達 1 常量 常量表示一個固定的數(shù)值 它又分成多種形式常數(shù)字符串符號常量數(shù)值表達式 常數(shù) 指由10 16 2和8進制形式表達的數(shù)值 各種進制的數(shù)據(jù)以后綴字母區(qū)分 默認(rèn)不加后綴字母的是十進制數(shù) 字符串 字符串常量是用單引號或雙引號括起來的單個字符或多個字符其數(shù)值是每個字符對應(yīng)的ASCII碼值例如 d 等于64H AB 等于4142H Hello Assembly 符號常量 符號常量使用標(biāo)識符表達一個數(shù)值MASM提供等價機制 用來為常量定義符號名符號定義偽指令有等價 EQU 和等號 符號名EQU數(shù)值表達式符號名EQU MASM5 x不支持符號名 數(shù)值表達式EQU用于數(shù)值等價時不能重復(fù)定義符號名 但 允許重復(fù)賦值 例如 X 7 等效于 Xequ7X X 5 XEQUX 5 是錯誤的 符號定義實例 符號定義DosWriteCharequ2CR 13CallDOSequ符號應(yīng)用 左邊的程序段等價右側(cè)的符號形式 movah 2 movah DosWriteCharmovdl 13 movdl CRint21h CallDOS 數(shù)值表達式 數(shù)值表達式一般是指由運算符連接的各種常量所構(gòu)成的表達式匯編程序在匯編過程中計算表達式 最終得到一個確定的數(shù)值 所以也是常量表達式的數(shù)值在程序運行前的匯編階段計算 所以組成表達式的各部分必須在匯編時就能確定匯編語言支持多種運算符我們經(jīng)常使用的是加減乘除 例如 movax 3 4 5 等價于 movax 17 2 變量 變量實質(zhì)上是指可以讀寫的內(nèi)存單元 雖然內(nèi)存單元地址不變 但其中存放的數(shù)據(jù)可以改變變量需要事先定義才能使用變量定義 Define 偽指令為變量申請固定長度為單位的存儲空間 并可以同時將相應(yīng)的存儲單元初始化定義后的變量可以通過變量名等方法引用 讀寫 其中的數(shù)據(jù) 即變量中的數(shù)值 變量的定義 變量定義的匯編語言格式為 變量名變量定義偽指令初值表變量名為用戶自定義的標(biāo)識符 有時變量名也可以缺省變量定義偽指令有DB DW DD等初值表是用逗號分隔的參數(shù) 主要由常量 數(shù)值表達式或 組成 其中 表示未賦初值多個存儲單元如果初值相同 可以用復(fù)制操作符DUP進行定義 重復(fù)次數(shù)DUP 重復(fù)參數(shù) 表示初值表首元素的邏輯地址 常稱為符號地址 變量名 變量名是用戶自定義的標(biāo)識符 用來表示可讀寫數(shù)據(jù)的首地址 或初值表的首地址 這個用符號表示的地址 常稱為符號地址 一個變量可以沒有變量名 在這種情況下 匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g 即該變量沒有符號地址 設(shè)置變量名是為了方便存取它指示的存儲單元 初值表 初值表一般指用戶定義的多個數(shù)據(jù) 用逗號分隔 或內(nèi)存空間主要由數(shù)值常數(shù) 表達式或 DUP等組成 表示初值不確定 即未賦初值 DUP 表示重復(fù)初值 DUP的格式為 重復(fù)次數(shù)DUP 重復(fù)參數(shù) 4 注釋 語句中由分號 開始的部分為注釋內(nèi)容 用以增加源程序的可讀性必要時 一個語句行也可以由分號開始作為階段性注釋匯編程序在翻譯源程序時將跳過該部分 不對它們做任何處理 5 分隔符 語句的4個組成部分要用分隔符分開標(biāo)號后用冒號 注釋前用分號操作數(shù)之間和參數(shù)之間使用逗號分隔其他部分通常采用空格或制表符多個空格和制表符的作用與一個相同MASM支持續(xù)行符 二 表達式用運算符 1 算術(shù)運算符 實現(xiàn)加 減 乘 除 取余的算術(shù)運算 movax 3 4 5 等價于movax 17其中MOD也稱為取模 它產(chǎn)生除法之后的余數(shù) 如 19mod7 5 和 運算符還可以用于地址表達式 除加 減外 其他運算符的參數(shù)必須是整數(shù) 2 邏輯運算符 實現(xiàn)按位相與 相或 異或 求反的邏輯運算 oral 03hAND45h 等價于oral 01h 3 移位運算符 實現(xiàn)對數(shù)值的左移 右移的邏輯操作 移入低位或高位的是0 其格式為 數(shù)值表達式SHL SHR移位次數(shù)moval 0101bSHL 2 2 等價于moval 01010000b 4 關(guān)系運算符 用于比較和測試符號數(shù)值MASM用0FFFFH 補碼 1 表示條件為真 用0000H表示條件為假 運算符包括 EQNEGTLTGELE例 movbx PORTLT5 AND20H OR PORTGE5 AND30H 當(dāng)PORT5時 匯編結(jié)果為movbx 30H 否則 匯編結(jié)果為movbx 00H 5 高低分離符 取數(shù)值的高半部分或低半部分 HIGH LOW從一個字?jǐn)?shù)值或符號常量中得到高 低字節(jié)movah HIGH8765h 等價于movah 87h從MASM6 0引入的HIGHWORD LOWWORD取一個符號常量 不能是其他常數(shù) 的高字或低字部分dd valueequ0ffff1234h 定義一個符號常量movax LOWWORDdd value 等價于movax 1234h 6 地址操作符 地址操作符取得名字或標(biāo)號的段地址和偏移地址 7 類型操作符 類型操作符對名字或標(biāo)號的類型屬性進行設(shè)置類型操作符包括 PTR THIS SHORTTYPE LENGTH SIZE 1 PTR操作符 類型名PTR名字 標(biāo)號PTR操作符使名字或標(biāo)號具有指定的類型 其中 類型名可以是 BYTE WORD DWORD FWORD QWORD TBYTE NEAR FAR 由STRUCT RECORD UNION以及TYPEDEF定義的類型 moval byteptrw var w var是一個字變量jmpfarptrn label n label是一個標(biāo)號使用PTR操作符 可以臨時改變名字或標(biāo)號的類型 2 THIS操作符 THIS類型名用THIS說明的操作數(shù) 在匯編時 具有當(dāng)前邏輯地址和指定的類型 b varequTHISbyte 字節(jié)變量b var w vardw10dup 0 字變量w var 兩變量地址相同f jumpequTHISfar f jump為段間轉(zhuǎn)移地址 f jumplabelfar LABEL偽指令的功能等同于 EQUTHIS 3 SHORT操作符 SHORT標(biāo)名指定標(biāo)號作為 128 127字節(jié)范圍內(nèi)的短轉(zhuǎn)移 如果標(biāo)號實際上超出了這個范圍 則出錯 jmpshortn jump 4 TYPE操作符 TYPE名字 標(biāo)名返回與名字或標(biāo)號類型相關(guān)的數(shù)值對字節(jié) 字和雙字變量分別返回1 2和4 對短 近和遠轉(zhuǎn)移分別返回ff01h ff02h和ff05h movax TYPEw var 匯編結(jié)果為movax 2movax TYPEn jump 匯編結(jié)果為movax 0ff02h near標(biāo)號 操作符SIZE返回整個變量占用的字節(jié)數(shù)操作符LENGTH返回整個變量的數(shù)據(jù)項數(shù) 即元素數(shù) 8 運算符的優(yōu)先級 1 LENGTHSIZEWIDTHMASK2PTROFFSETSEGTPYETHIS 3HIGELOW4 MODSHLSHR5 6EQNEGTLTGELE7NOT8AND9ORXOR10SHORT 5 2偽指令 一 符號定義偽指令 1 EQU 等值語句 將表達式值賦予名字 一經(jīng)定義不能重復(fù) 例如 CREQU0DH 常數(shù)AEQUASC TABLE 變量 事先已定義 STREQU64 1024 數(shù)值表達式ADREQUES BP DI 5 地址表達式 功能同EQU 但可重新定義一個符號 例如 COUNT 100同COUNTEQU100CONNT 57COUNT重新定義 2 等號語句 二 內(nèi)存數(shù)據(jù) 變量 定義偽指令 定義一個變量的類型 給內(nèi)存單元賦初值 或者分配 預(yù)留內(nèi)存單元分為以下幾類 DB 定義字節(jié)偽指令DW 定義字偽指令DD 定義雙字偽指令DF 定義3字偽指令DQ 定義4字偽指令DT 定義10字節(jié)偽指令 1 定義字節(jié)變量 DefineByte DB偽指令用于分配一個或多個字節(jié)單元 并可以將它們初始化為指定值初值表中每個數(shù)據(jù)一定是字節(jié)量 存放一個8位數(shù)據(jù) 可以是0 255的無符號數(shù)或是 128 127帶符號數(shù)也可以是字符串常數(shù) 定義字節(jié)變量實例 數(shù)據(jù)段Xdb a 5db2dup 100 Ydb ABC 字節(jié)變量的應(yīng)用 Xdb a 5db2dup 100 Ydb ABC moval X 此處X表示它的第1個數(shù)據(jù) 故AL a decX 1 對X為始的第2個數(shù)據(jù)減1 故成為 6movY al 現(xiàn)在Y這個字符串成為 aBC 符號地址 變量初值 初值表 2 定義字變量 DefineWord DW偽指令用于分配一個或多個字單元 并可以將它們初始化為指定值初值表中每個數(shù)據(jù)是字量 一個字單元可用于存放任何16位數(shù)據(jù) 一個段地址一個偏移地址兩個字符0 65535之間的無符號數(shù) 32768 32767之間的帶符號數(shù) 定義字變量實例 數(shù)據(jù)段countdw8000h AB maxintequ64hnumberdwmaxintarraydwmaxintdup 0 字變量和字常量的應(yīng)用 字變量和字常量的定義 WNUMEQU5678H 定義WNUM為常量COUNTDW20H 定義COUNT為變量 假設(shè)它在數(shù)據(jù)段 的偏移地址為10H 20H為其中存放的 初始化數(shù)據(jù)字變量和字常量的應(yīng)用 MOVAX BX SI WNUM MOVAX BX SI 5678H MOVAX COUNT MOVAX 0010H LEABX COUNT LEABX 0010H MOVBX OFFSETCOUNT MOVBX 0010H 3 定義雙字變量 DefineDoubleword DD偽指令用于分配一個或多個雙字單元 并可以將它們初始化為指定值初值表中每個數(shù)據(jù)是一個32位的雙字量 可以是有符號或無符號的32位整數(shù)也可以用來表達16位段地址 高位字 和16位的偏移地址 低位字 的遠指針varddDD0 12345678hfarpointDD00400078h 4 其他數(shù)據(jù)單元定義偽指令 定義3字偽指令DF 用于為一個或多個6字節(jié)變量分配空間及初始化 6字節(jié)常用在32位CPU中表示一個48位遠指針 16位段選擇器 32位偏移地址 定義4字偽指令DQ 用于為一個或多個8字節(jié)變量分配空間及初始化 8字節(jié)變量可以表達一個64位整數(shù) 定義10字節(jié)偽指令DT 用于為一個或多個10字節(jié)變量分配空間及初始化 10字節(jié)變量可以表達長雙精度 longdouble 浮點數(shù) 5 變量的應(yīng)用 變量具有存儲單元的邏輯地址屬性程序代碼中通過變量名可直接存取其所指向的首個數(shù)據(jù)Xdb a 5moval X X a 通過變量名加減位移量可存取以改變量地址為基地址的前 后數(shù)據(jù)moval X 1 X 5 變量的定義示例 數(shù)據(jù)段bvar1db100 01100100b 64h d 字節(jié)變量 不同進制表達同一個數(shù)值 內(nèi)存中有4個64Hminint 5 符號常量 minint數(shù)值為5 不占內(nèi)存空間bvar2db 1 minint minint 5 內(nèi)存中數(shù)值依次為FFH 5 0AHdb 2dup 20h 預(yù)留一個字節(jié)空間 重復(fù)定義了2個數(shù)值20Hwvar1dw2010h 4 4 字變量 兩個數(shù)據(jù)是2010H 0010H 共占4個字節(jié)wvar2dw wvar2是沒有初值的字變量 變量的定義示例 續(xù) dvardd12347777h 87651111h 雙字變量 2個雙字?jǐn)?shù)據(jù) 一個雙字空間abcdb a b c 定義字符 實際是字節(jié)變量maxintequ0ah 符號常量 maxint 10stringdb ABCDEFGHIJ 定義字符串 使用字節(jié)定義DB偽指令crlfsdb13 10 回車符0DH 換行符0AH和美元符 24Harray1dwmaxintdup 0 10個初值為0的字量 可以認(rèn)為是數(shù)組arraydb2dup 2 3 2dup 4 6個字節(jié)內(nèi)容依次為 0203040402030404 三 定位偽指令 匯編程序按照指令的先后順序一個接著一個分配存儲空間 按照段定義偽指令規(guī)定的邊界定位屬性確定每個邏輯段的起始位置 包括偏移地址 定位偽指令ORG控制數(shù)據(jù)或代碼所在的偏移地址ORG參數(shù)ORG偽指令是將當(dāng)前偏移地址指針指向參數(shù)表達的偏移地址 例如 ORG100h 從100H處安排數(shù)據(jù)或程序ORG 10 偏移地址加10 即跳過10個字節(jié)空間匯編語言程序中 符號 表示當(dāng)前偏移地址值 四 段定義偽指令 段名segment定位組合段字 類別名 語句序列段名ends 完整段定義由SEGMENT和ENDS這一對偽指令實現(xiàn) 前者定義一個邏輯段的開始 后者表示一個段的結(jié)束 段定義指令后的4個關(guān)鍵字用于確定段的各種屬性 堆棧段要采用stack組合類型 代碼段應(yīng)具有 code 類別 其他為可選屬性參數(shù) 如果不指定 則采用默認(rèn)參數(shù) 但如果指定 注意要按照上面的屬性順序 完整段定義格式示例 stacksegmentstackdw512dup 設(shè)置堆棧stackendsdatasegment 在數(shù)據(jù)段定義數(shù)據(jù)dataendscodesegment code assumecs code ds data ss stackstart movax datamovds ax 在代碼段填入指令序列movax 4c00hint21hcodeendsendstart 1 段定位 align 屬性 指定邏輯段在主存儲器中的邊界 可為 BYTE從下一個可用的字節(jié)地址 xxxxxxxxb 開始段WORD從下一個可用的偶數(shù)地址 xxxxxxx0b 開始段DWORD從下一個可用的模4地址 xxxxxx00b 開始段PARA從下一個可用的模16地址 xxxx0000b 開始段PAGE從下一個可用的模256地址 00000000b 開始段簡化段定義偽指令的代碼段和數(shù)據(jù)段默認(rèn)采用WORD定位 堆棧段默認(rèn)采用PARA定位 完整段定義偽指令的默認(rèn)定位屬性是PARA 其低4位已經(jīng)是0 所以默認(rèn)情況下數(shù)據(jù)段的偏移地址從0開始 2 段組合 combine 屬性 指定多個邏輯段之間的關(guān)系 可為 PRIVATE 本段與其他段沒有邏輯關(guān)系 不與其他段合并 每段都有自己的段地址 這是完整段定義偽指令默認(rèn)的段組合方式 PUBLIC 連接程序把本段與所有同名同類型的其他段相鄰連接 然后為所有這些段指定一個共同的段地址 也就是合成一個物理段 這是簡化段定義偽指令默認(rèn)的段組合 STACK 本段是堆棧的一部分 連接程序?qū)⑺蠸TACK段按照與PUBLIC段的同樣方式進行合并 這是堆棧段必須具有的段組合 還有 COMMON 和 AT表達式 這兩者不常使用 3 段字 use 屬性 為支持32位段而設(shè)置的屬性 對于16位x86CPU來說 它默認(rèn)是16位段 即USE16 在匯編32位x86CPU指令時 它默認(rèn)采用32位段 即USE32 但可以使用USE16指定標(biāo)準(zhǔn)的16位段 編寫運行于實地址方式 8086工作方式 的匯編語言程序 必須采用16位段 4 段類別 class 屬性 當(dāng)連接程序組織段時 將所有的同類別段相鄰分配 段類別可以是任意名稱 但必須位于單引號中 大多數(shù)MASM程序使用 code 代碼段 data 數(shù)據(jù)段 stack 堆棧段來分別指示代碼段 數(shù)據(jù)段和堆棧段 以保持所有代碼和數(shù)據(jù)的連續(xù) 5 指定段寄存器偽指令 ASSUME段寄存器 段名 段寄存器名 段名 通知MASM用指定的段寄存器來尋址對應(yīng)的邏輯段 即建立段寄存器與段的缺省關(guān)系 在明確了程序中各段與段寄存器之間的關(guān)系后 匯編程序會根據(jù)數(shù)據(jù)所在的邏輯段 在需要時自動插入段超越前綴 這是ASSUME偽指令的主要功能 ASSUME偽指令并不為段寄存器設(shè)定初值 連接程序LINK將正確設(shè)置CS IP和SS SP 由于數(shù)據(jù)段通常都需要 所以在樣板源程序中 首先為DS賦值 如果使用附加段 還要賦值ES 6 段組偽指令 組名GROUP段名 段名 把多個同類段合并為一個64KB物理段 并用一個組名統(tǒng)一存取它 定義段組后 段組內(nèi)各段就統(tǒng)一為一個段地址 各段定義的變量和標(biāo)號的偏移地址就相對于段組基地址計算 offset操作符取變量和標(biāo)號相對于段組的偏移地址 如果沒有段組則取得相對于段的偏移地址 offset后可以跟段組中的某個段名 表示該段最后一個字節(jié)后面字節(jié)相對于段組的偏移地址 五 過程定義和子程序編寫 匯編語言中 子程序要用一對過程偽指令PROC和ENDP聲明 格式如下 過程名PROC NEAR FAR 過程體過程名ENDP可選的參數(shù)指定過程的調(diào)用屬性 沒有指定過程屬性 則采用默認(rèn)屬性NEAR屬性 段內(nèi)近調(diào)用 的過程只能被同一代碼段的其他程序所調(diào)用FAR屬性 段間遠調(diào)用 的過程可以被相同或不同代碼段的程序所調(diào)用 子程序編寫注意事項 子程序要用過程定義偽指令聲明主程序執(zhí)行CALL指令后調(diào)用子程序 子程序利用RET指令返回主程序堆棧操作 子程序中對堆棧操作 壓入 彈出 要匹配使用 以保持堆棧的平衡現(xiàn)場的保護和恢復(fù) 子程序首部應(yīng)保護要用到的寄存器 內(nèi)容 子程序返回前需進行相應(yīng)恢復(fù)子程序的位置 子程序應(yīng)安排在代碼段的主程序之外 最好放在主程序執(zhí)行終止后的位置 即返回DOS的指令之后 結(jié)束匯編的END偽指令之前 也可以放在主程序開始執(zhí)行之前的位置 SOFDLYPROCPUSHBXPUSHCXMOVBL 10DELAY MOVCX 2801WAIT LOOPWAITDECBLJNZDELAYPOPCXPOPBXRETSOFDLYENDP 例5 1 一個延遲100ms的子程序 程序開始 為了指明程序開始執(zhí)行的位置 需要使用一個標(biāo)號 例題中采用了start標(biāo)識符 連接程序會根據(jù)程序起始點正確地設(shè)置CS和IP值 根據(jù)程序大小和堆棧段大小設(shè)置SS和SP值連接程序沒有設(shè)置DS和ES值 程序如果使用數(shù)據(jù)段或附加段 必須明確給DS或ES賦值大多數(shù)程序需要數(shù)據(jù)段 程序的執(zhí)行開始應(yīng)是 start movax data data表示數(shù)據(jù)段的段地址movds ax 設(shè)置DS

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論