已閱讀5頁,還剩96頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第7章 匯編語言程序設(shè)計,匯編語言是一種以處理器指令系統(tǒng)為基礎(chǔ)的低級程序設(shè)計語言,它采用助記符表達(dá)指令操作碼,采用標(biāo)識符號表示指令操作數(shù) 利用匯編語言編寫程序的主要優(yōu)點是可以直接、有效地控制計算機硬件,因而容易創(chuàng)建代碼序列短小、運行快速的可執(zhí)行程序 在有些應(yīng)用領(lǐng)域,匯編語言的作用是不容置疑和無可替代的 匯編程序設(shè)計的過程是與其他高級語言程序設(shè)計大致相同,第7章:教學(xué)重點,匯編語言源程序格式(程序結(jié)構(gòu)) 匯編語言常用偽指令的使用方法 常量、變量和標(biāo)號 匯編語言程序設(shè)計方法 順序程序設(shè)計 分支程序設(shè)計 循環(huán)程序設(shè)計 子程序設(shè)計,7.1 匯編語言程序結(jié)構(gòu),匯編語言源程序是由語句序列組成的,語句序列應(yīng)包括: 數(shù)據(jù)(程序要處理的對象); 處理數(shù)據(jù)的實體(程序); 承上啟下的記錄。 8086/8088 匯編語言程序必須具備: 代碼段(處理數(shù)據(jù)的對象) 數(shù)據(jù)段(定義加工處理對象) 堆棧段,標(biāo)準(zhǔn)匯編語言程序框架,定義堆棧段 STACK_SEG SEGMENT PARA STACK STACK ;定義堆棧深度與堆棧段變量 STACK_SEG ENDS 定義數(shù)據(jù)段 DATA_SEG SEGMENT PARA PUBLIC DATA ;定義變量 DATA_SEG ENDS,data1 db 32h, 38h, 30h, 36h, 37h,$ data2 db 33h, 35h, 33h, 38h, 32h, $,sta db 100 dup (?),通常,一個源程序都有大體相同的結(jié)構(gòu)或框架,下面給出一個源程序的框架結(jié)構(gòu),該程序是在PC-DOS環(huán)境下運行的。,定義代碼段 CODE_SEG SEGMENT PARA PUBLIC CODE MAIN PROC FAR ASSUME CS:CODE_SEG, DS:DATA_SEG ASSUME SS:STACK_SEG START: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA_SEG MOV DS,AX ;主過程內(nèi)容 RET MAIN ENDP PROC_A PROC NEAR ;子過程A內(nèi)容,A為主過程調(diào)用 PROC_A ENDP ;其他過程內(nèi)容 CODE_SEG ENDS END START,1 匯編語言源程序格式,完整的匯編語言源程序由段組成 一個匯編語言源程序可以包含若干個代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列 需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點 所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi) 通常,程序還需要一個堆棧段,源程序由語句序列構(gòu)成,1. 匯編語言的語句的類型和組成,執(zhí)行性語句執(zhí)行性語句用于表達(dá)處理器指令(也稱為硬指令),匯編后對應(yīng)一條指令代碼。由處理器指令組成的代碼序列是程序設(shè)計的主體 標(biāo)號: 硬指令助記符 操作數(shù),操作數(shù) ;注釋 說明性語句說明性語句用于表達(dá)偽指令,指示源程序如何匯編、變量怎樣定義、過程怎么設(shè)置等 名字 偽指令助記符 參數(shù),參數(shù), ;注釋,2. 硬指令與偽指令,硬指令(Instruction)使CPU產(chǎn)生動作、并在程序執(zhí)行時才處理的指令 硬指令就是第6章學(xué)習(xí)的處理器指令,與具體的處理器有關(guān)、與匯編程序無關(guān) 偽指令(Directive)不產(chǎn)生CPU動作、在程序執(zhí)行前由匯編程序處理的說明性指令 偽指令與具體的處理器類型無關(guān),但與匯編程序有關(guān)。不同版本的匯編程序支持不同的偽指令,硬指令和偽指令采用易于記憶的符合表達(dá),這就是助記符,3. 標(biāo)號、名字與標(biāo)識符,標(biāo)號是反映硬指令位置(邏輯地址)和屬性的標(biāo)識符,后跟一個冒號分隔 名字是反映偽指令位置(邏輯地址)和屬性的標(biāo)識符,后跟空格或制表符分隔,沒有冒號 標(biāo)識符(Identifier)一般最多由31個字母、數(shù)字及規(guī)定的特殊符號(如 _、$、?、)組成,不能以數(shù)字開頭。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識符中的字母大小寫 一個源程序中,每個標(biāo)識符的定義是唯一的,還不能是匯編語言采用的保留字,名字和標(biāo)號的屬性,名字和標(biāo)號是用戶自定義的標(biāo)識符。名字指向一條偽指令,標(biāo)號指向一條硬指令。名字和標(biāo)號一經(jīng)使用便具有兩類屬性: 邏輯地址名字和標(biāo)號對應(yīng)存儲單元的邏輯地址,含有段地址和偏移地址; 類型變量名的類型可以是BYTE(字節(jié))、WORD(字)和DWORD(雙字)等;標(biāo)號、段名、子程序名的類型可以是NEAR(近)和FAR(遠(yuǎn)),分別表示段內(nèi)或段間調(diào)用 匯編程序提供有關(guān)的操作符,以便獲取這些屬性值,地址操作符,地址操作符取得名字或標(biāo)號的段地址和偏移地址,類型操作符,類型操作符對名字或標(biāo)號的類型屬性進(jìn)行設(shè)置 類型名 PTR 名字/標(biāo)號 其中可以是BYTE、WORD、DWORD(依次表示字節(jié)、字、雙字)等,或者是NEAR、FAR(分別表示近、遠(yuǎn)),還可以是由結(jié)構(gòu)、記錄等定義的類型 對變量: LENGTH 操作符獲知某變量名指向多少個數(shù)據(jù)項 SIZE 操作符獲知它共占用多少字節(jié)空間,4. 保留字,保留字(Reserved Word)是匯編程序已經(jīng)利用的標(biāo)識符(也稱為關(guān)鍵字),主要有: 硬指令助記符例如:MOV、ADD 偽指令助記符例如:DB、DW 操作符例如:OFFSET、PTR 寄存器名例如:AX、CS 預(yù)定義符號例如:data,匯編語言大小寫不敏感,5. 操作數(shù)和參數(shù),處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲單元 偽指令的參數(shù)可以是常數(shù)、變量名、表達(dá)式等,可以有多個,參數(shù)之間用逗號分隔,6. 注釋,語句中由分號“;”開始的部分為注釋內(nèi)容,用以增加源程序的可讀性 必要時,一個語句行也可以由分號開始作為階段性注釋 匯編程序在翻譯源程序時將跳過該部分,不對它們做任何處理,8. 分隔符,語句的4個組成部分要用分隔符分開 標(biāo)號后用冒號,注釋前用分號 操作數(shù)之間和參數(shù)之間使用逗號分隔 其他部分通常采用空格或制表符 多個空格和制表符的作用與一個相同 MASM支持續(xù)行符 “”,例1 : 在屏幕上顯示一段信息,;數(shù)據(jù)段(定義要顯示的字符串) string dbHello, Assembly !,0dh,0ah,$ ;代碼段(顯示字符串的程序) mov dx,offset string mov ah,9 int 21h,Hello, Assembly !,7.2 常量、變量和標(biāo)號,匯編語言的數(shù)據(jù)可以簡單分為常量和變量 常量可以作為硬指令的立即數(shù)或偽指令的參數(shù) 變量主要作為存儲器操作數(shù) 匯編語言語句中的名字和標(biāo)號具有邏輯地址和類型屬性,主要用做地址操作數(shù),也可以作為立即數(shù)和存儲器操作數(shù),7.2.1 常量,常量表示一個固定的數(shù)值,它又分成多種形式 常數(shù) 字符串 符合常量 數(shù)值表達(dá)式,1. 常數(shù),指由10、16、2和8進(jìn)制形式表達(dá)的數(shù)值,各種進(jìn)制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù),2. 字符串,字符串常量是用單引號或雙引號括起來的單個字符或多個字符 其數(shù)值是每個字符對應(yīng)的ASCII碼值 例如: d(等于64H) AB(等于4142H) Hello, Assembly !,3. 符號常量,符號常量使用標(biāo)識符表達(dá)一個數(shù)值 符號定義偽指令有“等價EQU”和“等號”: 符號名 EQU 數(shù)值表達(dá)式 符號名 數(shù)值表達(dá)式 EQU用于數(shù)值等價時不能重復(fù)定義符號名,但“”允許有重復(fù)賦值。例如: X = 7 ;等效于:X qeu 7 X = X+5 ;“X EQU X+5”是錯誤的,4. 數(shù)值表達(dá)式,數(shù)值表達(dá)式一般是指由運算符連接的各種常量所構(gòu)成的表達(dá)式 匯編程序在匯編過程中計算表達(dá)式,最終得到一個確定的數(shù)值,所以也是常量 表達(dá)式的數(shù)值在程序運行前的匯編階段計算,所以組成表達(dá)式的各部分必須在匯編時就能確定 匯編語言支持多種運算符(表3.4) 我們經(jīng)常使用的是加減乘除( * / ) 例如: mov ax,3*4+5 ;等價于:mov ax,17,運算符,1. 算術(shù)運算符: 加減乘除( * / ) 2. 取值運算符: SEG、OFFSET、TYPE、SIZE和LENGTH 3. 屬性運算符 PTR,地址操作符,地址操作符取得名字或標(biāo)號的段地址和偏移地址,類型操作符,類型操作符對名字或標(biāo)號的類型屬性進(jìn)行設(shè)置 類型名 PTR 名字/標(biāo)號 其中可以是BYTE、WORD、DWORD(依次表示字節(jié)、字、雙字)等,或者是NEAR、FAR(分別表示近、遠(yuǎn)),還可以是由結(jié)構(gòu)、記錄等定義的類型 對變量: LENGTH 操作符獲知某變量名指向多少個數(shù)據(jù)項 SIZE 操作符獲知它共占用多少字節(jié)空間,7.2.2 變量,變量實質(zhì)上是指內(nèi)存單元的數(shù)據(jù),雖然內(nèi)存單元地址不變,但其中存放的數(shù)據(jù)可以改變 變量需要事先定義才能使用 變量定義(Define)偽指令為變量申請固定長度為單位的存儲空間,并可以同時將相應(yīng)的存儲單元初始化 定義后的變量可以利用變量名等方法引用其中的數(shù)據(jù),即變量的數(shù)值,1. 變量的定義,變量定義的匯編語言格式為: 變量名 偽指令 初值表 變量名為用戶自定義標(biāo)識符,表示初值表首元素的邏輯地址,常稱為符號地址。變量名也可以沒有 初值表是用逗號分隔的參數(shù),主要由常量、數(shù)值表達(dá)式或“?”組成。其中“?”表示未賦初值 多個存儲單元如果初值相同,可以用復(fù)制操作符DUP進(jìn)行定義: 重復(fù)次數(shù) DUP(重復(fù)參數(shù)) 變量定義偽指令有DB、DW、DD等,字節(jié)變量的定義DB(Define Byte),DB偽指令用于分配一個或多個字節(jié)單元,并可以將它們初始化為指定值 初值表中每個數(shù)據(jù)一定是字節(jié)量,存放一個8位數(shù)據(jù): 可以是0255的無符號數(shù) 或是128127帶符號數(shù) 也可以是字符串常數(shù),實例,字節(jié)變量定義實例,;數(shù)據(jù)段 X db a,-5 db 2 dup(100),? Y db ABC,應(yīng)用,字節(jié)變量的應(yīng)用,mov al,X ;此處X表示它的第1個數(shù)據(jù),故ALa dec X+1 ;對X為始的第2個數(shù)據(jù)減1,故成為6 mov Y,al ;現(xiàn)在Y這個字符串成為 aBC,字變量的定義DW(Define Word),DW偽指令用于分配一個或多個字單元,并可以將它們初始化為指定值 初值表中每個數(shù)據(jù)是字量,一個字單元可用于存放任何16位數(shù)據(jù): 一個段地址 一個偏移地址 兩個字符 065535之間的無符號數(shù) 3276832767之間的帶符號數(shù),字變量定義實例,;數(shù)據(jù)段 count dw 8000h,?,AB maxint equ 64h number dw maxint array dw maxint dup(0),雙字變量的定義DD(Define Double word),DD偽指令用于分配一個或多個雙字單元,并可以將它們初始化為指定值 初值表中每個數(shù)據(jù)是一個32位的雙字量: 可以是有符號或無符號的32位整數(shù) 也可以用來表達(dá)16位段地址(高位字)和16位的偏移地址(低位字)的遠(yuǎn)指針 vardd DD 0,?,12345678h farpoint DD 00400078h,2. 變量的應(yīng)用,變量具有存儲單元的邏輯地址 程序代碼中 通過變量名引用其指向的首個數(shù)據(jù) 通過變量名加減位移量存取以首個數(shù)據(jù)為基地址的前后數(shù)據(jù),例2 變量的定義,;數(shù)據(jù)段 bvar1 db 100,01100100b,64h,d ;字節(jié)變量:不同進(jìn)制表達(dá)同一個數(shù)值,內(nèi)存中有4個64H minint = 5 ;符號常量:minint數(shù)值為5,不占內(nèi)存空間 bvar2 db -1,minint,minint+5 ;內(nèi)存中數(shù)值依次為FFH,5,0AH db ?,2 dup(20h) ;預(yù)留一個字節(jié)空間,重復(fù)定義了2個數(shù)值20H wvar1 dw 2010h,4*4 ;字變量:兩個數(shù)據(jù)是2010H、0010H,共占4個字節(jié) wvar2 dw ? ;wvar2是沒有初值的字變量,例2 變量的定義(續(xù)),dvar dd 12347777h,87651111h,? ;雙字變量:2個雙字?jǐn)?shù)據(jù),一個雙字空間 abc db a,b,c,? ;定義字符,實際是字節(jié)變量 maxint equ 0ah ;符號常量:maxint10 string db ABCDEFGHIJ ;定義字符串:使用字節(jié)定義DB偽指令 crlfs db 13,10,$ ;回車符0DH、換行符0AH和字符$24H array1 dw maxint dup(0) ;10個初值為0的字量,可以認(rèn)為是數(shù)組 array db 2 dup(2,3,2 dup(4) ;6個字節(jié)內(nèi)容依次為:02 03 04 04 02 03 04 04,例2 變量的應(yīng)用,;代碼段 mov dl,bvar1 ;DL100 dec bvar2+1 ;bvar2+14 mov abc3,dl ;abcabcd mov ax,word ptr dvar0 ;取雙字到DX.AX mov dx,word ptr dvar2 add ax,word ptr dvar4 ;加雙字到DX.AX adc dx,word ptr dvar6 mov word ptr dvar8,ax ;保存雙字的求和結(jié)果 mov word ptr dvar10,dx,例2 變量的應(yīng)用(續(xù)),mov cx,maxint ;CX10 mov bx,0 ;BX0 again: add stringbx,3 ;string每個數(shù)值加3 inc bx loop again ;循環(huán) lea dx,abc ;從abc開始 mov ah,9 ;09H號DOS功能調(diào)用 int 21h ;顯示結(jié)果:abcdDEFGHIJKLM,3. 變量的定位,匯編程序按照指令的先后順序一個接著一個分配存儲空間,按照段定義偽指令規(guī)定的邊界定位屬性確定每個邏輯段的起始位置(包括偏移地址) 定位偽指令ORG控制數(shù)據(jù)或代碼所在的偏移地址 ORG 參數(shù) ORG偽指令是將當(dāng)前偏移地址指針指向參數(shù)表達(dá)的偏移地址。例如: ORG 100h ;從100H處安排數(shù)據(jù)或程序 ORG $+10 ;偏移地址加10,即跳過10個字節(jié)空間 匯編語言程序中,符號“$”表示當(dāng)前偏移地址值,定義數(shù)據(jù)偽指令DB、DW、DD、DQ、DT 符號定義偽指令EQU、= 段定義偽指令SEGMENT和ENDS 設(shè)定段寄存器偽指令A(yù)SSUME 定義過程的偽指令PROC和ENDP 宏指令MACRO 定位偽指令ORG 匯編結(jié)束偽指令END,7.3 匯編語言偽指令,1. 定義數(shù)據(jù)偽指令,該類偽指令用來定義存儲空間及其所存數(shù)據(jù)的長度。 DB:定義字節(jié),即每個數(shù)據(jù)是1個字節(jié)。 DW:定義字,即每個數(shù)據(jù)占1個字(2個字節(jié))。 DD:定義雙字,即每個數(shù)據(jù)占2個字。低字部分在低地址,高字部分在高地址。 DQ:定義4字長,即每個數(shù)據(jù)占4個字。 DT:定義10個字節(jié)長,用于壓縮式十進(jìn)制數(shù), 例如:DATA1 DB 5,6,8,100 DATA2 DW 7,287 TABLE DB ? ;表示在TABLE單元中存放的內(nèi)容是隨機的,當(dāng)一個定義的存儲區(qū)內(nèi)的每個單元要放置同樣的數(shù)據(jù)時,可用DUP操作符。 一般格式:COUNT DUP(?), COUNT 為重復(fù)的次數(shù),“( )”中為要重復(fù)的數(shù)據(jù)。 如:BUFFER DB 100DUP(0) ;表示以BUFFER為首地址的100個字節(jié)中存放00H數(shù)據(jù) BUFFER1 DB 100 DUP(3,5,2DUP(10),35),24,NUM,2. 符號定義偽指令,EQU 偽指令給符號定義一個值。在程序中,凡是出現(xiàn)該符號的地方,匯編時均用其值代替, 如:TIMES EQU 50 DATA DB TIMES DUP(?) 上述兩個語句實際等效于如下一條語句: DATA DB 50 DUP(?) “=”偽指令可給初始變量賦值。 如:COUNT=100 ;COUNT=100 TIME=50 ;TIME=50 PURGE偽指令用于釋放由EQU偽指令定義的變量,使這些變量可以被重新定義。 PURGE TIMES ; 釋放TIMES變量 TIMES EQU 2 ; 重新定義,3. 段定義偽指令,SEGMENT和ENDS 一般來說,一個完整的匯編源程序由3個段組成,即堆棧段、數(shù)據(jù)段和代碼段。段定義偽指令可將源程序劃分成若干段,以便生成目的代碼和連接時將各同名段進(jìn)行組合。 段定義偽指令一般格式為 : 段名 SEGMENT 定位類型 組合類型 類別 段名 ENDS SEGMENT和ENDS應(yīng)成對使用,缺不可。 其中段名是不可省略的。其它是可選項,是賦予段名的屬性,可以省略。 例如: DATA SEGMENT DW 20 DUP(?) DATA ENDS,4.設(shè)定段寄存器偽指令A(yù)SSUME,一般格式: ASSUME 段寄存器:段名,段寄存器:段名, 功能:通知匯編程序,哪一個段寄存器是該段的段寄存器,如CODE表示代碼段,DATA表示數(shù)據(jù)段,STACK表示堆棧段。 例如: CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送AX MOV DS,AX ;AX內(nèi)容送DS,DS才有實際段值 CODE ENDS,5.定義過程的偽指令PROC和ENDP,在程序設(shè)計中,可將具有一定功能的程序段看成為一個過程(相當(dāng)于一個子程序),它可以被別的程序調(diào)用。 格式: 過程名 PROC 類型 過程體 RET 過程名 ENDP,CODE1 SEGMENT ASSUME CS:CODE1 FARPROC PROC FAR RET FARPROC ENDP CODE1 ENDS CODE2 SEGMENT ASSUME CS:CODE2 CALL FAR PROC CODE2 ENDS CODE1 段中的FAR PROC 過程被另一段CODE2調(diào)用,故為遠(yuǎn)過程。,例:,6. ORG 偽指令,ORG偽指令規(guī)定了在某一段內(nèi),程序或數(shù)據(jù)代碼存放的起始偏移地址。 格式: ORG 例如:DATA SEGMENT BUFF1 DB 23,56H,EOF ORG 2000H BUFF2 DB STRING DATA ENDS 上述變量定義中,BUFF1從DATA段偏移地址為0的單元開始存放,而BUFF2則從DATA段偏移為2000H的單元開始存放,兩者不是連續(xù)存放。,7. 匯編結(jié)束偽指令END,該偽指令表示源程序的結(jié)束令匯編程序停止匯編。因此,任何一個完整的源程序均應(yīng)有END指令。 格式: END 表達(dá)式 其中表達(dá)式表示該匯編程序的啟動地址。 例如: END START ;表明該程序的啟動地址為START。,7.4 匯編程序設(shè)計,簡單程序設(shè)計 分支程序設(shè)計 循環(huán)程序設(shè)計 子程序設(shè)計,1. 順序程序設(shè)計,沒有分支、循環(huán)等轉(zhuǎn)移指令的程序,會按指令書寫的前后順利依次執(zhí)行,這就是順序程序 順序結(jié)構(gòu)是最基本的程序結(jié)構(gòu) 完全采用順序結(jié)構(gòu)編寫的程序并不多見,例題4 順序程序設(shè)計實例 采用查表法,實現(xiàn)一位16進(jìn)制數(shù) 轉(zhuǎn)換為ASCII碼顯示,例4 數(shù)據(jù)段,;數(shù)據(jù)段 ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h ;對應(yīng)0 9的ASCII碼 db 41h,42h,43h,44h,45h,46h ;對應(yīng)A F的ASCII碼 hex db 04h,0bh ;假設(shè)兩個數(shù)據(jù),例4 代碼段,;代碼段 mov bx,offset ASCII ;BX指向ASCII碼表 mov al,hex ;AL取得一位16進(jìn)制數(shù),恰好就是ASCII碼表中的位移 and al,0fh ;只有低4位是有效的,高4位清0 Xlat ;換碼:ALDS:BXAL mov dl,al ;入口參數(shù):DLAL mov ah,2 ;02號DOS功能調(diào)用 int 21h ;顯示一個ASCII碼字符 mov al,hex+1 ;轉(zhuǎn)換并顯示下一個數(shù)據(jù) and al,0fh xlat mov dl,al mov ah,2 int 21h,XLAT,2. 分支程序設(shè)計,分支程序根據(jù)條件是真或假決定執(zhí)行與否 判斷的條件是各種指令,如CMP、TEST等執(zhí)行后形成的狀態(tài)標(biāo)志 轉(zhuǎn)移指令Jcc和JMP可以實現(xiàn)分支控制 分支結(jié)構(gòu)有 單分支結(jié)構(gòu) 雙分支結(jié)構(gòu) 多分支結(jié)構(gòu),單分支結(jié)構(gòu),條件成立跳轉(zhuǎn),否則順序執(zhí)行分支語句體 注意選擇正確的條件轉(zhuǎn)移指令和轉(zhuǎn)移目標(biāo)地址,實例:求絕對值,計算AX中有符號數(shù)的絕對值,cmp ax,0 jge nonneg ;條件滿足(AX0),轉(zhuǎn)移 neg ax ;條件不滿足,求補 nonneg: mov result,ax ;條件滿足,;不恰當(dāng)?shù)姆种?cmp ax,0 jl yesneg ;條件滿足(AX0),轉(zhuǎn)移 jmp nonneg yesneg: neg ax ;條件不滿足,求補 nonneg: mov result,ax ;條件滿足,雙分支結(jié)構(gòu),條件成立跳轉(zhuǎn)執(zhí)行第2個分支語句體,否則順序執(zhí)行第1個分支語句體 注意第1個分支體后一定要有一個JMP指令跳到第2個分支體后,實例:顯示BX的最高位,例:顯示BX的最高位,shl bx,1 ;BX最高位移入CF標(biāo)志 jc one ;CF1,即最高位為1,轉(zhuǎn)移 mov dl,30h ;CF0,即最高位為0:DL30H0 jmp two ;一定要跳過另一個分支體 one: mov dl,31h ;DL 31H1 two: mov ah,2 int 21h ;顯示,可以用JNC替換JC,顯示BX的最高位(續(xù)),shl bx,1 ;BX最高位移入CF標(biāo)志 jnc one ;CF0,即最高位為0,轉(zhuǎn)移 mov dl,31h ;CF1,即最高位為1:DL31H1 jmp two ;一定要跳過另一個分支體 one: mov dl,30h ;DL 30H0 two: mov ah,2 int 21h ;顯示,例5. 顯示壓縮BCD碼,無前導(dǎo)0,;數(shù)據(jù)段 BCD db 04h ;代碼段 mov dl,BCD test dl,0ffh ;如果BCD碼為0,顯示0 jz zero ;雙分支結(jié)構(gòu) test dl,0f0h ;如果BCD碼高位為0,不顯示0 jz one ;單分支結(jié)構(gòu),顯示壓縮BCD碼,無前導(dǎo)0(續(xù)),mov cl,4 ;處理高位 shr dl,cl or dl,30h ;轉(zhuǎn)換為ASCII碼 mov ah,2 ;顯示高位 int 21h mov dl,BCD and dl,0fh one: or dl,30h ;處理低位 jmp two zero: mov dl,0 two: mov ah,2 int 21h,例6: 大小寫字母轉(zhuǎn)換,;如果DL是一個小寫字母,則轉(zhuǎn)換為大寫 cmp dl,a ;小于小寫字母a,不需要處理 jb disp cmp dl,z ;大于小寫字母z,也不需要處理 ja disp sub dl,20h ;是小寫字母,則轉(zhuǎn)換為大寫 disp: ,轉(zhuǎn)換原理,多分支結(jié)構(gòu),多分支結(jié)構(gòu)是多個條件對應(yīng)各自的分支語句體,哪個條件成立就轉(zhuǎn)入相應(yīng)分支體執(zhí)行,or ah,ah ;cmp ah,0 jz function0 dec ah ;cmp ah,1 jz function1 dec ah ;cmp ah,2 jz function2,3. 循環(huán)程序設(shè)計,循環(huán)程序結(jié)構(gòu)是滿足一定條件的情況下,重復(fù)執(zhí)行某段程序 循環(huán)結(jié)構(gòu)的程序通常有3個部分: 循環(huán)初始部分為開始循環(huán)準(zhǔn)備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的數(shù)值等 循環(huán)體部分指重復(fù)執(zhí)行的程序部分,其中包括對循環(huán)條件等的修改程序段 循環(huán)控制部分判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán),關(guān)鍵是什么?,循環(huán)控制,循環(huán)結(jié)構(gòu)程序的設(shè)計關(guān)鍵是循環(huán)控制部分 循環(huán)控制可以在進(jìn)入循環(huán)之前進(jìn)行,也可以在循環(huán)體后進(jìn)行,于是形成兩種結(jié)構(gòu): “先判斷、后循環(huán)”結(jié)構(gòu) “先循環(huán)、后判斷”結(jié)構(gòu) 循環(huán)結(jié)束的控制可以用循環(huán)次數(shù),還可以用特定條件等,于是又有: 計數(shù)控制循環(huán) 條件控制循環(huán),圖示,先循環(huán)后判斷的循環(huán)結(jié)構(gòu),1. 計數(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、并判斷是否為0,例7: 用二進(jìn)制顯示BL內(nèi)容,mov cx,8 ;CX8(循環(huán)次數(shù)) again: shl bl,1 ;左移進(jìn)CF,從高位開始顯示 mov dl,0 ;MOV指令不改變CF adc dl,30h ;DL030HCF ;CF若是0,則DL 0 ;CF若是1,則DL 1 mov ah,2 int 21h ;顯示 loop again ;CX減1,如果CX未減至0,則循環(huán),計數(shù)控制循環(huán) 先循環(huán)后判斷,例8. 求數(shù)組元素的最大值和最小值,;數(shù)據(jù)段 array dw 10 ;假設(shè)一個數(shù)組,其中頭個數(shù)據(jù)10表示元素個數(shù) dw -3,0,20,900,587,-632,777,234,-34,-56 ;這是一個有符號字量元素組成的數(shù)組 maxay dw ? ;存放最大值 minay dw ? ;存放最小值,初始化:循環(huán)次數(shù)元素個數(shù)1 循環(huán)體:逐個比較求最大、小值 循環(huán)控制:比較完所有數(shù)據(jù),例8. 代碼段,;代碼段 lea si,array mov cx,si ;取得元素個數(shù) dec cx ;減1后是循環(huán)次數(shù) add si,2 mov ax,si ;取出第一個元素給AX,AX用于暫存最大值 mov bx,ax ;取出第一個元素給BX,BX用于暫存最小值,初始化,例8. 代碼段(續(xù)),maxck: add si,2 cmp si,ax ;與下一個數(shù)據(jù)比較 jle minck mov ax,si ;AX取得更大的數(shù)據(jù) jmp next minck: cmp si,bx jge next mov bx,si ;BX取得更小的數(shù)據(jù) next: loop maxck ;計數(shù)循環(huán) mov maxay,ax ;保存最大值 mov minay,bx ;保存最小值,循環(huán)體,2. 條件控制循環(huán),條件控制循環(huán)需要利用特定條件判斷循環(huán)是否結(jié)束 條件控制循環(huán)用條件轉(zhuǎn)移指令判斷循環(huán)條件 轉(zhuǎn)移指令可以指定目的標(biāo)號來改變程序的運行順序,如果目的標(biāo)號指向一個重復(fù)執(zhí)行的語句體的開始或結(jié)束,便構(gòu)成了循環(huán)控制結(jié)構(gòu),例9. 顯示以0結(jié)尾的字符串,;數(shù)據(jù)段 string db Let us have a try !,0 ;代碼段 mov bx,offset string again: mov dl,bx cmp dl,0 jz done ;為0結(jié)束 mov ah,2 ;不為0,顯示 int 21h inc bx ;指向下一個字符 jmp again done: ,條件控制循環(huán) 先判斷后循環(huán),例10 記錄某個字存儲單元數(shù)據(jù)中1的個數(shù),;數(shù)據(jù)段 number dw 1110111111100100B ;代碼段 mov bx,number xor dl,dl ;循環(huán)初值:DL0 again: test bx,0ffffh ;也可以用cmp bx,0 jz done ;全部是0就可以退出循環(huán),減少循環(huán)次數(shù) shl bx,1 ;用指令shr bx,1也可以 adc dl,0 ;利用ADC指令加CF的特點進(jìn)行計數(shù) jmp again,條件控制循環(huán) 先判斷后循環(huán),例10. 十進(jìn)制顯示(016數(shù)值),done: cmp dl,10 ;判斷1的個數(shù)是否小于10 jb digit ;1的個數(shù)小于10,轉(zhuǎn)移 push dx mov dl,1 ;1的個數(shù)大于或等于10 mov ah,2 ;則要先顯示一個1 int 21h pop dx sub dl,10 digit: add dl,0 ;顯示個數(shù) mov ah,2 int 21h,單分支結(jié)構(gòu),4. 子程序設(shè)計,把功能相對獨立的程序段單獨編寫和調(diào)試,作為一個相對獨立的模塊供程序使用,就形成子程序 子程序可以實現(xiàn)源程序的模塊化,可簡化源程序結(jié)構(gòu),可以提高編程效率 主程序(調(diào)用程序)需要利用CALL指令調(diào)用子程序(被調(diào)用程序) 子程序需要利用RET指令返回主程序,1. 過程定義和子程序編寫,匯編語言中,子程序要用一對過程偽指令PROC和ENDP聲明,格式如下: 過程名 PROC NEAR|FAR ;過程體 過程名 ENDP 可選的參數(shù)指定過程的調(diào)用屬性。沒有指定過程屬性,則采用默認(rèn)屬性 NEAR屬性(段內(nèi)近調(diào)用)的過程只能被相同代碼段的其他程序調(diào)用 FAR屬性(段間遠(yuǎn)調(diào)用)的過程可以被相同或不同代碼段的程序調(diào)用,子程序編寫注意事項,子程序要利用過程定義偽指令聲明 子程序最后利用RET指令返回主程序,主程序執(zhí)行CALL指令調(diào)用子程序 子程序中對堆棧的壓入和彈出操作要成對使用,保持堆棧的平衡 子程序開始應(yīng)該保護(hù)使用到的寄存器內(nèi)容,子程序返回前相應(yīng)進(jìn)行恢復(fù) 子程序應(yīng)安排在代碼段的主程序之外,最好放在主程序執(zhí)行終止后的位置(返回DOS后、匯編結(jié)束END偽指令前),也可以放在主程序開始執(zhí)行之前的位置,子程序編寫注意事項(續(xù)),子程序允許嵌套和遞歸 子程序可以與主程序共用一個數(shù)據(jù)段,也可以使用不同的數(shù)據(jù)段(注意修改DS),還可以在子程序最后設(shè)置數(shù)據(jù)區(qū)(利用CS尋址) 子程序的編寫可以很靈活,例如具有多個出口(多個RET指令)和入口,但一定要保證堆棧操作的正確性 處理好子程序與主程序間的參數(shù)傳遞問題 提供必要的子程序說明信息,例11 用顯示器功能調(diào)用輸出一個字符的子程序,;主程序 mov al,? ;主程序提供顯示字符 call dpchar ;調(diào)用子程序 ;子程序:顯示AL中的字符 dpchar proc ;過程定義,過程名為dpchar push ax ;順序入棧,保護(hù)寄存器 push bx mov bx,0 mov ah,0eh ;顯示器0EH號輸出一個字符功能 int 10h pop bx ;逆序出棧,恢復(fù)寄存器 pop ax ret ;子程序返回 dpchar endp ;過程結(jié)束,例11 源程序,; wjl11.asm .model small .stack .code start: mov ax,data mov ds,ax mov al,? ;主程序提供顯示字符 call dpchar ;調(diào)用子程序 mov ax,4c00h int 21h,主程序部分,本程序不需要數(shù)據(jù)段,例11 源程序(續(xù)),dpchar proc ;過程定義,過程名為dpchar push ax ;順序入棧,保護(hù)寄存器 push bx mov bx,0 mov ah,0eh ;顯示器0EH號輸出一個字符功能 int 10h pop bx ;逆序出棧,恢復(fù)寄存器 pop ax ret ;子程序返回 dpchar endp ;過程結(jié)束 end start,子程序安排在主程序執(zhí)行終止后的位置,例12 顯示以“0”結(jié)尾字符串的嵌套子程序,;數(shù)據(jù)段 msg db Well, I made it !,0 ;代碼段(主程序) mov si,offset msg ;主程序提供顯示字符串 call dpstri ;調(diào)用子程序,例12 子程序,;子程序dpstri:顯示DS:SI指向的字符串(以0結(jié)尾) dpstri proc push ax dps1: mov al,si ;取顯示字符 inc si cmp al,0 ;是結(jié)尾,則顯示結(jié)束 jz dps2 call dpchar ;調(diào)用字符顯示子程序 jmp dps1 dps2: pop ax ret dpstri endp ;子程序dpchar:顯示AL中的字符,含數(shù)據(jù)區(qū)的子程序,;子程序HTOASC:十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼 HTOASC proc push bx mov bx,offset ASCII and al,0fh xlat CS:ASCII ;換碼:ALCS:BXAL pop bx ret ;數(shù)據(jù)區(qū) ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h db 41h,42h,43h,44h,45h,46h HTOASC endp,多出口子程序,;子程序HTOASC:十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼 HTOASC proc and al,0fh cmp al,9 jbe htoasc1 add al,37h ;是A F,加37H ret ;子程序返回 htoasc1: add,30h ;是0 9,加30H ret ;子程序返回 HTOASC endp,7.5 匯編語言程序匯編步驟,匯編語言程序要能在機器上運行,還必需將匯編源程序匯編成可執(zhí)行程序。為此必須完成以下幾個步驟: 編輯源程序 調(diào)用匯編程序?qū)υ闯绦蜻M(jìn)行匯編 對目標(biāo)程序進(jìn)行連接 運行可執(zhí)行程序并調(diào)試,1匯編程序 匯編是把匯編語言程序翻譯成機器語言描述的目標(biāo)程序的過程。 匯編程序(ASM)是完成匯編任務(wù)的程序。 2連接程序 連接程序的主要功能是實現(xiàn)多個目標(biāo)文件及庫文件的連接,并完成浮動地位的重定位。 從匯編語言源程序到可執(zhí)行程序的生成過程如圖所示。,開發(fā)過程1:源程序的編輯,源程序文件要以ASM為擴展名 源程序文件的形成(編輯)可以通過任何一個文本編輯器實現(xiàn): DOS中的全屏幕文本編輯器EDIT 其他程序開發(fā)工具中的編輯環(huán)境 Windows中的記事本Notepad,開發(fā)過程2:源程序的匯編(MASM 6.x),匯編是將源程序翻譯成由機器代碼組成的目標(biāo)模塊文件的過程 MASM 6.x提供的匯編程序是ML.EXE。 如果源程序中沒有語法錯誤,MASM將自動生成一個目標(biāo)模塊文件(.obj);否則MASM將給出相應(yīng)的錯誤信息。這時應(yīng)根據(jù)錯誤信息,重新編輯修改源程序后,再進(jìn)行匯編,開發(fā)過程2:源程序的匯編(MASM 5.x),MASM 5.x提供的匯編程序是MASM.EXE。 默認(rèn)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44928-2024微電子學(xué)微光刻技術(shù)術(shù)語
- GB/T 44924-2024半導(dǎo)體集成電路射頻發(fā)射器/接收器測試方法
- GB/T 45174-2024鞋類微孔鞋底密度測定法
- 1-3-Dieicosenoyl-glycerol-生命科學(xué)試劑-MCE-8506
- 二零二五年度上市公司員工持股協(xié)議轉(zhuǎn)讓易主合同
- 二零二五年度兒童教育機構(gòu)門店聯(lián)營合作協(xié)議
- 二零二五年度船舶轉(zhuǎn)讓手續(xù)辦理與船舶交易評估與代理服務(wù)協(xié)議
- 2025年度足療技師星級評定與聘用合同
- 2025年度二零二五年度道路運輸項目投資合作協(xié)議
- 施工現(xiàn)場交通管制制度
- 學(xué)校教育中的STEM教育模式培訓(xùn)課件
- 樁基礎(chǔ)工程文件歸檔內(nèi)容及順序表
- 《民航服務(wù)溝通技巧(第2版)》王建輝教案 第7課 有效處理投訴
- 2023年新疆中考數(shù)學(xué)試卷真題及答案
- (新版)國民經(jīng)濟行業(yè)分類代碼表(八大行業(yè))
- 北京地鐵13號線
- 塑料成型模具設(shè)計(第2版)江昌勇課件1-塑料概述
- 產(chǎn)業(yè)園EPC總承包工程項目施工組織設(shè)計
- 方形補償器計算
- 為加入燒火佬協(xié)會致辭(7篇)
- 兒科重癥監(jiān)護(hù)病房管理演示文稿
評論
0/150
提交評論