|
指令系統(tǒng)確定了CPU所能完成的功能,是用匯編語言進行程序設計的最基本部分。如果不熟悉匯編指令的功能及其有關規(guī)定,那么,肯定不能靈活運用匯編語言。所以,本章的內容是學習本課程的重點和難點。 5.1 匯編語言指令格式 為了介紹指令系統(tǒng)中指令的功能,先要清楚匯編語言是如何書寫指令的,這就象在學習高級語言程序設計時,要清楚高級語言語句的語義、語法及其相關規(guī)定一樣。 5.1.1 指令格式 匯編語言的指令格式如下: 指令助憶符 [操作數1 [, 操作數2 [, 操作數3]]] [;注釋] 指令助憶符體現該指令的功能,它對應一條二進制編碼的機器指令。指令的操作數個數由該指令的確定,可以沒有操作數,也可以有一個、二個或三個操作數。絕大多數指令的操作數要顯式的寫出來,但也有指令的操作數是隱含的,不需要在指令中寫出。 當指令含有操作數,并要求在指令中顯式地寫出來時,則在書寫時必須遵守: 指令助憶符和操作數之間要有分隔符,分隔符可以是若干個空格或TAB鍵; 如果指令含有多個操作數,那么,操作數之間要用逗號","分開。 指令后面還可以書寫注釋內容,不過,要在注釋之前書寫分號";"。 5.1.2 了解指令的幾個方面 在學習匯編指令時,指令的功能無疑是我們學習和掌握的重點,但要準確、有效地運用這些指令,我們還要熟悉系統(tǒng)對每條指令的一些規(guī)定或約束。 歸納起來,對指令還要掌握以下幾個方面內容: 、要求指令操作數的尋址方式; 、指令對標志位的影響、標志位對指令的影響; 、指令的執(zhí)行時間,對可完成同樣功能的指令,要選用執(zhí)行時間短的指令 匯編指令系統(tǒng) 指令系統(tǒng)是CPU指令的集合,CPU除了具有計算功能的指令外,還有實現其它功能的指令,也有為某種特殊的應用而增設的指令。 通常,把指令按其功能分成以下幾大類: 數據傳送指令 標志位操作指令 算術運算指令 邏輯運算指令 移位操作指令 位操作指令 比較運算指令 下面,我們逐一介紹每類指令中的指令。循環(huán)指令 轉移指令 條件設置字節(jié)指令 字符串操作指令 ASCII-BCD碼運算調整指令 處理器指令
5.2.1 數據傳送指令 數據傳送指令又分為:傳送指令、交換指令、地址傳送指令、堆棧操作指令、轉換指令和I/O指令等。 除了標志位操作指令SAHF和POPF指令外,本類的其它指令都不影響標志位。 1、傳送指令MOV(Move Instruction) 傳送指令是使用最頻繁的指令,它相對于高級語言里的賦值語句。指令的格式如下: MOV Reg/Mem, Reg/Mem/Imm 其中:Reg—Register(寄存器),Mem—Memory(存儲器),Imm—Immediate(立即數),它們可以是8位、16位或32位(特別指出其位數的除外)。在本網絡課件的網頁中,都將采用上述縮寫,此后不再說明。 指令的功能是把源操作數(第二操作數)的值傳給目的操作數(第一操作數)。指令執(zhí)行后,目的操作數的值被改變,而源操作數的值不變。在存儲單元是該指令的一個操作數時,該操作數的尋址方式可以是任意一種存儲單元尋址方式。 下面列舉幾組正確的指令例子: 源操作數是寄存器 MOV CH, ALMOV BP, SPMOV ECX, EBX MOV DS, AXMOV [BX], CHMOV [BX+SI], AX 源操作數是存儲單元 MOV AL, [100H]MOV BX, ES:[DI]MOV EDX, [BX] MOV BX, VARWMOV AX, [BX+SI]MOV CH, [BX+DI+100H] 其中:VARW是字類型內存變量(下同)。 源操作數是立即數 MOV AL, 89HMOV BX, -100HMOV EDX, 12345678H MOV VARW, 200HMOV [BX], 2345HMOV [BX+DI], 1234H
在匯編語言中,主要的數據傳送方式如圖5.1所示。雖然一條MOV指令能實現其中大多數的數據傳送方式,但也存在MOV指令不能實現的傳送方式。
圖5.1 MOV指令數據傳送示意圖 對MOV指令有以下幾條具體規(guī)定,其中有些規(guī)定對其它指令也同樣有效。 1)、兩個操作數的數據類型要相同,要同為8位、16位或32位;如:MOV BL, AX等是不正確的; 2)、兩個操作數不能同時為段寄存器,如:MOV ES, DS等; 3)、代碼段寄存器CS不能為目的操作數,但可作為源操作數,如:指令MOV CS, AX等不正確,但指令MOV AX, CS等是正確的; 4)、立即數不能直接傳給段寄存器,如:MOV DS, 100H等; 5)、立即數不能作為目的操作數,如:MOV 100H, AX等; 6)、指令指針IP,不能作為MOV指令的操作數; 7)、兩個操作數不能同時為存儲單元,如:MOV VARA, VARB等,其中VARA和VARB是同數據類型的內存變量。
對于規(guī)定2、4和7,我們可以用通用寄存器作為中轉來達到最終目的。表5.1列舉一個可行的解決方案,盡供參考。讀者可考慮用其它辦法來完成同樣的功能。 表5.1 MOV指令的變通方法 功能描述不正確的指令可選的解決方法 把DS的值傳送給ESMOV ES, DSMOV AX, DS MOV ES, AX 把100H傳給DSMOV DS, 100HMOV AX, 100H MOV DS, AX 把字變量VARB的值傳送給字變量VARAMOV VARA, VARBMOV AX, VARB MOV VARA, AX
對于情況1:不同位數數據之間的傳送問題,在80386及其以后的CPU中,增加一組新的指令——傳送-填充指令,它可把位數少的源操作數傳送給位數多的目的操作數,多出的部分按指令的規(guī)定進行填充。 傳送—填充指令(MOVe-and-Fill Instruction) 2、傳送—填充指令(MOVe-and-Fill Instruction) 傳送—填充指令是把位數短的源操作數傳送給位數長的目的操作數。指令格式如下: MOVSX/MOVZX Reg/Mem, Reg/Mem/Imm ;80386+ 其中:80386+表示80386及其之后的CPU,其它類似符號含義類同,不再說明。 指令的主要功能和限制與MOV指令類似,不同之處是:在傳送時,對目的操作數的高位進行填充。根據其填充方式,又分為:符號填充和零填充。 傳送—填充指令的功能如圖5.2所示。 (a). MOVSX的執(zhí)行效果 (b). MOVZX的執(zhí)行效果
圖5.2 傳送—填充指令執(zhí)行過程示意圖 、符號填充指令MOVSX(Move with Sign-Extend) MOVSX的填充方式是:用源操作數的符號位來填充目的操作數的高位數據位。 、零填充指令MOVZX(Move with Zero-Extend) MOVZX的填充方式是:恒用0來填充目的操作數的高位數據位。 例5.1 已知:AL=87H,指令MOVSX CX, AL,MOVZX DX, AL執(zhí)行后,問CX和DX的值是什么? 解:根據傳送-填充指令的填充方式可知: 指令MOVSX CX, AL執(zhí)行后,(CX)=0FF87H,指令MOVZX DX, AL執(zhí)行后,(DX)=0087H。 從上例可看出,兩條指令的源操作數完全一樣,但因為它們的填充方式不同,所得到的結果而就不同。 試比較下列指令,分析它們執(zhí)行結果的相同和不同之處: MOV AX, 87H MOVSX AX, 87H MOVZX AX, 87H 3、交換指令XCHG(Exchange Instruction) 交換指令XCHG是兩個寄存器,寄存器和內存變量之間內容的交換指令,兩個操作數的數據類型要相同。其指令格式如下: XCHG Reg/Mem, Reg/Mem 該指令的功能和MOV指令不同,后者是一個操作數的內容被修改,而前者是兩個操作數都會發(fā)生改變。寄存器不能是段寄存器,兩個操作數也不能同時為內存變量。 XCHG指令的功能如圖5.3所示。 圖5.3 XCHG指令的執(zhí)行功能示意圖
例5.2 已知:AX=5678H,BX=1234H,指令XCHG AX, BX執(zhí)行后,AX和BX的值是什么? 解:這是兩個寄存器內容進行交換,指令執(zhí)行后,有:(AX)=1234H,(BX)=5678H。 HTTP協(xié)議狀態(tài)碼的含義 "100" : Continue "101" : witching Protocols "200" : OK "201" : Created "202" : Accepted "203" : Non-Authoritative Information "204" : No Content "205" : Reset Content "206" : Partial Content "300" : Multiple Choices "301" : MOVed Permanently "302" : Found "303" : See Other "304" : Not Modified "305" : Use Proxy "307" : Temporary Redirect "400" : Bad Request "401" : Unauthorized "402" : Payment Required "403" : Forbidden "404" : Not Found "405" : Method Not Allowed "406" : Not Acceptable "407" : Proxy Authentication Required "408" : Request Time-out "409" : Conflict "410" : Gone "411" : Length Required "412" : Precondition Failed "413" : Request Entity Too Large "414" : Request-URI Too Large "415" : Unsupported Media Type "416" : Requested range not satisfiable "417" : Expectation Failed "500" : Internal Server Error "501" : Not Implemented "502" : Bad Gateway "503" : Service Unavailable "504" : Gateway Time-out "505" : HTTP Version not supported |