微機(jī)原理與接口技術(shù)第4章.ppt_第1頁(yè)
微機(jī)原理與接口技術(shù)第4章.ppt_第2頁(yè)
微機(jī)原理與接口技術(shù)第4章.ppt_第3頁(yè)
微機(jī)原理與接口技術(shù)第4章.ppt_第4頁(yè)
微機(jī)原理與接口技術(shù)第4章.ppt_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章 8086的匯編語(yǔ)言,4.1 8086匯編語(yǔ)言源程序的格式,4.1.1 匯編語(yǔ)言(Assembly language) 匯編語(yǔ)言是一種面向機(jī)器的程序設(shè)計(jì)語(yǔ)言,不同類型的CPU,其匯編指令也不盡相同。它是對(duì)機(jī)器語(yǔ)言的符號(hào)化描述,是一門(mén)低級(jí)語(yǔ)言。用匯編語(yǔ)言編寫(xiě)的程序叫“匯編語(yǔ)言程序”或“匯編語(yǔ)言源程序”。這種程序較機(jī)器語(yǔ)言直觀、易懂、便于交流和維護(hù)。與其他高級(jí)語(yǔ)言一樣,匯編語(yǔ)言源程序不能直接被計(jì)算機(jī)識(shí)別并運(yùn)行,它必須通過(guò)匯編程序翻譯成機(jī)器能夠識(shí)別的機(jī)器語(yǔ)言程序(目標(biāo)程序,Object Program)才能運(yùn)行。利用匯編程序?qū)R編語(yǔ)言源程序翻譯成機(jī)器代碼的過(guò)程稱為匯編。,4.1 8086匯編語(yǔ)言源程序的格式,4.1.2 匯編程序(Assembler) 匯編程序與匯編語(yǔ)言(源)程序是兩個(gè)截然不同的概念。匯編語(yǔ)言程序是用戶根據(jù)實(shí)際需求,使用匯編語(yǔ)言程序格式用助記符指令自行編寫(xiě)的程序;而匯編程序是系統(tǒng)程序,是用來(lái)將用戶編寫(xiě)的匯編語(yǔ)言(源)程序轉(zhuǎn)換為機(jī)器代碼的系統(tǒng)工具程序。匯編程序以匯編語(yǔ)言(源)程序輸入,并由此生成目標(biāo)程序文件(機(jī)器能夠識(shí)別的二進(jìn)制代碼)。 匯編語(yǔ)言程序從建立到執(zhí)行的轉(zhuǎn)換過(guò)程如圖,4.1 8086匯編語(yǔ)言源程序的格式,4.1.3 匯編語(yǔ)言程序的格式 一個(gè)匯編語(yǔ)言程序可由若干個(gè)(此例有3個(gè))段組成。每個(gè)段均以SEGMENT開(kāi)始以ENDS結(jié)束。 每個(gè)段可以包含若干語(yǔ)句,而語(yǔ)句又可以是指令語(yǔ)句或偽指令語(yǔ)句兩種。如程序中用到的ASSUME,DB,SEGMENTENDS等為偽指令語(yǔ)句。 每條語(yǔ)句可由標(biāo)識(shí)符、保留字、表達(dá)式等元素組成。,4.1 8086匯編語(yǔ)言源程序的格式,4.1.4 語(yǔ)句類型 8086/8088匯編語(yǔ)言程序的語(yǔ)句除指令語(yǔ)句以外,還可以有偽指令語(yǔ)句和宏指令語(yǔ)句 在匯編語(yǔ)言中,指令、偽指令和宏指令語(yǔ)句都可由四個(gè)域構(gòu)成,格式如下: 標(biāo)識(shí)符 操作符 操作數(shù) ;注釋 其中標(biāo)識(shí)符和注釋域作為可選項(xiàng),在語(yǔ)句中根據(jù)需要決定是否選擇。,4.1 8086匯編語(yǔ)言源程序的格式,1標(biāo)識(shí)符 標(biāo)識(shí)符是源程序中為方便引用或閱讀而指定的字符串。即程序員給某個(gè)位置給定的一個(gè)符號(hào)名字。它可以是下列字符的組合: 字母AZ 或az; 數(shù)字09; 專用字符?、.、_(下劃線)、$。,4.1 8086匯編語(yǔ)言源程序的格式,2操作符 操作符是指令、偽指令或宏指令的助記符,說(shuō)明本指令將執(zhí)行一個(gè)什么樣的操作。指令及偽指令助記符由匯編語(yǔ)言系統(tǒng)規(guī)定,宏指令助記符由編程者定義宏指令時(shí)設(shè)定。 如“MOV”為將源操作數(shù)傳送到目的操作數(shù)的指令,“ADD”為加法指令等。,4.1 8086匯編語(yǔ)言源程序的格式,3操作數(shù) 一般情況下操作數(shù)有一個(gè)或兩個(gè)操作數(shù),也可以有多個(gè)操作數(shù)。若是兩個(gè)或兩個(gè)以上的操作數(shù),則各個(gè)操作數(shù)之間用逗號(hào)分隔。操作數(shù)字段可以由常數(shù),變量,表達(dá)式,寄存器名或標(biāo)號(hào)中的一種或幾種組成: 常數(shù) 二進(jìn)制常數(shù) 八進(jìn)制常數(shù) 十進(jìn)制常數(shù) 十六進(jìn)制常數(shù) 符號(hào)常量 串常數(shù) 標(biāo)號(hào)和變量,4.1 8086匯編語(yǔ)言源程序的格式,表達(dá)式及運(yùn)算符,表4-1 8086匯編語(yǔ)言中的運(yùn)算符,4.1 8086匯編語(yǔ)言源程序的格式,(6)改屬性運(yùn)算符 此類運(yùn)算符專為存儲(chǔ)器地址操作數(shù)臨時(shí)指定一個(gè)新屬性而設(shè)。 PTR運(yùn)算符 格式:類型 PTR 變量名 功能:PTR將其左邊的類型指定給右邊的地址。因此該地址除原 有類型外,還具有由PTR指定的臨時(shí)新類型。 THIS運(yùn)算符 THIS運(yùn)算符像PTR一樣,可以用來(lái)建立一個(gè)特殊類型的存儲(chǔ)器地址操作數(shù),而不實(shí)際為它分配新的存儲(chǔ)單元。用THIS建立的存儲(chǔ)器地址操作數(shù)的段和偏移量與目前能分配的下一個(gè)存儲(chǔ)單元的段和偏移量相同,但類型由THIS指定。,4.1 8086匯編語(yǔ)言源程序的格式,4注釋 匯編語(yǔ)言中的每一條語(yǔ)句都可以加上注釋部分。 注釋是一行中用“;”開(kāi)頭的部分。 一般用注釋來(lái)說(shuō)明程序功能和語(yǔ)句的作用。 匯編程序在翻譯源程序時(shí),不會(huì)處理分號(hào)以后的注釋部分。,4.2 常用的偽指令,匯編語(yǔ)言程序的語(yǔ)句除了指令語(yǔ)句外還有偽指令語(yǔ)句,分別簡(jiǎn)稱為指令和偽指令。 偽指令屬于匯編控制命令,用來(lái)告訴匯編程序數(shù)據(jù)定義的類型、如何分配存儲(chǔ)區(qū)及指示程序結(jié)果等功能,它本身不產(chǎn)生任何目標(biāo)代碼。,4.2 常用的偽指令,4.2.1符號(hào)定義偽指令 在編程的過(guò)程中,有的表達(dá)式或常量可能多次出現(xiàn),為了方便對(duì)源程序的閱讀與修改。 可用符號(hào)定義偽指令為這個(gè)表達(dá)式或常量指定一個(gè)標(biāo)識(shí)符。此時(shí),該標(biāo)識(shí)符具有與表達(dá)式或常量相同的值。 1EQU偽指令 格式:符號(hào)名 EQU 表達(dá)式 功能:用表達(dá)式來(lái)定義符號(hào)名,使得符號(hào)名具有與表達(dá)式相同的值。其中表達(dá)式可以是常數(shù)、可求出具體值的表達(dá)式、寄存器名或指令助記符。 例如: NUM EQU 25 ;定義符號(hào)常量NUM,其值恒為25 2“=”偽指令 格式:符號(hào)名 = 表達(dá)式 功能:與EQU偽指令功能基本相同。兩者的區(qū)別在于只有“=”偽指令可對(duì)同一標(biāo)識(shí)符作重新定義。,4.2 常用的偽指令,4.2.2 數(shù)據(jù)定義及存儲(chǔ)器分配偽指令 該類指令用于為數(shù)據(jù)分配存儲(chǔ)單元,并進(jìn)行初始化,同時(shí)還可為指定的存儲(chǔ)單元取名,即變量名。 1DB 偽指令 格式:變量名 DB 數(shù)據(jù)項(xiàng)表 ;注釋 功能:告訴匯編程序,分配一塊連續(xù)的內(nèi)存單元作為字節(jié)數(shù)據(jù)區(qū),并依次將數(shù)據(jù)項(xiàng)表中的值存放到內(nèi)存中,存放時(shí)地址對(duì)應(yīng)規(guī)則為先出現(xiàn)者對(duì)應(yīng)低地址,后出現(xiàn)者對(duì)應(yīng)高地址。若偽指令DB 左邊給出了“變量名”,則此變量名用來(lái)標(biāo)識(shí)新定義的內(nèi)存單元的首地址(偏移地址)。 2DW 偽指令 格式:變量名 DB 數(shù)據(jù)項(xiàng)表 ;注釋 功能:與DB功能相似,但它是用來(lái)定義字而不是字節(jié)的。其數(shù)據(jù)項(xiàng)表可以是以下形式。,4.2 常用的偽指令,3DD偽指令 格式:變量名 DB 數(shù)據(jù)項(xiàng)表 ;注釋 功能:與前兩條指令相似,它是雙字(4個(gè)字節(jié))變量的定義偽指令。它的數(shù)據(jù)項(xiàng)表可以有以下形式。 以雙字為單位的常量,不確定常量用“?”表示以及由操 作符DUP給出的重復(fù)子句; 若定義的是地址表達(dá)式時(shí),它將把偏移地址與段地址分別 存放在存儲(chǔ)器的低字與高字中; 單引號(hào)引起的14個(gè)字符組成的串常量; 以上情況的任意組合。,4.2 常用的偽指令,4.2.3 標(biāo)號(hào)定義偽指令LABEL LABEL偽指令用來(lái)給某一變量或標(biāo)號(hào)賦予一個(gè)新的類型。 格式:名稱 LABEL 類型 其中名稱是一個(gè)標(biāo)識(shí)符,可以是一個(gè)標(biāo)號(hào)或變量名。 通常與指令語(yǔ)句或用DB、DW、DD數(shù)據(jù)定義偽指令語(yǔ)句連用。這時(shí),名稱就為與之連用的標(biāo)號(hào)或變量建立一個(gè)新的變量或標(biāo)識(shí)符名,以便補(bǔ)充或設(shè)置與之連用的指令或變量的類型屬性。 因此,這個(gè)偽指令的名稱同樣有段、偏移量和類型3個(gè)屬性。當(dāng)與指令連用,類型屬性分為NEAR和FAR;當(dāng)與變量連用,類型屬性就分為BYTE、WORD和DWORD等。它的段偏移量和與之連用的指令或變量相同。,4.2 常用的偽指令,4.2.4 段定義偽指令 8086/8088匯編語(yǔ)言程序是分段編寫(xiě)的。段定義偽指令指示匯編程序如何按段組織程序和使用存儲(chǔ)器。 1SEGMENT和ENDS偽指令 格式: 段名 SEGMENT 定位類型組合類型“類別” ;段體 段名 ENDS 其中段名是程序員為該段取的名字,是滿足匯編語(yǔ)言命名規(guī)則的字符 串。定位類型、組合類型和類別用于說(shuō)明該段的屬性,可以缺省。 功能:偽指令SEGMENT 與ENDS用于把程序分成若干邏輯段。這些邏輯段 根據(jù)其用途的不同分為代碼段、數(shù)據(jù)段、堆棧段和附加段。,4.2 常用的偽指令,2ASSUME偽指令 格式:ASSUME 段寄存器:段名 ,段寄存器:段名 功能:該偽指令用于告知匯編程序源程序中定義的各段與段寄存器之間的對(duì)應(yīng)關(guān)系,即CS、DS、SS或ES被對(duì)應(yīng)到程序員定義的哪些段,從而在匯編時(shí)能知道語(yǔ)句中引用的變量、標(biāo)號(hào)或表達(dá)式所應(yīng)屬于哪段。例如例4.1中的語(yǔ)句: ASSUME CS:CSEG,SS:SSEG,DS:DSEG 即是用來(lái)聲明CSEG為代碼段、SSEG為堆棧段、DSEG為數(shù)據(jù)段。,4.2 常用的偽指令,3.程序計(jì)數(shù)器$ 字符$在匯編語(yǔ)言里作為程序計(jì)數(shù)指針,它的值為程序中下一個(gè)即將分配的存儲(chǔ)單元的偏移地址。例如: DSEG SEGMENT D1 DW 1234H,2345H,3456H;定義3個(gè)字 CT EQU $-D1 ;符號(hào)CT與表達(dá)式$-D1等價(jià) DSEG ENDS 其中表達(dá)式$-D1的值為程序下一個(gè)所能分配的偏移地址06H減去D1的偏移地址00H,即CT=$-D1=06H-00H=06H,為分配存儲(chǔ)單元的個(gè)數(shù)(以字節(jié)為單位)。,4.2 常用的偽指令,4ORG偽指令 格式:ORG 表達(dá)式 功能:其后表達(dá)式的值將作為下一條變量或指令語(yǔ)句存放的偏移地址。表達(dá)式的值應(yīng)為0-65535(即0000H-FFFFH)。 例如: ORG $+100 ; 表示其后的指令或數(shù)據(jù)跳過(guò)100 個(gè)字節(jié)存放,4.2 常用的偽指令,4.2.5 過(guò)程定義偽指令 在設(shè)計(jì)程序時(shí),往往把具有某種獨(dú)立功能的程序段設(shè)計(jì)成一個(gè)模塊,即過(guò)程。過(guò)程定義的格式如下: 過(guò)程名 PROC NEAR或FAR ;過(guò)程體 過(guò)程名 ENDP 其中過(guò)程名由程序員指定,且過(guò)程名前后必須保持一致。過(guò)程體為實(shí)現(xiàn)某種功能的指令和偽指令序列。其中NEAR代表遠(yuǎn)過(guò)程,F(xiàn)AR為近過(guò)程。參數(shù)省略時(shí)表示為近過(guò)程N(yùn)EAR。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,一個(gè)匯編語(yǔ)言源程序必須經(jīng)過(guò)編輯、匯編、連接之后才能執(zhí)行。一個(gè)完整的匯編程序從建立到執(zhí)行,一般可以分為以下幾個(gè)步驟。 (1) 用編輯程序建立匯編語(yǔ)言源程序,擴(kuò)展名必須為ASM。編輯程序可以是EDIT; (2) 用匯編程序?qū)⒃闯绦騾R編成二進(jìn)制的目標(biāo)代碼,即擴(kuò)展名為OBJ的文件; (3) 用連接程序?qū)⒛繕?biāo)文件連接成擴(kuò)展名為EXE的可執(zhí)行文件。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,4.3.1 建立ASM文件 匯編語(yǔ)言的編輯器可以是EDIT或其他文本編輯程序,通過(guò)編輯器可以建立源程序并以擴(kuò)展名ASM保存源程序。 源程序中每條語(yǔ)句占一行,為便于對(duì)源程序的修改及查錯(cuò)等,一般語(yǔ)句的標(biāo)號(hào)、助記符、操作數(shù)及注釋首字符均應(yīng)對(duì)齊。 如例4.1,假設(shè)MASM匯編程序及LINK連接程序被安裝在C:MASM,具體步驟如下。 (1)從【開(kāi)始】|【程序】菜單里找到“MS-DOS”并打開(kāi); (2)鍵入命令“CD C:MASM”并回車; (3)鍵入EDIT并回車即可編輯源文件,編輯完畢后以名4_1.asm保存源程序。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,4.3.2 生成OBJ文件 常用的匯編程序有 MASM、TASM(TURBO ASSEMBLER) 5.0等。 這兩種工具的用法基本相同,我們先以MASM匯編程序?yàn)槔齺?lái)討論根據(jù)已建立的ASM文件如何生成對(duì)應(yīng)的OBJ文件。 具體操作步驟如下。 (1) 用鼠標(biāo)移到C:MASM,即MASM.exe所在文件夾; (2) 雙擊MASM.exe,啟動(dòng)匯編程序; (3) 匯編時(shí),根據(jù)提示輸入源程序文件名4_1.asm(擴(kuò)展名可省略); (4) 根據(jù)提示,用戶需要回答3個(gè)問(wèn)題,以便生成3個(gè)文件,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,匯編過(guò)程顯示的信息及需輸入的信息,圖4.5 匯編過(guò)程顯示的信息及需輸入的信息,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,4.3.3 生成EXE文件 生成了4_1.obj文件還不能直接被計(jì)算機(jī)執(zhí)行,還需用LINK連接程序?qū)⑺B接成可執(zhí)行文件(EXE文件)。 生成EXE文件的步驟如下。 (1)在目錄C:MASM下,雙擊LINK.exe文件啟動(dòng)連接程序; (2)連接時(shí),根據(jù)提示輸入上步生成的目標(biāo)程序文件名4_1.obj (.obj可省略); (3)根據(jù)提示,用戶需回答3個(gè)問(wèn)題,以便生成3個(gè)文件。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,連接需輸入及顯示的提示信息,圖4.6 連接需輸入及顯示的提示信息,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,4.3.4 快速生成可執(zhí)行文件的方法 在用戶只需生成源文件(ASM)、目標(biāo)文件(OBJ)和可執(zhí)行文件(EXE)時(shí),可用下列命令方式來(lái)快速生成可執(zhí)行文件。 (1) 單擊【開(kāi)始】|【運(yùn)行】。 (2) 在對(duì)話框中輸入C:MASMMASM 4_1;后單擊“確定”按鈕, 完成匯編工作。運(yùn)行過(guò)程屏幕顯示如圖4.7所示。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,(3) 在對(duì)話框中輸入C:MASMLINK 4_1.obj;后單擊“確定”按鈕,完成 連接工作。,圖4.8 執(zhí)行快速連接的方法,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,4.3.5 程序的執(zhí)行和調(diào)試 1程序的執(zhí)行 由上述方法生成的可執(zhí)行文件,可以被用戶直接執(zhí)行。方法是在MS-DOS下進(jìn)入C:MASM目錄,直接輸入可執(zhí)行文件名,如4_1即可。 也可以使用類似于快速生成可執(zhí)行文件的方法,即在“運(yùn)行”對(duì)話框中輸入C:MASM 4_1即可。 2程序的調(diào)試 在匯編、連接成功后,只能說(shuō)明程序沒(méi)有語(yǔ)法錯(cuò)誤,程序執(zhí)行的結(jié)果未必正確。這時(shí)可用DEBUG對(duì)目標(biāo)程序進(jìn)行動(dòng)態(tài)調(diào)試,在執(zhí)行過(guò)程中觀察各寄存器、相關(guān)存儲(chǔ)單元及標(biāo)志寄存器的值,跟蹤執(zhí)行情況,判斷結(jié)果是否正確。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,圖4.9 debug調(diào)入程序的過(guò)程,文件調(diào)入后,可看到DEBUG命令的狀態(tài)提示符“”,此時(shí)用U命令對(duì)調(diào)入程序的機(jī)器代碼進(jìn)行反匯編,看程序是否被正確裝載;用R命令查看或修改寄存器的值;用D命令查看內(nèi)存單元的值;用G命令執(zhí)行程序,以及用T或者P命令單步逐條執(zhí)行程序。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,U( Unassemble ) 反匯編命令。 格式:- u 地址范圍或地址,功能:對(duì)指定地址范圍或地址的目標(biāo)代碼進(jìn)行反匯編,若不給出地址,則從當(dāng)前CS:IP位置開(kāi)始顯示其后32個(gè)字節(jié)的目標(biāo)代碼。例如用上述方法對(duì)4_1.exe裝入后,用U命令顯示結(jié)果,如圖4.10所示。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,R(Register) 查看和修改寄存器內(nèi)容及狀態(tài)標(biāo)志值命令 格式:- R寄存器 功能:顯示和修改指定寄存器的值,若不指定寄存器,則顯示所有寄存器的內(nèi)容。,圖4.10 U命令執(zhí)行顯示信息,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,表4-3 在DEBUG中的狀態(tài)標(biāo)志位的狀態(tài)表示符,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,D (Dump) 顯示存儲(chǔ)單元命令 格式: -d地址 -d地址范圍 功能:將指定地址或地址范圍內(nèi)的存儲(chǔ)單元的內(nèi)容顯示出來(lái)。,例如: 當(dāng)顯示指定地址內(nèi)存單元的內(nèi)容時(shí),執(zhí)行命令: -d ds:0000 當(dāng)顯示指定地址范圍的內(nèi)存單元內(nèi)容時(shí),執(zhí)行命令: -d 0000 0020 執(zhí)行該命令的結(jié)果如圖4.12所示。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,G (Go) 執(zhí)行命令 格式:-g =起始地址結(jié)束地址 功能:執(zhí)行指定地址段內(nèi)的程序,這條命令往往與U命令配合著用,比如前面用U命令觀察到程序4_1.exe調(diào)入內(nèi)存后是偏移地址從0000H開(kāi)始,001E(與INT 21對(duì)應(yīng))結(jié)束,所以可用下列命令來(lái)執(zhí)行程序: -go 0000 001E 執(zhí)行該命令的情況如圖4.13所示。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,T (Trace) 單步執(zhí)行命令 格式:-T起始地址指令條數(shù) 功能:執(zhí)行一條或多條指令,當(dāng)執(zhí)行多條指令時(shí)需在指令條數(shù)處指出。每執(zhí)行一條指令均會(huì)將各寄存器及狀態(tài)標(biāo)志位的值顯示出來(lái),這樣就可以觀察一步一步執(zhí)行指令后各寄存器的值是否正確,以達(dá)到調(diào)試的目的。執(zhí)行情況如圖4.14所示。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,P單步執(zhí)行命令 格式:P起始地址指令條數(shù) 功能:與“T”命令相似,差別在于對(duì)于P命令將CALL、INT、LOOP等指令當(dāng)成一條指令來(lái)執(zhí)行,T命令將轉(zhuǎn)入到這些指令所代表的服務(wù)子程序的內(nèi)部。所以在遇到INT或者是LOOP等指令的時(shí)候往往用P命令而不用T命令。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,4.3.6 TASM、TLINK及Turbo Debug的使用 1. TASM的使用 TASM的作用與MASM相似,均可對(duì)匯編源程序進(jìn)行匯編(編譯)。命令格式為: TASM源文件名 目標(biāo)文件名列表文件名交叉參考文件名 若用鼠標(biāo)直接雙擊TASM.EXE,只會(huì)看到其幫助信息。所以需要在DOS提示符下輸入,在DOS提示符下用命令CDC:TASMBIN進(jìn)入該目錄,然后在提示符下輸入TASM 4_1即可對(duì)源程序匯編,過(guò)程如圖4.16所示。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,圖4.16 TASM匯編源程序過(guò)程,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,2. TLINK的使用 該命令的功能與使用方法與LINK類似,但功能要比LINK強(qiáng)得多,而且它還支持386以上的指令,這是LINK不具有的功能。格式為: TLINK 目標(biāo)文件名 可執(zhí)行文件名 定位圖文件名 庫(kù)文件名 其使用方法與TASM相似,即在匯編成功生成目標(biāo)文件后即可在DOS提示符下輸入TLINK 4_1.obj即可連接生成可執(zhí)行文件。其中的擴(kuò)展名及選項(xiàng)(可執(zhí)行文件名 定位圖文件名 庫(kù)文件名)可以省略,這時(shí)連接會(huì)自動(dòng)生成4_1.exe,其過(guò)程如圖4.17所示。,4.3 匯編語(yǔ)言程序的上機(jī)過(guò)程,3.Turbo Debug 的使用 Turbo Debug是一個(gè)功能強(qiáng)大的源代碼級(jí)調(diào)試器,它可對(duì)多種語(yǔ)言編寫(xiě)成的程序進(jìn)行調(diào)試,并且支持32位的源代碼。在安裝目錄下運(yùn)行: TD 可執(zhí)行文件名 即可打開(kāi)Turbo Debug,4.4 基本編程方法,程序的基本結(jié)構(gòu)形式有3種:順序程序、分支程序和循環(huán)程序。 4.1.1 順序程序設(shè)計(jì) 1問(wèn)題分析 2確定算法并編制程序流圖 3編碼與調(diào)試,4.4 基本編程方法,4.4.2 分支程序設(shè)計(jì) 1單邊選擇程序設(shè)計(jì) 單邊選擇程序具體為二分支結(jié)構(gòu),相當(dāng)于高級(jí)語(yǔ)言中的IF-THEN-ELSE或者IF-THEN結(jié)構(gòu)。通常根據(jù)某一條件成立與否而轉(zhuǎn)向不同的分支。,圖4.20 單邊選擇程序兩種基本結(jié)構(gòu),4.4 基本編程方法,2多邊選擇程序設(shè)計(jì) 多邊選擇程序也叫多分支程序,用來(lái)判定條件有多個(gè)取值,根據(jù)條件取值不同而分別轉(zhuǎn)向不同的程序分支,如圖4.22所示。,圖4.22 多條件取值分支結(jié)構(gòu),4.4 基本編程方法,多分支程序結(jié)構(gòu)也可以由多個(gè)二分支結(jié)構(gòu)構(gòu)成,兩種結(jié)構(gòu)組合可以構(gòu)成更為復(fù)雜的多分支結(jié)構(gòu),如圖4.23所示。,圖4.23 多分支結(jié)構(gòu),4.4 基本編程方法,3用比較轉(zhuǎn)移指令實(shí)現(xiàn)分支 這種分支程序一般是實(shí)現(xiàn)兩個(gè)數(shù)的比較,使用CMP指令或者CMPS(串比較)及SCAS(串搜索)指令,然后根據(jù)條件實(shí)現(xiàn)轉(zhuǎn)移。,4.4.3 循環(huán)程序設(shè)計(jì) 循環(huán)程序的基本結(jié)構(gòu)形式可以分為兩種:一種是“先判斷后執(zhí)行”的“當(dāng)型”循環(huán),另一種是“先執(zhí)行后判斷”的“直到型”循環(huán)。,4.4 基本編程方法,在“當(dāng)型”循環(huán)中,程序先判斷循環(huán)的初始條件,如果循環(huán)初始條件滿足循環(huán)要求的話,則執(zhí)行“循環(huán)體”,否則退出循環(huán)的執(zhí)行。在“直到型”循環(huán)中,程序先執(zhí)行“循環(huán)體”,然后再判斷循環(huán)的條件,如果條件滿足循環(huán)要求的話,則繼續(xù)執(zhí)行“循環(huán)體”,否則退出循環(huán)的執(zhí)行。它們的執(zhí)行流程圖如圖4.26所示。,4.5 子程序的編程方法,在編制程序時(shí),經(jīng)常會(huì)遇到某一程序段在程序的若干不同地方多次用到,或被不同的程序用到,這些程序段少則幾條,多則幾十條、幾百條。如果在每處都用到的地方都重復(fù)地寫(xiě)一遍,這樣既浪費(fèi)編程時(shí)間,也浪費(fèi)存儲(chǔ)空間。因此可將這段程序抽取出來(lái)編成一個(gè)獨(dú)立的程序,當(dāng)需要執(zhí)行這段程序時(shí),就去調(diào)用它。人們稱調(diào)用它的那個(gè)程序?yàn)橹鞒绦蚧蛘{(diào)用程序,稱被調(diào)用的程序?yàn)樽映绦蚧蜻^(guò)程。 在設(shè)計(jì)一個(gè)比較復(fù)雜的程序時(shí),為使程序清晰、易維護(hù),可以根據(jù)程序完成的主要功能,將程序劃分成幾個(gè)可獨(dú)立匯編的程序單元,我們把這些程序單元稱為模塊。子程序或過(guò)程是模塊化程序設(shè)計(jì)的主要手段,4.5 子程序的編程方法,4.5.1 子程序設(shè)計(jì) 過(guò)程定義偽操作用在過(guò)程的前后,使整個(gè)過(guò)程形成清晰的、具有特定功能的代碼塊。其格式為: 過(guò)程名稱 PROC 屬性 過(guò)程體內(nèi)語(yǔ)句 過(guò)程名稱 ENDP,過(guò)程的正確執(zhí)行是由過(guò)程的正確調(diào)用和正確返回保證的。 (1) 過(guò)程的調(diào)用語(yǔ)句 格式:CALL 屬性 被調(diào)過(guò)程名 (2) 過(guò)程的返回語(yǔ)句 格式:RET ,4.5 子程序的編程方法,4.5.2 過(guò)程的參數(shù)傳遞 程序在調(diào)用子程序時(shí)經(jīng)常需要傳送一些參數(shù)給子程序,子程序運(yùn)行完后也經(jīng)常要回送一些信息給調(diào)用程序。這種調(diào)用程序和子程序之間的信息傳送稱為參數(shù)傳送。 如果過(guò)程的調(diào)用語(yǔ)句與過(guò)程處于同一模塊中,包括它們處于同一代碼段、不同代碼段,兩種情況均可以共用主程序的數(shù)據(jù)段中所說(shuō)明的變量,此時(shí)主程序中定義的變量名雖然是局部變量,但可在整個(gè)程序模塊中起作用。 如果過(guò)程的調(diào)用語(yǔ)句與過(guò)程在不同的程序模塊中。 常用的參數(shù)傳遞方法有: 約定寄存器法 約定存儲(chǔ)單元法及 堆棧法,4.5 子程序的編程方法,1約定寄存器法 通過(guò)寄存器進(jìn)行參數(shù)傳遞又稱為約定寄存器法。這對(duì)于參數(shù)個(gè)數(shù)不多的情況下,只需在調(diào)用過(guò)程前將過(guò)程所需要的有關(guān)參數(shù)傳送給某幾個(gè)通用寄存器,然后調(diào)用過(guò)程。 2約定存儲(chǔ)單元法 約定存儲(chǔ)單元法是事先約定某些存儲(chǔ)單元進(jìn)行參數(shù)傳遞。其優(yōu)點(diǎn)是每個(gè)子程序要處理的數(shù)據(jù)或送出的處理結(jié)果都有獨(dú)立的存儲(chǔ)單元,參數(shù)傳遞個(gè)數(shù)不受限制。但要占用一定數(shù)量的存儲(chǔ)單元。該法適用于參數(shù)傳遞較多的情況。 3偽指令EXTRN、PUBLIC的使用 在主程序和過(guò)程所在的程序模塊分別設(shè)置一個(gè)具有相同存儲(chǔ)區(qū)分配的公用數(shù)據(jù)段進(jìn)行參數(shù)傳遞。,4.5 子程序的編程方法,4用寄存器傳送參數(shù)地址表的地址 這個(gè)方法實(shí)質(zhì)是約定寄存器法的一種改進(jìn)。在約定寄存器法中,由于寄存器數(shù)量的限制,當(dāng)參數(shù)的個(gè)數(shù)較多時(shí),尤其是數(shù)組類型的參數(shù),沒(méi)有足夠的寄存器使用,這時(shí),可以先將參數(shù)的地址組成一個(gè)數(shù)組,形成參數(shù)地址表,然后只需將此表的地址偏移量傳送給一個(gè)寄存器,通過(guò)寄存器把地址傳送給過(guò)程。 5用堆棧傳送參數(shù) 子程序(過(guò)程)中所要處理的數(shù)據(jù)可以由寄存器或存儲(chǔ)單元來(lái)傳遞。但是用寄存器傳遞,經(jīng)常需要保護(hù)主程序中寄存器的內(nèi)容返回時(shí)再恢復(fù),對(duì)系統(tǒng)數(shù)據(jù)流的控制是不方便的,時(shí)間也不經(jīng)濟(jì)。將數(shù)據(jù)放在存儲(chǔ)區(qū)中也影響了存儲(chǔ)空間的利用率,因?yàn)橛械闹恍钑簳r(shí)保留,而采用堆??梢噪S時(shí)存放和刪除一些臨時(shí)性的數(shù)據(jù)。用堆棧傳遞參數(shù)特別適用于參數(shù)較多、子程序有嵌套和遞歸調(diào)用的情況。,4.6 其他類程序,【例4.16】 從鍵盤(pán)輸入一字符串存放在以BUF+2開(kāi)始的存儲(chǔ)單元中,現(xiàn)要求將字符串傳送到以BUF+10開(kāi)始的存儲(chǔ)單元,存儲(chǔ)區(qū)有重疊,試編此程序。 程序如下: DATA SEGMENT BUF DB 50 ;計(jì)劃輸入的最大字符數(shù) DB ? ;實(shí)際輸入的字符數(shù) DB 50 DUP(?) DATA ENDS STAC SEGMENT PARA STACK STACK DB 100 DUP(0) STAC ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STAC,4.6 其他類程序,START PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX MOV DX,OFFSET BUF ;利用DOS 10號(hào)功能調(diào)用鍵入字符串 MOV AH,10 INT 21H LEA SI,BUF+2 ;取鍵盤(pán)輸入的第一個(gè)字符 LEA DI,BUF+10 MOV CL,BUF+1 ;要取的字符數(shù) MOV CH,0 CLD PUSH SI,4.6 其他類程序,ADD SI,CX DEC SI CMP SI,DI ;源串的末地址與目的串首址比較 POP SI JL INM ;小于無(wú)重疊,否則有重疊,要從末地址開(kāi)始傳送 STD ADD SI,CX DEC SI ADD DI,CX DEC DI INM: REP MOVSB RET START ENDP CODE ENDS END START,4.6 其他類程序,【例4.17】 以BUF開(kāi)始的存儲(chǔ)單元內(nèi)存放有10個(gè)十六進(jìn)制數(shù)的ASCII編碼,請(qǐng)將它們轉(zhuǎn)換成相應(yīng)的十六進(jìn)制數(shù)并存放在以BUF1開(kāi)始的5個(gè)字節(jié)單元中。 程序如下: DATA SEGMENT BUF DB 30H,3FH,41H,45H,5AH DB 50H,47H,39H,34H,53H BUF1 DB 5 DUP(?) DATA ENDS SSEG SEGMENT PARA STACK STACK DB 100H DUP(0) SSEG ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:SSEG MAIN PROC FAR PUSH DS MOV AX,0,4.6 其他類程序,PUSH AX MOV AX,DATA MOV DS,AX MOV DI,OFFSET BUF1 MOV BX,OFFSET BUF MOV CH,5 AGAIN: MOV AL,BX ;取第一個(gè)數(shù) CALL CONVE MOV DL,AL INC BX MOV AL,BX ;取第二個(gè)數(shù) CALL CONVE MOV CL,4 SHL AL,CL OR AL,DL,4.6 其他類程序,MO

溫馨提示

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