




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、( (計算機接口技術計算機接口技術) )第第3 3章章匯編語言匯編語言匯編語言的語句格式(見教材匯編語言的語句格式(見教材2425頁)頁)執行性語句執行性語句執行性語句用于表達處理執行性語句用于表達處理器指令器指令(也稱為硬指令也稱為硬指令),匯編后對應一條指,匯編后對應一條指令代碼。由處理器指令組成的代碼序列是令代碼。由處理器指令組成的代碼序列是程序設計的主體程序設計的主體標號標號: 硬指令助記符硬指令助記符 操作數操作數,操作數操作數 ;注釋注釋說明性語句說明性語句說明性語句用于表達偽指說明性語句用于表達偽指令,指示源程序如何匯編、變量怎樣定義、令,指示源程序如何匯編、變量怎樣定義、過程怎
2、么設置等過程怎么設置等名字名字 偽指令助記符偽指令助記符 參數參數,參數參數, ;注釋注釋硬指令與偽指令硬指令與偽指令硬指令(硬指令(Instruction)使使CPU產生動作、并產生動作、并在程序執行時才處理的指令在程序執行時才處理的指令硬指令就是第硬指令就是第2章學習的處理器指令,與具體的章學習的處理器指令,與具體的處理器有關、與匯編程序無關處理器有關、與匯編程序無關偽指令(偽指令(Directive)不產生不產生CPU動作、在程動作、在程序執行前由匯編程序處理的說明性指令序執行前由匯編程序處理的說明性指令偽指令與具體的處理器類型無關,但與匯編程序偽指令與具體的處理器類型無關,但與匯編程序
3、有關。不同版本的匯編程序支持不同的偽指令有關。不同版本的匯編程序支持不同的偽指令 硬指令和偽指令采用易于記憶的符合表達,這就是助記符標號、名字與標識符(見教材標號、名字與標識符(見教材25頁)頁)標號標號是反映硬指令位置(邏輯地址)和屬性的標是反映硬指令位置(邏輯地址)和屬性的標識符,后跟一個冒號分隔識符,后跟一個冒號分隔名字名字是反映偽指令位置(邏輯地址)和屬性的標是反映偽指令位置(邏輯地址)和屬性的標識符,后跟空格或制表符分隔,沒有冒號識符,后跟空格或制表符分隔,沒有冒號標識符標識符(Identifier)一般最多由)一般最多由31個字母、數字個字母、數字及規定的特殊符號(如及規定的特殊符
4、號(如 _、$、?、)組成,不)組成,不能以數字開頭。默認情況下,匯編程序不區別標能以數字開頭。默認情況下,匯編程序不區別標識符中的字母大小寫識符中的字母大小寫一個源程序中,每個標識符的定義是唯一的,還一個源程序中,每個標識符的定義是唯一的,還不能是匯編語言采用的不能是匯編語言采用的保留字保留字保留字保留字保留字(保留字(Reserved Word)是匯編程序已經)是匯編程序已經利用的標識符(也稱為關鍵字),主要有:利用的標識符(也稱為關鍵字),主要有:硬指令助記符硬指令助記符例如:例如:MOV、ADD偽指令助記符偽指令助記符例如:例如:DB、DW操作符操作符例如:例如:OFFSET、PTR寄
5、存器名寄存器名例如:例如:AX、CS預定義符號預定義符號例如:例如:data 匯編語言大小寫不敏感操作數和參數操作數和參數處理器指令的處理器指令的操作數操作數可以是立即數、寄存器可以是立即數、寄存器和存儲單元和存儲單元偽指令的偽指令的參數參數可以是常數、變量名、表達式可以是常數、變量名、表達式等,可以有多個,參數之間用逗號分隔等,可以有多個,參數之間用逗號分隔注釋注釋語句中由分號語句中由分號“;”開始的部分為注釋內容,開始的部分為注釋內容,用以增加源程序的可讀性用以增加源程序的可讀性必要時,一個語句行也可以由分號開始作為必要時,一個語句行也可以由分號開始作為階段性注釋階段性注釋匯編程序在翻譯源
6、程序時將跳過該部分,不匯編程序在翻譯源程序時將跳過該部分,不對它們做任何處理對它們做任何處理分隔符分隔符語句的語句的4個組成部分要用分隔符分開個組成部分要用分隔符分開標號后用冒號,注釋前用分號標號后用冒號,注釋前用分號操作數之間和參數之間使用逗號分隔操作數之間和參數之間使用逗號分隔其他部分通常采用空格或制表符其他部分通常采用空格或制表符多個空格和制表符的作用與一個相同多個空格和制表符的作用與一個相同MASM支持續行符支持續行符 “”例例3.1 在屏幕上顯示一段信息在屏幕上顯示一段信息; ;數據段(定義要顯示的字符串)數據段(定義要顯示的字符串)stringstringdbHello, Asse
7、mbly !,0dh,0ah,$dbHello, Assembly !,0dh,0ah,$; ;代碼段(顯示字符串的程序)代碼段(顯示字符串的程序)mov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hHello, Assembly !程序功能程序功能簡化段定義格式簡化段定義格式.model small;定義程序的;定義程序的存儲模式存儲模式(小型模式)(小型模式).stack;定義;定義堆棧段堆棧段(默認是(默認是1KB空間)空間).data;定義;定義數據段數據段;數據定義;數據定義.code;定義;定義
8、代碼段代碼段start: mov ax,data;程序;程序開始點開始點mov ds,ax;設置;設置DS指向用戶定義的數據段指向用戶定義的數據段;程序代碼;程序代碼mov ax,4c00hint 21h;程序終止點,返回;程序終止點,返回DOS;子程序代碼;子程序代碼end start;匯編結束,同時指明程序起始點;匯編結束,同時指明程序起始點start第一個源程序文件第一個源程序文件wj0301.asm;wj0301.asm.model small.stack.datastringstringdb Hello, Assembly !,0dh,0ah,$db Hello, Assembly
9、!,0dh,0ah,$.codestart:mov ax,datamov ds,axmov dx,offset stringmov dx,offset stringmov ah,9mov ah,9int 21hint 21hmov ax,4c00hint 21hend start1. 存儲模式(存儲模式(Memory Model)存儲模式存儲模式決定了一個程序的規模,也確定決定了一個程序的規模,也確定了子程序調用、指令轉移和數據訪問等的了子程序調用、指令轉移和數據訪問等的缺省屬性缺省屬性當使用簡化段定義的源程序格式時,必須當使用簡化段定義的源程序格式時,必須有存儲模式有存儲模式.MODEL語句
10、,且位于所有簡語句,且位于所有簡化段定義語句之前。其格式為:化段定義語句之前。其格式為:.MODEL 存儲模式存儲模式.MODEL語句確定了程序采用的存儲模式,語句確定了程序采用的存儲模式,MASM有有7種可以選擇,如表種可以選擇,如表3.1所示所示 本課程學習過程中,均采用小型模式SMALL2. 邏輯段的簡化定義邏輯段的簡化定義.STACK 大小大小;堆棧段定義偽指令;堆棧段定義偽指令.STACK創建一個堆棧段,段名是:創建一個堆棧段,段名是:STACK。可選的。可選的“大小大小”參數指定堆棧段所占存儲區的參數指定堆棧段所占存儲區的字節數,默認是字節數,默認是1KB(1024400H字節)字
11、節).DATA;數據段定義偽指令;數據段定義偽指令.DATA創建一個數據段,段名是:創建一個數據段,段名是:_DATA。數據段名可用。數據段名可用DATA預定義標識符表示預定義標識符表示.CODE 段名段名;代碼段定義偽指令;代碼段定義偽指令.CODE創建一個代碼段,可選的創建一個代碼段,可選的“段段名名”參數指定該代碼段的段名。如果沒有給出段名,則采參數指定該代碼段的段名。如果沒有給出段名,則采用默認段名用默認段名 一個段的開始自動結束前面的一個段 簡化段定義偽指令之前,需有存儲模式語句3. 程序開始程序開始為了指明程序開始執行的位置,需要使用一個標為了指明程序開始執行的位置,需要使用一個標
12、號(例題中采用了號(例題中采用了start標識符)標識符)連接程序會根據程序起始點正確地設置連接程序會根據程序起始點正確地設置CS和和IP值,值,根據程序大小和堆棧段大小設置根據程序大小和堆棧段大小設置SS和和SP值值連接程序沒有設置連接程序沒有設置DS和和ES值。程序如果使用數值。程序如果使用數據段或附加段,必須明確給據段或附加段,必須明確給DS或或ES賦值賦值大多數程序需要數據段,程序的執行開始應是:大多數程序需要數據段,程序的執行開始應是:start:mov ax,data;data表示數據段的段地址表示數據段的段地址mov ds,ax ;設置設置DS4. 程序終止程序終止應用程序執行結
13、束,應該將控制權交還操應用程序執行結束,應該將控制權交還操作系統作系統匯編語言程序設計中,有多種返回匯編語言程序設計中,有多種返回DOS的的方法,但一般利用方法,但一般利用DOS功能調用的功能調用的4CH子子功能實現,它需要的入口參數是功能實現,它需要的入口參數是AL返回返回數碼(通常用數碼(通常用0表示程序沒有錯誤)表示程序沒有錯誤)于是,應用程序的終止代碼就是:于是,應用程序的終止代碼就是:mov ax,4c00hint 21h5. 匯編結束匯編結束匯編結束表示匯編程序到此結束將源程序匯編結束表示匯編程序到此結束將源程序翻譯成目標模塊代碼的過程翻譯成目標模塊代碼的過程源程序的最后必須有一條
14、源程序的最后必須有一條END偽指令偽指令END 標號標號可選的可選的“標號標號”參數指定程序開始執行點,參數指定程序開始執行點,連接程序據此設置連接程序據此設置CS和和IP值(例題中采用值(例題中采用了了start標識符)標識符) 不要糊涂程序終止和匯編結束是兩碼事6. 可執行程序的結構可執行程序的結構DOS操作系統支持兩種可執行程序結構操作系統支持兩種可執行程序結構1. EXE程序程序程序可以有多個代碼段和多個數據段,程序長程序可以有多個代碼段和多個數據段,程序長度可以超過度可以超過64KB通常生成通常生成EXE結構的可執行程序結構的可執行程序2. COM程序程序只有一個邏輯段,程序長度不超
15、過只有一個邏輯段,程序長度不超過64KB需要滿足一定條件才能生成需要滿足一定條件才能生成COM結構的可執結構的可執行程序(行程序(MASM 6.x需要采用需要采用TINY模式)模式)3.2 常量、變量和屬性常量、變量和屬性 匯編語言的數據可以簡單分為常量和變量匯編語言的數據可以簡單分為常量和變量常量常量可以作為硬指令的立即數或偽指令的參可以作為硬指令的立即數或偽指令的參數,數,變量變量主要作為存儲器操作數主要作為存儲器操作數匯編語言語句中的匯編語言語句中的名字和標號名字和標號具有邏輯地址具有邏輯地址和類型屬性,主要用做地址操作數,也可以和類型屬性,主要用做地址操作數,也可以作為立即數和存儲器操
16、作數作為立即數和存儲器操作數本節將詳細討論語句中的參數和操作數、名本節將詳細討論語句中的參數和操作數、名字和標號,并引出相關的偽指令和操作符字和標號,并引出相關的偽指令和操作符3.2.1 常量常量常量表示一個固定的數值,它又分成多種形式常量表示一個固定的數值,它又分成多種形式常數字符串符合常量1. 數值表達式1. 常數常數指由指由10、16、2和和8進制形式表達的數值,各種進進制形式表達的數值,各種進制的數據以后綴字母區分,默認不加后綴字母的制的數據以后綴字母區分,默認不加后綴字母的是十進制數是十進制數十進制十進制由由0 9數字組成,以字母數字組成,以字母D(d)結)結尾(缺省情況可以省略)尾
17、(缺省情況可以省略)100,255D十六進制十六進制由由0 9、A F數字組成,以字母數字組成,以字母H(h)結尾,以字母開頭的常數需要)結尾,以字母開頭的常數需要加一個前導加一個前導064H,0FFH0B800H二進制二進制由由0和和1兩個數字組成,以字母兩個數字組成,以字母B(b)結尾結尾01100100B2. 字符串字符串字符串常量是用單引號或雙引號括起來的字符串常量是用單引號或雙引號括起來的單個字符或多個字符單個字符或多個字符其其數值是每個字符對應的數值是每個字符對應的ASCII碼值碼值例如:例如:d(等于(等于64H)AB(等于(等于4142H)Hello, Assembly !3.
18、 符號常量符號常量符號常量使用標識符表達一個數值符號常量使用標識符表達一個數值MASM提供等價機制,用來為常量定義符號名提供等價機制,用來為常量定義符號名符號定義偽指令有符號定義偽指令有“等價等價EQU”和和“等號等號”:符號名符號名 EQU 數值表達式數值表達式符號名符號名 EQU 符號名符號名 數值表達式數值表達式EQU用于數值等價時不能重復定義符號名,用于數值等價時不能重復定義符號名,但但“”允許有重復賦值。例如:允許有重復賦值。例如:X= 7;等效于:;等效于:X qeu 7X= X+5;“X EQU X+5”是錯誤的是錯誤的4. 數值表達式數值表達式數值表達式一般是指由數值表達式一般
19、是指由運算符運算符連接的各種常量所連接的各種常量所構成的表達式構成的表達式匯編程序在匯編過程中計算表達式,最終得到一匯編程序在匯編過程中計算表達式,最終得到一個確定的數值,所以也是常量個確定的數值,所以也是常量表達式的數值在程序運行前的匯編階段計算,所表達式的數值在程序運行前的匯編階段計算,所以組成表達式的各部分必須在匯編時就能確定以組成表達式的各部分必須在匯編時就能確定匯編語言支持多種運算符(匯編語言支持多種運算符(表表3.4)我們經常使用的是加減乘除(我們經常使用的是加減乘除( * / )例如:例如:mov ax,3*4+5;等價于:;等價于:mov ax,173.2.2 變量變量 變量變
20、量實質上是指主存單元的數據,雖然內存單元實質上是指主存單元的數據,雖然內存單元地址不變,但其中存放的數據可以改變地址不變,但其中存放的數據可以改變變量需要事先定義才能使用變量需要事先定義才能使用變量定義(變量定義(Define)偽指令為變量申請固定長度)偽指令為變量申請固定長度為單位的存儲空間,并可以同時將相應的存儲單為單位的存儲空間,并可以同時將相應的存儲單元初始化元初始化定義后的變量可以利用變量名等方法引用其中的定義后的變量可以利用變量名等方法引用其中的數據,即變量的數值數據,即變量的數值1. 變量的定義變量的定義 變量定義的匯編語言格式為:變量定義的匯編語言格式為:變量名變量名 偽指令偽
21、指令 初值表初值表變量名變量名為用戶自定義標識符,表示初值表首元素為用戶自定義標識符,表示初值表首元素的邏輯地址,常稱為符號地址。變量名也可以沒的邏輯地址,常稱為符號地址。變量名也可以沒有有初值表初值表是用逗號分隔的參數是用逗號分隔的參數,主要由常量、數值表主要由常量、數值表達式或達式或“?”組成。其中組成。其中“?”表示未賦初值表示未賦初值多個存儲單元如果初值相同,可以用復制操作符多個存儲單元如果初值相同,可以用復制操作符DUP進行定義:進行定義:重復次數重復次數 DUP(重復參數重復參數)變量定義偽指令有變量定義偽指令有DB、DW、DD等(表等(表3.5)字節變量的定義字節變量的定義DB(
22、Define Byte)DB偽指令用于分配一個或多個字節單元,偽指令用于分配一個或多個字節單元,并可以將它們初始化為指定值并可以將它們初始化為指定值初值表中每個數據一定是字節量,存放一初值表中每個數據一定是字節量,存放一個個8位數據:位數據:u可以是可以是0255的無符號數的無符號數u或是或是128127帶符號數帶符號數也可以是字符串常數也可以是字符串常數字節變量定義實例字節變量定義實例;數據段;數據段Xdb a,-5db 2 dup(100),?Ydb ABC字節變量的應用字節變量的應用mov al,X;此處;此處X表示它的第表示它的第1個數據,故個數據,故ALadec X+1;對;對X為始
23、的第為始的第2個數據減個數據減1,故成為,故成為6mov Y,al;現在;現在Y這個字符串成為這個字符串成為 aBC字變量的定義字變量的定義DW(Define Word)DW偽指令用于分配一個或多個字單元,并偽指令用于分配一個或多個字單元,并可以將它們初始化為指定值可以將它們初始化為指定值初值表中每個數據是字量,一個字單元可初值表中每個數據是字量,一個字單元可用于存放任何用于存放任何16位數據:位數據:u 一個段地址一個段地址u 一個偏移地址一個偏移地址u 兩個字符兩個字符u 065535之間的無符號數之間的無符號數3276832767之間的帶符號數之間的帶符號數字變量定義實例字變量定義實例;
24、數據段;數據段countdw 8000h,?,ABmaxintequ 64hnumberdw maxintarraydw maxint dup(0)雙字變量的定義雙字變量的定義DD(Define Double word)DD偽指令偽指令用于分配一個或多個雙字單元,用于分配一個或多個雙字單元,并可以將它們初始化為指定值并可以將它們初始化為指定值初值表中每個數據是一個初值表中每個數據是一個3232位的雙字量:位的雙字量:u 可以是有符號或無符號的可以是有符號或無符號的3232位整數位整數u 也可以用來表達也可以用來表達1616位段地址(高位字)和位段地址(高位字)和1616位位的偏移地址(低位字)
25、的遠指針的偏移地址(低位字)的遠指針varddvarddDD 0,?,12345678hDD 0,?,12345678hfarpointfarpoint DD 00400078hDD 00400078h2. 變量的應用變量的應用變量變量具有存儲單元的邏輯地址具有存儲單元的邏輯地址程序代碼中程序代碼中通過變量名引用其指向的首個數據通過變量名引用其指向的首個數據通過變量名加減位移量存取以首個數據為基地通過變量名加減位移量存取以首個數據為基地址的前后數據址的前后數據 例題例題3.2 變量的定義變量的定義 ;數據段數據段bvar1db 100,01100100b,64h,d;字節變量:不同進制表達同一
26、個數值,內存中有字節變量:不同進制表達同一個數值,內存中有4個個64Hminint = 5;符號常量:;符號常量:minint數值為數值為5,不占內存空間,不占內存空間bvar2db -1,minint,minint+5;內存中數值依次為;內存中數值依次為FFH,5,0AHdb ?,2 dup(20h);預留一個字節空間,重復定義了;預留一個字節空間,重復定義了2個數值個數值20Hwvar1 dw 2010h,4*4;字變量:兩個數據是;字變量:兩個數據是2010H、0010H,共占,共占4個字節個字節wvar2 dw ?;wvar2是沒有初值的字變量是沒有初值的字變量例題例題3.2 變量的定
27、義(續)變量的定義(續)dvardd 12347777h,87651111h,?;雙字變量:;雙字變量:2個雙字數據,一個雙字空間個雙字數據,一個雙字空間abcdb a,b,c,?;定義字符,實際是字節變量定義字符,實際是字節變量maxint equ 0ah;符號常量:符號常量:maxint10string db ABCDEFGHIJ;定義字符串:使用字節定義;定義字符串:使用字節定義DB偽指令偽指令crlfsdb 13,10,$;回車符;回車符0DH、換行符、換行符0AH和字符和字符$24Harray1 dw maxint dup(0);10個初值為個初值為0的字量,可以認為是數組的字量,可
28、以認為是數組arraydb 2 dup(2,3,2 dup(4);8個字節內容依次為:個字節內容依次為:02 03 04 04 02 03 04 04例題例題3.2 變量的應用變量的應用;代碼段;代碼段mov dl,bvar1;DL100dec bvar2+1;bvar2+14mov abc3,dl;abcabcdmov ax,word ptr dvar0;取雙字到;取雙字到DX.AXmov dx,word ptr dvar2add ax,word ptr dvar4;加雙字到;加雙字到DX.AXadc dx,word ptr dvar6mov word ptr dvar8,ax;保存雙字的求
29、和結果;保存雙字的求和結果mov word ptr dvar10,dx例題例題3.2 變量的應用(續)變量的應用(續)mov cx,maxint;CX10mov bx,0;BX0again:add stringbx,3;string每個數值加每個數值加3inc bxloop again;循環;循環lea dx,abc;從;從abc開始開始mov ah,9;09H號號DOS功能調用功能調用int 21h;顯示結果:;顯示結果:abcdDEFGHIJKLM3. 變量的定位變量的定位匯編程序按照指令的先后順序一個接著一個分配匯編程序按照指令的先后順序一個接著一個分配存儲空間,按照段定義偽指令規定的邊
30、界定位屬存儲空間,按照段定義偽指令規定的邊界定位屬性確定每個邏輯段的起始位置(包括偏移地址)性確定每個邏輯段的起始位置(包括偏移地址)定位偽指令定位偽指令ORG控制數據或代碼所在的偏移地址控制數據或代碼所在的偏移地址ORG 參數參數ORG偽指令是將當前偏移地址指針指向參數表達偽指令是將當前偏移地址指針指向參數表達的偏移地址。的偏移地址。例如:例如:ORG 100h;從;從100H處安排數據或程序處安排數據或程序ORG $+10;偏移地址加;偏移地址加10,即跳過,即跳過10個字節空間個字節空間匯編語言程序中,符號匯編語言程序中,符號“$”表示當前偏移地址值表示當前偏移地址值3.2.3 名字和標
31、號的屬性名字和標號的屬性名字和標號是用戶自定義的標識符。名字和標號是用戶自定義的標識符。名字名字指向一條指向一條偽指令,偽指令,標號標號指向一條硬指令。名字和標號一經使指向一條硬指令。名字和標號一經使用便具有兩類屬性:用便具有兩類屬性: 邏輯地址邏輯地址名字和標號對應存儲單元的邏輯名字和標號對應存儲單元的邏輯地址,含有段地址和偏移地址;地址,含有段地址和偏移地址; 類型類型變量名的類型可以是變量名的類型可以是BYTE(字節)、(字節)、WORD(字)和(字)和DWORD(雙字)等;標號、段(雙字)等;標號、段名、子程序名的類型可以是名、子程序名的類型可以是NEAR(近)和(近)和FAR(遠遠)
32、,分別表示段內或段間調用,分別表示段內或段間調用匯編程序提供有關的操作符,以便獲取這些屬性值匯編程序提供有關的操作符,以便獲取這些屬性值1. 地址操作符地址操作符地址操作符地址操作符取得名字或標號的段地址和偏移地址取得名字或標號的段地址和偏移地址 將括起的表達式作為存儲器地址指針將括起的表達式作為存儲器地址指針 $當前偏移地址當前偏移地址 :段前綴,采用指定的段地址寄存器段前綴,采用指定的段地址寄存器OFFSET 名字名字/標號標號返回名字或標號的偏移地址返回名字或標號的偏移地址SEG 名字名字/標號標號返回名字或標號的段地址返回名字或標號的段地址2. 類型操作符類型操作符類型操作符類型操作符
33、對名字或標號的類型屬性進行設置對名字或標號的類型屬性進行設置類型名類型名 PTR 名字名字/標號標號其中可以是其中可以是BYTE、WORD、DWORD(依次表示字(依次表示字節、字、雙字)等節、字、雙字)等,或者是或者是NEAR、FAR(分別表示(分別表示近、遠),還可以是由結構、記錄等定義的類型近、遠),還可以是由結構、記錄等定義的類型對變量:對變量:lLENGTHOF操作符獲知某變量名指向多少個數據項操作符獲知某變量名指向多少個數據項lSIZEOF操作符獲知它共占用多少字節空間操作符獲知它共占用多少字節空間3.3 順序程序設計順序程序設計沒有分支、循環等轉移指令的程序,會按沒有分支、循環等
34、轉移指令的程序,會按指令書寫的前后順利依次執行,這就是順指令書寫的前后順利依次執行,這就是順序程序序程序順序結構是最基本的程序結構順序結構是最基本的程序結構完全采用順序結構編寫的程序并不多見完全采用順序結構編寫的程序并不多見例題例題3.4 順序程序設計實例順序程序設計實例采用查表法,實現一位采用查表法,實現一位16進制數進制數轉換為轉換為ASCII碼顯示碼顯示例例3.4 數據段數據段;數據段數據段ASCII db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h;對應;對應0 9的的ASCII碼碼db 41h,42h,43h,44h,45h,46h;對應;對應A
35、F的的ASCII碼碼hexdb 04h,0bh;假設兩個數據;假設兩個數據例例3.4 代碼段代碼段 ;代碼段代碼段mov bx,offset ASCII;BX指向指向ASCII碼表碼表mov al,hex;AL取得一位取得一位16進制數進制數;恰好就是;恰好就是ASCII碼表中的位移碼表中的位移and al,0fh;只有低;只有低4位是有效的,高位是有效的,高4位清位清0 xlat;換碼:;換碼:ALDS:BXAL例例3.4 代碼段(續)代碼段(續)mov dl,al;入口參數:;入口參數:DLALmov ah,2;02號號DOS功能調用功能調用int 21h;顯示一個;顯示一個ASCII碼字
36、符碼字符mov al,hex+1;轉換并顯示下一個數據;轉換并顯示下一個數據and al,0fhxlatmov dl,almov ah,2int 21h3.4 分支程序設計分支程序設計分支程序根據條件是真或假決定執行與否分支程序根據條件是真或假決定執行與否判斷的條件是各種指令,如判斷的條件是各種指令,如CMP、TEST等等執行后形成的狀態標志執行后形成的狀態標志轉移指令轉移指令Jcc和和JMP可以實現分支控制可以實現分支控制分支結構有分支結構有單分支結構單分支結構雙分支結構雙分支結構多分支結構多分支結構單分支結構單分支結構 條件成立跳轉,否條件成立跳轉,否則順序執行分支語則順序執行分支語句體句
37、體注意選擇正確的條注意選擇正確的條件轉移指令和轉移件轉移指令和轉移目標地址目標地址計算計算AX中有符號數的絕對值中有符號數的絕對值cmp ax,0cmp ax,0jge nonnegjge nonneg;條件滿足(;條件滿足(AX0AX0),轉移),轉移neg axneg ax;條件不滿足,求補;條件不滿足,求補nonneg:nonneg: mov result,axmov result,ax ;保存結果;保存結果;不恰當的分支;不恰當的分支cmp ax,0cmp ax,0jl yesnegjl yesneg;條件滿足(;條件滿足(AXAX0 0),轉移),轉移jmp nonnegjmp no
38、nnegyesneg:yesneg: neg axneg ax;條件滿足,求補;條件滿足,求補nonneg:nonneg: mov result,axmov result,ax ;保存結果;保存結果雙分支結構雙分支結構條件成立跳轉執行第條件成立跳轉執行第2個個分支語句體,否則順序執分支語句體,否則順序執行第行第1個分支語句體個分支語句體注意第注意第1個分支體后一定個分支體后一定要有一個要有一個JMP指令跳到第指令跳到第2個分支體后個分支體后顯示顯示BX的最高位的最高位shl bx,1;BX最高位移入最高位移入CF標志標志jc one;CF1,即最高位為,即最高位為1,轉移,轉移mov dl,3
39、0h;CF0,即最高位為,即最高位為0:DL30H0jmp two;一定要跳過另一個分支體;一定要跳過另一個分支體one:mov dl,31h;DL 31H1two:mov ah,2int 21h;顯示;顯示顯示顯示BX的最高位(續)的最高位(續)shl bx,1;BX最高位移入最高位移入CF標志標志jnc one;CF0,即最高位為,即最高位為0,轉移,轉移mov dl,31h;CF1,即最高位為,即最高位為1:DL31H1jmp two;一定要跳過另一個分支體;一定要跳過另一個分支體one:mov dl,30h;DL 30H0two:mov ah,2int 21h;顯示;顯示顯示顯示BX的
40、最高位(另解)的最高位(另解)mov dl,0 ;DL30H0shl bx,1;BX最高位移入最高位移入CF標志標志jnc two;CF0,即最高位為,即最高位為0,轉移,轉移mov dl,1;CF1,即最高位為,即最高位為1:DL31H1two:mov ah,2int 21h;顯示;顯示 編寫分支程序,需留心分支的開始和結束編寫分支程序,需留心分支的開始和結束顯示顯示BX的最高位(無分支)的最高位(無分支)mov dl,0shl bx,1;BX最高位移入最高位移入CF標志標志adc dl,30h;CF0,DL030h030H0;CF1,DL030h131H1two: mov ah,2int
41、21h;顯示;顯示例題例題3.5 顯示壓縮顯示壓縮BCD碼,無前導碼,無前導0;數據段數據段BCDdb 04h ;代碼段代碼段mov dl,BCDtest dl,0ffh ;如果;如果BCD碼為碼為0,顯示,顯示0jz zero;雙分支結構;雙分支結構test dl,0f0h ;如果;如果BCD碼高位為碼高位為0,不顯示,不顯示0jz one;單分支結構;單分支結構例題例題3.5 顯示壓縮顯示壓縮BCD碼,無前導碼,無前導0(續)(續)mov cl,4;處理高位;處理高位shr dl,clor dl,30h;轉換為;轉換為ASCII碼碼mov ah,2;顯示高位;顯示高位int 21hmov
42、dl,BCDand dl,0fhone:or dl,30h;處理低位;處理低位jmp twozero: mov dl,0two:mov ah,2int 21h例題例題3.6 從鍵盤輸入一個字符串從鍵盤輸入一個字符串;數據段數據段keynum= 255keybufdb keynum; 鍵盤輸入緩沖區鍵盤輸入緩沖區db 0db keynum dup(0);代碼段代碼段mov dx,offset keybuf ;輸入字符串輸入字符串mov ah,0ahint 21hmov dl,0ah;再進行換行再進行換行mov ah,2int 21h例題例題3.6 大小寫字母轉換大小寫字母轉換 mov bx,of
43、fset keybuf+1 ;取出字符個數取出字符個數mov cl,bxmov ch,0;作為循環的次數作為循環的次數again: inc bxcmp dl,a;小于小寫字母小于小寫字母a,不需要處理,不需要處理jb dispcmp dl,z;大于小寫字母大于小寫字母z,不需要處理,不需要處理ja dispsub dl,20h;是小寫字母,則轉換為大寫是小寫字母,則轉換為大寫disp:mov ah,2;顯示一個字符顯示一個字符int 21hloop again;循環,處理完整個字符串循環,處理完整個字符串多分支結構多分支結構多分支結構是多個條件多分支結構是多個條件對應各自的分支語句體,對應各自
44、的分支語句體,哪個條件成立就轉入相哪個條件成立就轉入相應分支體執行應分支體執行AH=0fuction0YNAH=1fuction1YNAH=2fuction2YNor ah,ah;cmp ah,0jz function0dec ah;cmp ah,1jz function0dec ah;cmp ah,2jz function0例題例題3.7 地址表實現多分支結構地址表實現多分支結構;數據段數據段number db 78h;假設一個數值:假設一個數值:D3位為位為1addrsdw offset fun0, ,offset fun7;取得各處理程序開始的偏移地址取得各處理程序開始的偏移地址;代碼段
45、代碼段mov al,numbermov dl,?;數值為數值為0,顯示一個問號,顯示一個問號“?”cmp al,0;排除排除AL0的特殊情況的特殊情況jz disp例題例題3.7 地址表實現多分支結構(續)地址表實現多分支結構(續)mov bx,0;BX記錄為記錄為1的位數的位數again:shr al,1;最低位右移進入最低位右移進入CFjc next;為為1,轉移,轉移inc bx;不為不為1,繼續,繼續jmp againnext:shl bx,1;偏移地址是偏移地址是2個字節個字節jmp addrsbx;IPaddrsBXfun0:mov dl,0jmp dispdisp:mov ah,
46、2;顯示一個字符顯示一個字符int 21h3.5 循環程序設計循環程序設計循環程序結構循環程序結構是滿足一定條件的情況下,是滿足一定條件的情況下,重復執行某段程序重復執行某段程序循環結構的程序通常有循環結構的程序通常有3個部分:個部分: 循環初始部分循環初始部分為開始循環準備必要的條件,為開始循環準備必要的條件,如循環次數、循環體需要的數值等如循環次數、循環體需要的數值等 循環體部分循環體部分指重復執行的程序部分,其中指重復執行的程序部分,其中包括對循環條件等的修改程序段包括對循環條件等的修改程序段循環控制部分循環控制部分判斷循環條件是否成立,決判斷循環條件是否成立,決定是否繼續循環定是否繼續
47、循環循環控制循環控制循環結構程序循環結構程序的設計關鍵是循環控制部分的設計關鍵是循環控制部分循環控制可以在進入循環之前進行,也可循環控制可以在進入循環之前進行,也可以在循環體后進行,于是形成兩種結構:以在循環體后進行,于是形成兩種結構:“先判斷、后循環先判斷、后循環”結構結構“先循環、后判斷先循環、后判斷”結構結構循環結束的控制可以用循環次數,還可以循環結束的控制可以用循環次數,還可以用特定條件等,于是又有:用特定條件等,于是又有:計數控制循環計數控制循環條件控制循環條件控制循環先循環后判斷的循環結構先循環后判斷的循環結構 結束結束 初始化初始化 循環的初始狀態循環的初始狀態 循環體循環體 循
48、環的工作部分循環的工作部分及修改部分及修改部分 計數控制循環計數控制循環條件控制循環條件控制循環修改部分修改部分控制條件控制條件Y YN N3.5.1 計數控制循環計數控制循環 計數控制循環計數控制循環利用利用循環次數循環次數作作為控制條件為控制條件易于采用循環指令易于采用循環指令LOOP和和JCXZ實現實現初始化:將循環次數或最大循環初始化:將循環次數或最大循環次數置入次數置入CX循環體循環體循環控制:用循環控制:用LOOP指令對指令對CX減減1、并判斷是否為、并判斷是否為0例例3.8 二進制顯示二進制顯示BL內容內容mov cx,8;CX8(循環次數)(循環次數)again: shl bl
49、,1;左移進;左移進CF,從高位開始顯示從高位開始顯示mov dl,0;MOV指令不改變指令不改變CFadc dl,30h ;DL030HCF;CF若是若是0,則,則DL 0 ;CF若是若是1,則,則DL 1 mov ah,2int 21h;顯示;顯示loop again;CX減減1,如果,如果CX未減至未減至0,則循環,則循環計數控制循環計數控制循環先循環后判斷先循環后判斷例例3.9 求數組元素的最大值和最小值求數組元素的最大值和最小值;數據段數據段arraydw 10;假設一個數組,其中頭個數據;假設一個數組,其中頭個數據10表示元素個數表示元素個數dw -3,0,20,900,587,-
50、632,777,234,-34,-56;這是一個有符號字量元素組成的數組;這是一個有符號字量元素組成的數組maxay dw ?;存放最大值;存放最大值minay dw ?;存放最小值;存放最小值初始化:循環次數元素個數初始化:循環次數元素個數1循環體:逐個比較求最大、小值循環體:逐個比較求最大、小值循環控制:比較完所有數據循環控制:比較完所有數據例例3.9 代碼段代碼段;代碼段;代碼段lea si,arraymov cx,si;取得元素個數;取得元素個數dec cx;減;減1后是循環次數后是循環次數add si,2mov ax,si;取出第一個元素給;取出第一個元素給AX,AX用于暫存最大值用
51、于暫存最大值mov bx,ax;取出第一個元素給;取出第一個元素給BX,BX用于暫存最小值用于暫存最小值初始化例例3.9 代碼段(續)代碼段(續)maxck: add si,2cmp si,ax;與下一個數據比較;與下一個數據比較jle minckmov ax,si;AX取得更大的數據取得更大的數據jmp nextminck:cmp si,bxjge nextmov bx,si;BX取得更小的數據取得更小的數據next:loop maxck;計數循環;計數循環mov maxay,ax ;保存最大值;保存最大值mov minay,bx;保存最小值;保存最小值循環體例例3.10 鍵盤輸入鍵盤輸入N
52、,顯示,顯示N個個“?”mov ah,1;接受鍵盤輸入接受鍵盤輸入int 21hand al,0fh;只取低只取低4位位xor ah,ahmov cx,ax;作為循環次數作為循環次數jcxz done;次數為次數為0,則結束,則結束again:mov dl,?;循環體循環體mov ah,2int 21hloop again;循環控制循環控制done:;結束結束“邊界”問題3.5.2 條件控制循環條件控制循環條件控制循環需要利用特定條件判條件控制循環需要利用特定條件判斷循環是否結束斷循環是否結束條件控制循環用條件轉移指令判斷條件控制循環用條件轉移指令判斷循環條件循環條件轉移指令可以指定目的標號來
53、改變轉移指令可以指定目的標號來改變程序的運行順序,如果目的標號指程序的運行順序,如果目的標號指向一個重復執行的語句體的開始或向一個重復執行的語句體的開始或結束,便構成了循環控制結構結束,便構成了循環控制結構顯示以顯示以0結尾的字符串結尾的字符串;數據段;數據段string db Let us have a try !,0;代碼段;代碼段mov bx,offset stringagain: mov dl,bxcmp dl,0jz done;為;為0結束結束mov ah,2;不為;不為0,顯示,顯示int 21hinc bx;指向下一個字符;指向下一個字符jmp againdone:條件控制循環條件控制循環先判斷后循環先判斷后循環例例3.11 記錄某個字存儲單元數據中記錄某個字存儲單元數據中1的個數的個數;數據段數據段number dw 1110111
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 砼結構構件施工過程中的質量監督與檢查考核試卷
- 證券從業資格證考試的復習技巧試題及答案
- 抗生素使用指導的檢驗依據試題及答案
- 2025年會計風險控制流程試題及答案
- 2024項目管理考試深入探討試題及答案
- 福建事業單位考試試題及答案突破技巧
- 石墨在電化學電容器材料的應用考核試卷
- 涂料生產過程智能化考核試卷
- 生物能源與碳減排考核試卷
- 管道工程國際合作與交流考核試卷
- 川教版《生命生態安全》九年級下冊第十課樹立生態文明意識 課件
- GB/T 9442-2024鑄造用硅砂
- 中國椎管內分娩鎮痛專家共識(2020版)
- 2023-2024學年天津市紅橋區八年級(下)期中數學試卷(含解析)
- 國開2024年《機械設計基礎》形考任務1-4答案
- ifix培訓教程課件
- 社會單位消防安全風險自查評估報告表模板
- 精神科出院康復指導
- 2024年貴州建筑安全員B證考試題庫及答案(推薦)
- sls打印工藝流程
- PHQ-15軀體癥狀群健康評定量表
評論
0/150
提交評論