




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章東南大學《微機原理與接口技術》第3章:匯編語言的特點匯編語言是一種以處理器指令系統為基礎的低級程序設計語言,它采用助記符表達指令操作碼,采用標識符號表示指令操作數利用匯編語言編寫程序的主要優點是可以直接、有效地控制計算機硬件,因而容易創建代碼序列短小、運行快速的可執行程序在有些應用領域,匯編語言的作用是不容置疑和無可替代的匯編程序設計的過程是與其他高級語言程序設計大致相同第3章:教學重點匯編語言源程序格式與開發常量、變量和標號匯編語言程序設計方法順序程序設計分支程序設計循環程序設計子程序設計第3章:3.1匯編語言源程序格式完整的匯編語言源程序由段組成一個匯編語言源程序可以包含若干個代碼段、數據段、附加段或堆棧段,段與段之間的順序可隨意排列需獨立運行的程序必須包含一個代碼段,并指示程序執行的起始點,一個程序只有一個起始點所有的可執行性語句必須位于某一個代碼段內,說明性語句可根據需要位于任一段內通常,程序還需要一個堆棧段
源程序由語句序列構成第3章:匯編語言的語句格式⑴執行性語句——執行性語句用于表達處理器指令(也稱為硬指令),匯編后對應一條指令代碼。由處理器指令組成的代碼序列是程序設計的主體標號:
硬指令助記符操作數,操作數
;注釋⑵說明性語句——說明性語句用于表達偽指令,指示源程序如何匯編、變量怎樣定義、過程怎么設置等名字偽指令助記符
參數,參數,……;注釋第3章:硬指令與偽指令硬指令(Instruction)——使CPU產生動作、并在程序執行時才處理的指令 硬指令就是第2章學習的處理器指令,與具體的處理器有關、與匯編程序無關偽指令(Directive)——不產生CPU動作、在程序執行前由匯編程序處理的說明性指令
偽指令與具體的處理器類型無關,但與匯編程序有關。不同版本的匯編程序支持不同的偽指令
硬指令和偽指令采用易于記憶的符合表達,這就是助記符第3章:標號、名字與標識符標號是反映硬指令位置(邏輯地址)和屬性的標識符,后跟一個冒號分隔名字是反映偽指令位置(邏輯地址)和屬性的標識符,后跟空格或制表符分隔,沒有冒號標識符(Identifier)一般最多由31個字母、數字及規定的特殊符號(如_、$、?、@)組成,不能以數字開頭。默認情況下,匯編程序不區別標識符中的字母大小寫一個源程序中,每個標識符的定義是唯一的,還不能是匯編語言采用的保留字第3章:保留字保留字(ReservedWord)是匯編程序已經利用的標識符(也稱為關鍵字),主要有:硬指令助記符——例如:MOV、ADD偽指令助記符——例如:DB、DW操作符——例如:OFFSET、PTR寄存器名——例如:AX、CS預定義符號——例如:@data
匯編語言大小寫不敏感第3章:操作數和參數處理器指令的操作數可以是立即數、寄存器和存儲單元偽指令的參數可以是常數、變量名、表達式等,可以有多個,參數之間用逗號分隔第3章:注釋語句中由分號“;”開始的部分為注釋內容,用以增加源程序的可讀性必要時,一個語句行也可以由分號開始作為階段性注釋匯編程序在翻譯源程序時將跳過該部分,不對它們做任何處理第3章:分隔符語句的4個組成部分要用分隔符分開標號后用冒號,注釋前用分號操作數之間和參數之間使用逗號分隔其他部分通常采用空格或制表符多個空格和制表符的作用與一個相同MASM支持續行符“\”第3章:例3.1在屏幕上顯示一段信息 ;數據段(定義要顯示的字符串)string db’Hello,Assembly!’,0dh,0ah,’$’
;代碼段(顯示字符串的程序)
mov
dx,offsetstring
movah,9
int21h
Hello,Assembly!程序功能第3章:3.1.1簡化段定義格式
.modelsmall ;定義程序的存儲模式(小型模式)
.stack ;定義堆棧段(默認是1KB空間)
.data ;定義數據段
……
;數據定義
.code ;定義代碼段start: mov
ax,@data
;程序起始點
mov
ds,ax
;設置DS指向用戶定義的數據段
……
;程序代碼
movax,4c00h
int21h ;程序結束點,返回DOS
……
;子程序代碼
endstart ;匯編結束,同時指明程序起始點start第3章:第一個源程序文件wjl301.asm;wjl301.asm .modelsmall .stack .datastring db’Hello,Assembly!’,0dh,0ah,’$’ .code start: mov
ax,@data
mov
ds,ax
mov
dx,offsetstring
movah,9
int21h
movax,4c00h
int21h
endstart第3章:匯編語言程序的開發過程(附錄B)編輯文本編輯器,如EDIT.COM源程序:文件名.asm匯編匯編程序,如ML.EXE目標模塊:文件名.obj連接連接程序,如LINK.EXE可執行文件:文件名.exe調試調試程序,如DEBUG.EXE應用程序錯誤錯誤錯誤錯誤開發過程1:源程序的編輯源程序文件要以ASM為擴展名源程序文件的形成(編輯)可以通過任何一個文本編輯器實現:DOS中的全屏幕文本編輯器EDIT其他程序開發工具中的編輯環境Windows中的記事本NotepadEDITwjl301.asm開發過程2:源程序的匯編(MASM6.x)匯編是將源程序翻譯成由機器代碼組成的目標模塊文件的過程MASM6.x提供的匯編程序是ML.EXE:ML/cwjl301.asm如果源程序中沒有語法錯誤,MASM將自動生成一個目標模塊文件(wjl301.obj);否則MASM將給出相應的錯誤信息。這時應根據錯誤信息,重新編輯修改源程序后,再進行匯編開發過程2:源程序的匯編(MASM5.x)MASM5.x提供的匯編程序是MASM.EXE:MASMwjl301.asm;如果利用分號“;”結尾命令,則匯編程序不再提示輸入模塊文件名、列表文件名等,直接采用默認的文件名。默認采用源程序文件相同的主文件名,擴展名則是相應類型文件的擴展名,例如模塊文件(.obj)和列表文件(.lst)等開發過程2:源程序的匯編(生成列表文件)匯編過程中,可以通過參數選擇生成列表文件(.LST)。列表文件是一種文本文件,含有源程序和目標代碼,對我們學習匯編語言程序設計和發現錯誤很有用匯編程序ML.EXE和MASM.EXE都可帶其他參數,為了生成列表文件,各自的命令是:
ML/Flwjl301.asm MASM/lwjl301.asm;該命令除產生模塊文件wjl301.obj(和可執行文件wjl301.exe)外,還將生成列表文件wjl301.lst開發過程3:目標模塊的連接連接程序能把一個或多個目標文件和庫文件合成一個可執行程序(.EXE、.COM文件):LINKwjl301.obj;如果沒有嚴重錯誤,LINK將生成一個可執行文件(wjl301.exe);否則將提示相應的錯誤信息。這時需要根據錯誤信息重新修改源程序文件后再匯編、鏈接,直到生成可執行文件ML.EXE匯編程序(MASM6.x)可自動調用LINK連接程序,實現匯編和連接的依次進行MLwjl301.asm開發過程4:可執行程序的調試經匯編、連接生成的可執行程序在操作系統下只要輸入文件名就可以運行:wjl301操作系統裝載該文件進入主存,并開始運行如果出現運行錯誤,可以從源程序開始排錯,也可以利用調試程序幫助發現錯誤采用DEBUG.EXE調試程序:DEBUGwjl301.exe第3章:1.存儲模式(MemoryModel)存儲模式決定了一個程序的規模,也確定了子程序調用、指令轉移和數據訪問等的缺省屬性當使用簡化段定義的源程序格式時,必須有存儲模式.MODEL語句,且位于所有簡化段定義語句之前。其格式為:
.MODEL存儲模式.MODEL語句確定了程序采用的存儲模式,MASM有7種可以選擇,如表3.1所示
本課程學習過程中,均采用小型模式SMALL第3章:2.邏輯段的簡化定義.STACK[大小];堆棧段定義偽指令.STACK創建一個堆棧段,段名是:STACK??蛇x的“大小”參數指定堆棧段所占存儲區的字節數,默認是1KB(=1024=400H字節).DATA;數據段定義偽指令.DATA創建一個數據段,段名是:_DATA。數據段名可用@DATA預定義標識符表示.CODE[段名];代碼段定義偽指令.CODE創建一個代碼段,可選的“段名”參數指定該代碼段的段名。如果沒有給出段名,則采用默認段名
一個段的開始自動結束前面的一個段簡化段定義偽指令之前,需有存儲模式語句第3章:3.程序開始為了指明程序開始執行的位置,需要使用一個標號(例題中采用了start標識符)連接程序會根據程序起始點正確地設置CS和IP值,根據程序大小和堆棧段大小設置SS和SP值連接程序沒有設置DS和ES值。程序如果使用數據段或附加段,必須明確給DS或ES賦值大多數程序需要數據段,程序的執行開始應是:start: mov
ax,@data
;@data表示數據段的段地址
mov
ds,ax
;設置DS第3章:4.程序終止應用程序執行結束,應該將控制權交還操作系統匯編語言程序設計中,有多種返回DOS的方法,但一般利用DOS功能調用的4CH子功能實現,它需要的入口參數是AL=返回數碼(通常用0表示程序沒有錯誤)于是,應用程序的終止代碼就是:
movax,4c00h
int21h第3章:5.匯編結束匯編結束表示匯編程序到此結束將源程序翻譯成目標模塊代碼的過程源程序的最后必須有一條END偽指令
END[標號]可選的“標號”參數指定程序開始執行點,連接程序據此設置CS和IP值(例題中采用了start標識符)
————不要糊涂————程序終止和匯編結束是兩碼事第3章:第一個源程序文件wjl301.asm;wjl301.asm .modelsmall .stack .datastring db’Hello,Assembly!’,0dh,0ah,’$’ .code start: mov
ax,@data
mov
ds,ax
mov
dx,offsetstring
movah,9
int21h
movax,4c00h
int21h
endstart第3章:簡化段定義的源程序格式
.modelsmall ;小型模式存儲模式
.stack ;1KB空間堆棧段
.data ;數據段
……
;數據定義
.code ;代碼段start: mov
ax,@data
;起始點
mov
ds,ax
;設置DS
……
;程序代碼
movax,4c00h
int21h ;結束點,返回DOS
……
;子程序代碼
endstart ;匯編結束第3章:3.1.2完整段定義格式完整段定義利用SEGMENT和ENDS一對偽指令定義邏輯段同時需要配合ASSUME偽指令指明邏輯段是代碼段、堆棧段、數據段還是附加段完整段定義的優勢是可以指明邏輯段的定位、組合、類別等屬性;而簡化段定義只能采用系統默認的屬性完整段定義和簡化段定義的實質是一致的第3章:3.1.3可執行程序的結構DOS操作系統支持兩種可執行程序結構1.EXE程序程序可以有多個代碼段和多個數據段,程序長度可以超過64KB通常生成EXE結構的可執行程序2.COM程序只有一個邏輯段,程序長度不超過64KB需要滿足一定條件才能生成COM結構的可執行程序(MASM6.x需要采用TINY模式)第3章:3.2常量、變量和標號匯編語言的數據可以簡單分為常量和變量常量可以作為硬指令的立即數或偽指令的參數,變量主要作為存儲器操作數匯編語言語句中的名字和標號具有邏輯地址和類型屬性,主要用做地址操作數,也可以作為立即數和存儲器操作數本節將詳細討論語句中的參數和操作數、名字和標號,并引出相關的偽指令和操作符第3章:3.2.1常量常量表示一個固定的數值,它又分成多種形式常數字符串符合常量數值表達式第3章:1.常數指由10、16、2和8進制形式表達的數值,各種進制的數據以后綴字母區分,默認不加后綴字母的是十進制數十進制由0~9數字組成,以字母D(d)結尾(缺省情況可以省略)100,255D十六進制由0~9、A~F數字組成,以字母H(h)結尾,以字母開頭的常數需要加一個前導064H,0FFH0B800H二進制由0和1兩個數字組成,以字母B(b)結尾01100100B第3章:2.字符串字符串常量是用單引號或雙引號括起來的單個字符或多個字符其數值是每個字符對應的ASCII碼值例如:
‘d’(等于64H)
‘AB’(等于4142H)
‘Hello,Assembly!’第3章:3.符號常量符號常量使用標識符表達一個數值MASM提供等價機制,用來為常量定義符號名符號定義偽指令有“等價EQU”和“等號=”: 符號名EQU
數值表達式 符號名EQU<字符串> ;MASM5.x不支持 符號名=數值表達式EQU用于數值等價時不能重復定義符號名,但“=”允許有重復賦值。例如:
X =7 ;等效于:Xqeu7 X =X+5 ;“XEQUX+5”是錯誤的第3章:4.數值表達式數值表達式一般是指由運算符連接的各種常量所構成的表達式匯編程序在匯編過程中計算表達式,最終得到一個確定的數值,所以也是常量表達式的數值在程序運行前的匯編階段計算,所以組成表達式的各部分必須在匯編時就能確定匯編語言支持多種運算符(表3.4)我們經常使用的是加減乘除(+-*/
)例如:movax,3*4+5 ;等價于:movax,17第3章:3.2.2變量變量實質上是指內存單元的數據,雖然內存單元地址不變,但其中存放的數據可以改變變量需要事先定義才能使用變量定義(Define)偽指令為變量申請固定長度為單位的存儲空間,并可以同時將相應的存儲單元初始化定義后的變量可以利用變量名等方法引用其中的數據,即變量的數值第3章:1.變量的定義變量定義的匯編語言格式為:
變量名偽指令初值表變量名為用戶自定義標識符,表示初值表首元素的邏輯地址,常稱為符號地址。變量名也可以沒有初值表是用逗號分隔的參數,主要由常量、數值表達式或“?”組成。其中“?”表示未賦初值多個存儲單元如果初值相同,可以用復制操作符DUP進行定義:
重復次數DUP(重復參數)變量定義偽指令有DB、DW、DD等(表3.5)第3章:字節變量的定義DB(DefineByte)DB偽指令用于分配一個或多個字節單元,并可以將它們初始化為指定值初值表中每個數據一定是字節量,存放一個8位數據:可以是0~255的無符號數或是-128~+127帶符號數也可以是字符串常數實例字節變量定義實例;數據段X db'a',-5 db2dup(100),?Y db'ABC'應用第3章:字節變量的應用mov
al,X;此處X表示它的第1個數據,故AL←'a'decX+1;對X為始的第2個數據減1,故成為-6mov
Y,al;現在Y這個字符串成為'aBC'第3章:字變量的定義DW(DefineWord)DW偽指令用于分配一個或多個字單元,并可以將它們初始化為指定值初值表中每個數據是字量,一個字單元可用于存放任何16位數據:一個段地址一個偏移地址兩個字符0~65535之間的無符號數-32768~+32767之間的帶符號數字變量定義實例;數據段count dw8000h,?,'AB'maxint
equ64hnumber dw
maxintarray dw
maxintdup(0)第3章:雙字變量的定義DD(DefineDoubleword)DD偽指令用于分配一個或多個雙字單元,并可以將它們初始化為指定值初值表中每個數據是一個32位的雙字量:可以是有符號或無符號的32位整數也可以用來表達16位段地址(高位字)和16位的偏移地址(低位字)的遠指針vardd DD0,?,12345678hfarpoint DD00400078h第3章:2.變量的應用變量具有存儲單元的邏輯地址程序代碼中通過變量名引用其指向的首個數據通過變量名加減位移量存取以首個數據為基地址的前后數據例題3.2變量的定義和應用第3章:例題3.2變量的定義
;數據段bvar1 db100,01100100b,64h,'d'
;字節變量:不同進制表達同一個數值,內存中有4個64Hminint =5 ;符號常量:minint數值為5,不占內存空間bvar2 db-1,minint,minint+5 ;內存中數值依次為FFH,5,0AH db?,2dup(20h) ;預留一個字節空間,重復定義了2個數值20Hwvar1 dw2010h,4*4
;字變量:兩個數據是2010H、0010H,共占4個字節wvar2 dw
?;wvar2是沒有初值的字變量第3章:例題3.2變量的定義(續)dvar
dd12347777h,87651111h,? ;雙字變量:2個雙字數據,一個雙字空間abc db’a’,’b’,’c’,?
;定義字符,實際是字節變量maxint
equ0ah
;符號常量:maxint=10string db’ABCDEFGHIJ’
;定義字符串:使用字節定義DB偽指令crlfs db13,10,’$’
;回車符0DH、換行符0AH和字符'$'=24Harray1 dw
maxint
dup(0)
;10個初值為0的字量,可以認為是數組array db2dup(2,3,2dup(4))
;6個字節內容依次為:0203040402030404第3章:例題3.2變量的應用;代碼段movdl,bvar1
;DL=100decbvar2+1
;bvar2+1=4movabc[3],dl
;abc=’abcd’mov
ax,word
ptrdvar[0]
;取雙字到DX.AXmov
dx,word
ptrdvar[2]addax,word
ptrdvar[4]
;加雙字到DX.AXadc
dx,word
ptrdvar[6]movwordptrdvar[8],ax
;保存雙字的求和結果movwordptrdvar[10],dx第3章:例題3.2變量的應用(續)
mov
cx,maxint
;CX=10
movbx,0
;BX=0again: addstring[bx],3
;string每個數值加3 incbx loopagain
;循環
leadx,abc
;從abc開始
movah,9
;09H號DOS功能調用
int21h;顯示結果:abcdDEFGHIJKLM第3章:3.變量的定位匯編程序按照指令的先后順序一個接著一個分配存儲空間,按照段定義偽指令規定的邊界定位屬性確定每個邏輯段的起始位置(包括偏移地址)定位偽指令ORG控制數據或代碼所在的偏移地址
ORG
參數ORG偽指令是將當前偏移地址指針指向參數表達的偏移地址。例如:
ORG100h
;從100H處安排數據或程序
ORG$+10
;偏移地址加10,即跳過10個字節空間匯編語言程序中,符號“$”表示當前偏移地址值第3章:3.2.3名字和標號的屬性名字和標號是用戶自定義的標識符。名字指向一條偽指令,標號指向一條硬指令。名字和標號一經使用便具有兩類屬性:⑴邏輯地址——名字和標號對應存儲單元的邏輯地址,含有段地址和偏移地址;⑵類型——變量名的類型可以是BYTE(字節)、WORD(字)和DWORD(雙字)等;標號、段名、子程序名的類型可以是NEAR(近)和FAR(遠),分別表示段內或段間調用匯編程序提供有關的操作符,以便獲取這些屬性值第3章:1.地址操作符地址操作符取得名字或標號的段地址和偏移地址[]將括起的表達式作為存儲器地址指針$當前偏移地址:段前綴,采用指定的段地址寄存器OFFSET名字/標號返回名字或標號的偏移地址SEG名字/標號返回名字或標號的段地址第3章:2.類型操作符類型操作符對名字或標號的類型屬性進行設置
類型名PTR名字/標號其中可以是BYTE、WORD、DWORD(依次表示字節、字、雙字)等,或者是NEAR、FAR(分別表示近、遠),還可以是由結構、記錄等定義的類型對變量:LENGTHOF操作符獲知某變量名指向多少個數據項SIZEOF操作符獲知它共占用多少字節空間第3章:3.3順序程序設計沒有分支、循環等轉移指令的程序,會按指令書寫的前后順利依次執行,這就是順序程序順序結構是最基本的程序結構完全采用順序結構編寫的程序并不多見例題3.4順序程序設計實例采用查表法,實現一位16進制數轉換為ASCII碼顯示第3章:例3.4數據段;數據段ASCII db30h,31h,32h,33h,34h,35h,36h,37h,38h,39h
;對應0~9的ASCII碼
db41h,42h,43h,44h,45h,46h
;對應A~F的ASCII碼hex db04h,0bh
;假設兩個數據第3章:例3.4代碼段
;代碼段mov
bx,offsetASCII;BX指向ASCII碼表mov
al,hex
;AL取得一位16進制數;恰好就是ASCII碼表中的位移andal,0fh ;只有低4位是有效的,高4位清0xlat;換碼:AL←DS:[BX+AL]XLAT第3章:例3.4代碼段(續)mov
dl,al
;入口參數:DL←ALmovah,2 ;02號DOS功能調用int21h ;顯示一個ASCII碼字符moval,hex+1 ;轉換并顯示下一個數據andal,0fhxlatmov
dl,almovah,2int21hXLAT第3章:3.4分支程序設計分支程序根據條件是真或假決定執行與否判斷的條件是各種指令,如CMP、TEST等執行后形成的狀態標志轉移指令Jcc和JMP可以實現分支控制分支結構有單分支結構雙分支結構多分支結構第3章:單分支結構條件成立跳轉,否則順序執行分支語句體注意選擇正確的條件轉移指令和轉移目標地址實例:求絕對值第3章:計算AX中有符號數的絕對值
cmpax,0
jge
nonneg
;條件滿足(AX≥0),轉移
negax
;條件不滿足,求補nonneg:
mov
result,ax
;條件滿足
;不恰當的分支
cmpax,0
jl
yesneg
;條件滿足(AX<0),轉移
jmp
nonnegyesneg:
negax
;條件不滿足,求補nonneg:
mov
result,ax
;條件滿足第3章:雙分支結構條件成立跳轉執行第2個分支語句體,否則順序執行第1個分支語句體注意第1個分支體后一定要有一個JMP指令跳到第2個分支體后實例:顯示BX的最高位第3章:顯示BX的最高位
shlbx,1 ;BX最高位移入CF標志
jcone
;CF=1,即最高位為1,轉移
movdl,30h
;CF=0,即最高位為0:DL←30H=‘0’
jmptwo
;一定要跳過另一個分支體one: movdl,31h ;DL←31H=‘1’two: movah,2
int21h ;顯示可以用JNC替換JC第3章:顯示BX的最高位(續)
shlbx,1 ;BX最高位移入CF標志
jncone
;CF=0,即最高位為0,轉移
movdl,31h
;CF=1,即最高位為1:DL←31H=‘1’
jmptwo
;一定要跳過另一個分支體one: movdl,30h ;DL←30H=‘0’two: movah,2
int21h ;顯示轉換為單分支結構第3章:顯示BX的最高位(另解)
movdl,’0’ ;DL←30H=‘0’
shlbx,1 ;BX最高位移入CF標志
jnctwo
;CF=0,即最高位為0,轉移
movdl,’1’
;CF=1,即最高位為1:DL←31H=‘1’two:
movah,2
int21h ;顯示
編寫分支程序,需留心分支的開始和結束第3章:顯示BX的最高位(無分支)
movdl,0
shlbx,1 ;BX最高位移入CF標志
adcdl,30h
;CF=0,DL←0+30h+0=30H=‘0’
;CF=1,DL←0+30h+1=31H=‘1’two:
movah,2
int21h ;顯示第3章:例題3.5顯示壓縮BCD碼,無前導0
;數據段BCD db04h
;代碼段
mov
dl,BCD testdl,0ffh
;如果BCD碼為0,顯示0
jzzero
;雙分支結構
testdl,0f0h
;如果BCD碼高位為0,不顯示0
jzone ;單分支結構第3章:例題3.5顯示壓縮BCD碼,無前導0(續)
movcl,4
;處理高位
shr
dl,cl ordl,30h
;轉換為ASCII碼
movah,2
;顯示高位
int21h
mov
dl,BCD anddl,0fhone: ordl,30h
;處理低位
jmptwozero:
movdl,’0’two: movah,2
int21h第3章:大小寫字母轉換(參例題3.6)
;如果DL是一個小寫字母,則轉換為大寫
cmp
dl,‘a’ ;小于小寫字母a,不需要處理
jb
disp
cmp
dl,‘z’
;大于小寫字母z,也不需要處理
ja
disp
subdl,20h
;是小寫字母,則轉換為大寫disp: ……轉換原理第3章:多分支結構多分支結構是多個條件對應各自的分支語句體,哪個條件成立就轉入相應分支體執行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNorah,ah
;=cmpah,0jzfunction0decah ;=cmpah,1jzfunction0decah ;=cmpah,2jzfunction0第3章:3.5循環程序設計循環程序結構是滿足一定條件的情況下,重復執行某段程序循環結構的程序通常有3個部分:循環初始部分——為開始循環準備必要的條件,如循環次數、循環體需要的數值等循環體部分——指重復執行的程序部分,其中包括對循環條件等的修改程序段循環控制部分——判斷循環條件是否成立,決定是否繼續循環關鍵是什么?第3章:循環控制循環結構程序的設計關鍵是循環控制部分循環控制可以在進入循環之前進行,也可以在循環體后進行,于是形成兩種結構:“先判斷、后循環”結構“先循環、后判斷”結構循環結束的控制可以用循環次數,還可以用特定條件等,于是又有:計數控制循環條件控制循環圖示第3章:先循環后判斷的循環結構
結束
初始化
循環的初始狀態
循環體
循環的工作部分及修改部分
計數控制循環條件控制循環修改部分控制條件YN第3章:3.5.1計數控制循環計數控制循環利用循環次數作為控制條件易于采用循環指令LOOP和JCXZ實現初始化:將循環次數或最大循環次數置入CX循環體循環控制:用LOOP指令對CX減1、并判斷是否為0第3章:用二進制顯示BL內容(參例3.8)
movcx,8
;CX←8(循環次數)again: shlbl,1 ;左移進CF,從高位開始顯示
movdl,0
;MOV指令不改變CF
adcdl,30h
;DL←0+30H+CF
;CF若是0,則DL←'0'
;CF若是1,則DL←'1'
movah,2
int21h
;顯示
loopagain
;CX減1,如果CX未減至0,則循環計數控制循環先循環后判斷第3章:例3.9求數組元素的最大值和最小值 ;數據段array dw10;假設一個數組,其中頭個數據10表示元素個數
dw-3,0,20,900,587,-632,777,234,-34,-56;這是一個有符號字量元素組成的數組maxay
dw? ;存放最大值minay
dw? ;存放最小值初始化:循環次數=元素個數-1循環體:逐個比較求最大、小值循環控制:比較完所有數據第3章:例3.9代碼段
;代碼段
leasi,array
mov
cx,[si]
;取得元素個數
dec
cx
;減1后是循環次數
addsi,2
mov
ax,[si]
;取出第一個元素給AX,AX用于暫存最大值
mov
bx,ax
;取出第一個元素給BX,BX用于暫存最小值初始化第3章:例3.9代碼段(續)maxck: addsi,2
cmp[si],ax
;與下一個數據比較
jle
minck
mov
ax,[si]
;AX取得更大的數據
jmpnextminck: cmp[si],bx
jgenext
mov
bx,[si] ;BX取得更小的數據next: loopmaxck
;計數循環
mov
maxay,ax
;保存最大值
mov
minay,bx
;保存最小值循環體第3章:3.5.2條件控制循環條件控制循環需要利用特定條件判斷循環是否結束條件控制循環用條件轉移指令判斷循環條件轉移指令可以指定目的標號來改變程序的運行順序,如果目的標號指向一個重復執行的語句體的開始或結束,便構成了循環控制結構第3章:顯示以0結尾的字符串
;數據段string db'Letushaveatry!',0
;代碼段
mov
bx,offsetstringagain:
mov
dl,[bx]
cmpdl,0
jzdone
;為0結束
movah,2 ;不為0,顯示
int21h incbx
;指向下一個字符
jmpagaindone: ……條件控制循環先判斷后循環第3章:例3.11記錄某個字存儲單元數據中1的個數
;數據段number dw1110111111100100B
;代碼段
mov
bx,number
xor
dl,dl
;循環初值:DL←0again: testbx,0ffffh ;也可以用cmpbx,0
jzdone
;全部是0就可以退出循環,減少循環次數
shlbx,1 ;用指令shrbx,1也可以
adcdl,0
;利用ADC指令加CF的特點進行計數
jmpagain條件控制循環先判斷后循環第3章:例3.11十進制顯示(0~16數值)done: cmpdl,10 ;判斷1的個數是否小于10
jbdigit
;1的個數小于10,轉移
pushdx
movdl,‘1’ ;1的個數大于或等于10
movah,2 ;則要先顯示一個1
int21h popdx subdl,10digit: adddl,‘0’ ;顯示個數
movah,2
int21h單分支結構第3章:3.5.3串操作類指令8088的串操作類指令能對內存中一個連續區域的數據(如數組、字符串等)進行傳送、比較等操作,指令有:傳送數據串:MOVS,STOS,LODS檢測數據串:CMPS,SCAS重復前綴:REP,REPZ,REPNZ串操作指令采用了特殊的尋址方式利用循環程序也可以實現串操作指令的功能第3章:3.6子程序設計把功能相對獨立的程序段單獨編寫和調試,作為一個相對獨立的模塊供程序使用,就形成子程序子程序可以實現源程序的模塊化,可簡化源程序結構,可以提高編程效率主程序(調用程序)需要利用CALL指令調用子程序(被調用程序)子程序需要利用RET指令返回主程序第3章:3.6.1過程定義和子程序編寫匯編語言中,子程序要用一對過程偽指令PROC和ENDP聲明,格式如下:
過程名
PROC[NEAR|FAR]
……
;過程體
過程名
ENDP可選的參數指定過程的調用屬性。沒有指定過程屬性,則采用默認屬性NEAR屬性(段內近調用)的過程只能被相同代碼段的其他程序調用FAR屬性(段間遠調用)的過程可以被相同或不同代碼段的程序調用第3章:子程序編寫注意事項⑴子程序要利用過程定義偽指令聲明⑵子程序最后利用RET指令返回主程序,主程序執行CALL指令調用子程序⑶子程序中對堆棧的壓入和彈出操作要成對使用,保持堆棧的平衡⑷子程序開始應該保護使用到的寄存器內容,子程序返回前相應進行恢復⑸子程序應安排在代碼段的主程序之外,最好放在主程序執行終止后的位置(返回DOS后、匯編結束END偽指令前),也可以放在主程序開始執行之前的位置第3章:例3.15用顯示器功能調用輸出一個字符的子程序
;主程序
moval,‘?’ ;主程序提供顯示字符
calldpchar
;調用子程序
;子程序:顯示AL中的字符dpchar proc
;過程定義,過程名為dpchar
pushax
;順序入棧,保護寄存器
pushbx
movbx,0
movah,0eh ;顯示器0EH號輸出一個字符功能
int10h
popbx
;逆序出棧,恢復寄存器
popax
ret
;子程序返回dpchar
endp
;過程結束第3章:例3.15源程序;wjl315.asm .modelsmall .stack .codestart: mov
ax,@data
mov
ds,ax
moval,‘?’
;主程序提供顯示字符
calldpchar
;調用子程序
movax,4c00h
int21h主程序部分本程序不需要數據段第3章:例3.15源程序(續)dpchar proc
;過程定義,過程名為dpchar pushax ;順序入棧,保護寄存器
pushbx
movbx,0
movah,0eh ;顯示器0EH號輸出一個字符功能
int10h popbx
;逆序出棧,恢復寄存器
popax
ret
;子程序返回dpchar
endp
;過程結束
endstart子程序安排在主程序執行終止后的位置第3章:子程序編寫注意事項(續)⑹子程序允許嵌套和遞歸⑺子程序可以與主程序共用一個數據段,也可以使用不同的數據段(注意修改DS),還可以在子程序最后設置數據區(利用CS尋址)⑻子程序的編寫可以很靈活,例如具有多個出口(多個RET指令)和入口,但一定要保證堆棧操作的正確性⑼處理好子程序與主程序間的參數傳遞問題⑽提供必要的子程序說明信息第3章:例3.16顯示以“0”結尾字符串的嵌套子程序
;數據段msg db'Well,Imadeit!',0
;代碼段(主程序)
mov
si,offset
msg
;主程序提供顯示字符串
calldpstri
;調用子程序第3章:例3.16子程序;子程序dpstri:顯示DS:SI指向的字符串(以0結尾)
dpstri proc pushaxdps1: mov
al,[si]
;取顯示字符
incsi
cmpal,0 ;是結尾,則顯示結束
jzdps2
calldpchar
;調用字符顯示子程序
jmpdps1dps2: popax
retdpstri
endp;子程序dpchar:顯示AL中的字符(同例題3.15)第3章:含數據區的子程序;子程序HTOASC:十六進制數轉換為ASCII碼HTOASC proc pushbx
mov
bx,offsetASCII andal,0fh
xlatCS:ASCII ;換碼:AL←CS:[BX+AL] popbx
ret;數據區ASCII db30h,31h,32h,33h,34h,35h,36h,37h,38h,39h db41h,42h,43h,44h,45h,46hHTOASC endp第3章:多出口子程序;子程序HTOASC:十六進制數轉換為ASCII碼HTOASC proc andal,0fh
cmpal,9
jbehtoasc1 addal,37h ;是A~F,加37H ret ;子程序返回htoasc1: add,30h ;是0~9,加30H
ret ;子程序返回HTOASC endp第3章:參數傳遞主程序與子程序間一個主要問題是參數傳遞入口參數(輸入參數):主程序調用子程序時,提供給子程序的參數出口參數(輸出參數):子程序執行結束返回給主程序的參數參數的具體內容傳數值:傳送數據本身傳地址:傳送數據的主存地址常用的參數傳遞方法寄存器共享變量堆棧第3章:3.6.2用寄存器傳遞參數最簡單和常用的參數傳遞方法是通過寄存器,只要把參數存于約定的寄存器中就可以了由于通用寄存器個數有限,這種方法對少量數據可以直接傳遞數值,而對大量數據只能傳遞地址采用寄存器傳遞參數,注意帶有出口參數的寄存器不能保護和恢復,帶有入口參數的寄存器可以保護、也可以不保護,但最好能夠保持一致dpchardpstriHTOASC第3章:3.6.3用共享變量傳遞參數子程序和主程序使用同一個變量名存取數據就是利用共享變量(全局變量)進行參數傳遞如果變量定義和使用不在同一個源程序中,需要利用PUBLIC、EXTREN聲明如果主程序還要利用原來的變量值,則需要保護和恢復利用共享變量傳遞參數,子程序的通用性較差,但特別適合在多個程序段間、尤其在不同的程序模塊間傳遞數據第3章:3.6.4用堆棧傳遞參數參數傳遞還可以通過堆棧這個臨時存儲區。主程序將入口參數壓入堆棧,子程序從堆棧中取出參數;子程序將出口參數壓入堆棧,主程序彈出堆棧取得它們采用堆棧傳遞參數是程式化的,它是編譯程序處理參數傳遞、以及匯編語言與高級語言混合編程時的常規方法第3章:3.7宏(Macro)匯編宏是具有宏名的一段匯編語句序列宏需要先定義,然后在程序中進行宏調用由于形式上類似其他指令,所以常稱其為宏指令宏指令實際上是一段代碼序列的縮寫;在匯編時,匯編程序用對應的代碼序列替代宏指令因為是在匯編過程中實現的宏展開,所以常稱為宏匯編第3章:1.宏定義宏定義由一對宏匯編偽指令MACRO和ENDM來完成,格式如下:
宏名
MACRO[形參表]
……
;宏定義體
ENDM其中宏名是符合語法的標識符,同一源程序中該名字定義唯一。宏定義體中不僅可以是硬指令序列,還可以是偽指令語句序列可選的形參表給出了宏定義中用到的形式參數,每個形式參數之間用逗號分隔第3章:2.宏調用宏定義之后就可以使用它,即宏調用:
宏名
[實參表]宏調用的格式同一般指令一樣:在使用宏指令的位置寫下宏名,后跟實體參數;如果有多個參數,應按形參順序填入實參,也用逗號分隔在匯編時,宏指令被匯編程序用對應的代碼序列替代,這就是宏展開宏展開的具體過程是:當匯編程序掃描源程序遇到已有定義的宏調用時,即用相應的宏定義體完全替代源程序的宏指令,同時用位置匹配的實參對形參進行取代第3章:宏的實例1dispchar macrochar ;;宏定義
movah,2 ;;宏定義體
mov
dl,char
int21h
endm
…
dispchar‘?’ ;宏調用(宏指令)
…
1
movah,2 ;宏展開
1
movdl,’?’1 int21h第3章:宏的實例2dispmsg macromessage ;;宏定義
movah,9 ;;宏定義體
leadx,message
int21h
endm
…
dispmsgstring ;宏調用(宏指令)
…
1
movah,9
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年市政工程多維分析試題及答案
- 教育學原理教學目標
- 2025年工程經濟信息系統試題及答案
- 個人單位合同范例
- 公司車輛運輸合同范例
- 工程項目管理考試實戰試題及答案
- 創作服務合同范例
- 工程項目管理中的敏捷方法應用試題及答案
- 工程經濟行業發展試題及答案
- 出售磚廠土地合同范例
- 2025屆浙江省稽陽聯誼學校高三下學期4月二模政治試題 含解析
- 2025年全國學生愛眼護眼、預防近視知識考試題與答案
- 2025年北京市東城區九年級初三一模英語試卷(含答案)
- 中級宏觀經濟學知到課后答案智慧樹章節測試答案2025年春浙江大學
- 國開2024年秋《機械制圖》形考作業1-4答案
- 個人工勞務分包合同
- MOOC 創業管理-江蘇大學 中國大學慕課答案
- 2024年四川省自然資源投資集團有限責任公司招聘筆試參考題庫附帶答案詳解
- (高級)政工師理論考試題庫及答案(含各題型)
- SL631-637-2012-水利水電工程單元工程施工質量驗收評定標準
- DSP的指令系統
評論
0/150
提交評論