|
指令系統(tǒng)確定了CPU所能完成的功能,是用匯編語言進(jìn)行程序設(shè)計的最基本部分。如果不熟悉匯編指令的功能及其有關(guān)規(guī)定,那么,肯定不能靈活運(yùn)用匯編語言。所以,本章的內(nèi)容是學(xué)習(xí)本課程的重點(diǎn)和難點(diǎn)。 5.1 匯編語言指令格式 為了介紹指令系統(tǒng)中指令的功能,先要清楚匯編語言是如何書寫指令的,這就象在學(xué)習(xí)高級語言程序設(shè)計時,要清楚高級語言語句的語義、語法及其相關(guān)規(guī)定一樣。 5.1.1 指令格式 匯編語言的指令格式如下: 指令助憶符 [操作數(shù)1 [, 操作數(shù)2 [, 操作數(shù)3]]] [;注釋] 指令助憶符體現(xiàn)該指令的功能,它對應(yīng)一條二進(jìn)制編碼的機(jī)器指令。指令的操作數(shù)個數(shù)由該指令的確定,可以沒有操作數(shù),也可以有一個、二個或三個操作數(shù)。絕大多數(shù)指令的操作數(shù)要顯式的寫出來,但也有指令的操作數(shù)是隱含的,不需要在指令中寫出。 當(dāng)指令含有操作數(shù),并要求在指令中顯式地寫出來時,則在書寫時必須遵守: 指令助憶符和操作數(shù)之間要有分隔符,分隔符可以是若干個空格或TAB鍵; 如果指令含有多個操作數(shù),那么,操作數(shù)之間要用逗號","分開。 指令后面還可以書寫注釋內(nèi)容,不過,要在注釋之前書寫分號";"。 5.1.2 了解指令的幾個方面 在學(xué)習(xí)匯編指令時,指令的功能無疑是我們學(xué)習(xí)和掌握的重點(diǎn),但要準(zhǔn)確、有效地運(yùn)用這些指令,我們還要熟悉系統(tǒng)對每條指令的一些規(guī)定或約束。 歸納起來,對指令還要掌握以下幾個方面內(nèi)容: 、要求指令操作數(shù)的尋址方式; 、指令對標(biāo)志位的影響、標(biāo)志位對指令的影響; 、指令的執(zhí)行時間,對可完成同樣功能的指令,要選用執(zhí)行時間短的指令 匯編指令系統(tǒng) 指令系統(tǒng)是CPU指令的集合,CPU除了具有計算功能的指令外,還有實(shí)現(xiàn)其它功能的指令,也有為某種特殊的應(yīng)用而增設(shè)的指令。 通常,把指令按其功能分成以下幾大類: 數(shù)據(jù)傳送指令 標(biāo)志位操作指令 算術(shù)運(yùn)算指令 邏輯運(yùn)算指令 移位操作指令 位操作指令 比較運(yùn)算指令 下面,我們逐一介紹每類指令中的指令。循環(huán)指令 轉(zhuǎn)移指令 條件設(shè)置字節(jié)指令 字符串操作指令 ASCII-BCD碼運(yùn)算調(diào)整指令 處理器指令
5.2.1 數(shù)據(jù)傳送指令 數(shù)據(jù)傳送指令又分為:傳送指令、交換指令、地址傳送指令、堆棧操作指令、轉(zhuǎn)換指令和I/O指令等。 除了標(biāo)志位操作指令SAHF和POPF指令外,本類的其它指令都不影響標(biāo)志位。 1、傳送指令MOV(Move Instruction) 傳送指令是使用最頻繁的指令,它相對于高級語言里的賦值語句。指令的格式如下: MOV Reg/Mem, Reg/Mem/Imm 其中:Reg—Register(寄存器),Mem—Memory(存儲器),Imm—Immediate(立即數(shù)),它們可以是8位、16位或32位(特別指出其位數(shù)的除外)。在本網(wǎng)絡(luò)課件的網(wǎng)頁中,都將采用上述縮寫,此后不再說明。 指令的功能是把源操作數(shù)(第二操作數(shù))的值傳給目的操作數(shù)(第一操作數(shù))。指令執(zhí)行后,目的操作數(shù)的值被改變,而源操作數(shù)的值不變。在存儲單元是該指令的一個操作數(shù)時,該操作數(shù)的尋址方式可以是任意一種存儲單元尋址方式。 下面列舉幾組正確的指令例子: 源操作數(shù)是寄存器 MOV CH, ALMOV BP, SPMOV ECX, EBX MOV DS, AXMOV [BX], CHMOV [BX+SI], AX 源操作數(shù)是存儲單元 MOV AL, [100H]MOV BX, ES:[DI]MOV EDX, [BX] MOV BX, VARWMOV AX, [BX+SI]MOV CH, [BX+DI+100H] 其中:VARW是字類型內(nèi)存變量(下同)。 源操作數(shù)是立即數(shù) MOV AL, 89HMOV BX, -100HMOV EDX, 12345678H MOV VARW, 200HMOV [BX], 2345HMOV [BX+DI], 1234H
在匯編語言中,主要的數(shù)據(jù)傳送方式如圖5.1所示。雖然一條MOV指令能實(shí)現(xiàn)其中大多數(shù)的數(shù)據(jù)傳送方式,但也存在MOV指令不能實(shí)現(xiàn)的傳送方式。
圖5.1 MOV指令數(shù)據(jù)傳送示意圖 對MOV指令有以下幾條具體規(guī)定,其中有些規(guī)定對其它指令也同樣有效。 1)、兩個操作數(shù)的數(shù)據(jù)類型要相同,要同為8位、16位或32位;如:MOV BL, AX等是不正確的; 2)、兩個操作數(shù)不能同時為段寄存器,如:MOV ES, DS等; 3)、代碼段寄存器CS不能為目的操作數(shù),但可作為源操作數(shù),如:指令MOV CS, AX等不正確,但指令MOV AX, CS等是正確的; 4)、立即數(shù)不能直接傳給段寄存器,如:MOV DS, 100H等; 5)、立即數(shù)不能作為目的操作數(shù),如:MOV 100H, AX等; 6)、指令指針IP,不能作為MOV指令的操作數(shù); 7)、兩個操作數(shù)不能同時為存儲單元,如:MOV VARA, VARB等,其中VARA和VARB是同數(shù)據(jù)類型的內(nèi)存變量。
對于規(guī)定2、4和7,我們可以用通用寄存器作為中轉(zhuǎn)來達(dá)到最終目的。表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:不同位數(shù)數(shù)據(jù)之間的傳送問題,在80386及其以后的CPU中,增加一組新的指令——傳送-填充指令,它可把位數(shù)少的源操作數(shù)傳送給位數(shù)多的目的操作數(shù),多出的部分按指令的規(guī)定進(jìn)行填充。 傳送—填充指令(MOVe-and-Fill Instruction) 2、傳送—填充指令(MOVe-and-Fill Instruction) 傳送—填充指令是把位數(shù)短的源操作數(shù)傳送給位數(shù)長的目的操作數(shù)。指令格式如下: MOVSX/MOVZX Reg/Mem, Reg/Mem/Imm ;80386+ 其中:80386+表示80386及其之后的CPU,其它類似符號含義類同,不再說明。 指令的主要功能和限制與MOV指令類似,不同之處是:在傳送時,對目的操作數(shù)的高位進(jìn)行填充。根據(jù)其填充方式,又分為:符號填充和零填充。 傳送—填充指令的功能如圖5.2所示。 (a). MOVSX的執(zhí)行效果 (b). MOVZX的執(zhí)行效果
圖5.2 傳送—填充指令執(zhí)行過程示意圖 、符號填充指令MOVSX(Move with Sign-Extend) MOVSX的填充方式是:用源操作數(shù)的符號位來填充目的操作數(shù)的高位數(shù)據(jù)位。 、零填充指令MOVZX(Move with Zero-Extend) MOVZX的填充方式是:恒用0來填充目的操作數(shù)的高位數(shù)據(jù)位。 例5.1 已知:AL=87H,指令MOVSX CX, AL,MOVZX DX, AL執(zhí)行后,問CX和DX的值是什么? 解:根據(jù)傳送-填充指令的填充方式可知: 指令MOVSX CX, AL執(zhí)行后,(CX)=0FF87H,指令MOVZX DX, AL執(zhí)行后,(DX)=0087H。 從上例可看出,兩條指令的源操作數(shù)完全一樣,但因?yàn)樗鼈兊奶畛浞绞讲煌,所得到的結(jié)果而就不同。 試比較下列指令,分析它們執(zhí)行結(jié)果的相同和不同之處: MOV AX, 87H MOVSX AX, 87H MOVZX AX, 87H 3、交換指令XCHG(Exchange Instruction) 交換指令XCHG是兩個寄存器,寄存器和內(nèi)存變量之間內(nèi)容的交換指令,兩個操作數(shù)的數(shù)據(jù)類型要相同。其指令格式如下: XCHG Reg/Mem, Reg/Mem 該指令的功能和MOV指令不同,后者是一個操作數(shù)的內(nèi)容被修改,而前者是兩個操作數(shù)都會發(fā)生改變。寄存器不能是段寄存器,兩個操作數(shù)也不能同時為內(nèi)存變量。 XCHG指令的功能如圖5.3所示。 圖5.3 XCHG指令的執(zhí)行功能示意圖
例5.2 已知:AX=5678H,BX=1234H,指令XCHG AX, BX執(zhí)行后,AX和BX的值是什么? 解:這是兩個寄存器內(nèi)容進(jìn)行交換,指令執(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 |