版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1第4章匯編語言與匯編程序
2
本章主要介紹:8086CPU指令的基本格式及尋址方式;8086指令系統(tǒng);匯編語言的基本語法;DOS功能調(diào)用;匯編語言程序設(shè)計(jì)的基本方法。重點(diǎn)是8086CPU指令的尋址方式、指令系統(tǒng)和匯編語言程序設(shè)計(jì)的基本方法。
34.1匯編語言的語法要素
4第4章匯編語言與匯編程序
匯編語言的語法要素有標(biāo)識符、保留字、常量、數(shù)值表達(dá)式、標(biāo)號、變量和地址表達(dá)式等。4.1.1標(biāo)識符標(biāo)識符是程序中用于指定段名、變量名、符號常量名、標(biāo)號名等的字符串。和高級語言的變量名一樣,一般要求標(biāo)識符盡可能取得有點(diǎn)含義,這會大大改善程序的可讀性,并有助于對程序的理解,標(biāo)識符的使用要做到“見其名,知其義”。
5第4章匯編語言與匯編程序
4.1.1標(biāo)識符標(biāo)識符的命名規(guī)則:(1)由字母、數(shù)字、專用符號“?”、“.”、“@”、“$”、“_”等字符組成。(2)數(shù)字不能作為首字符,“.”只能作為首字符。(3)有效字符為31個。通常情況下,匯編語言不區(qū)分標(biāo)識符中字母的大小寫。6第4章匯編語言與匯編程序
4.1.1標(biāo)識符為了區(qū)別標(biāo)識符和數(shù)據(jù),以字母開始的十六進(jìn)制數(shù),要在其前面添加一個前導(dǎo)0。如8位補(bǔ)碼數(shù)-1,應(yīng)寫為0FFH。例4.1:試比較ABCDH和0ABCDH之間的差異。前者是標(biāo)識符,而后者是十六位進(jìn)制數(shù)值。7第4章匯編語言與匯編程序
4.1.2保留字保留字是匯編語言中預(yù)留的、具有固定用途的字符串。所有的寄存器名、指令及偽指令的助記符、運(yùn)算符都屬于保留字,編程時不允許作它用。如程序中的DB、MOV、SEGMENT、CX等。
例4.2:MSG1、ERRMSG2、ASC1、asc2等是合法的標(biāo)識符,而1a、ah、mov等就不是合法的標(biāo)識符,這些是屬于保留字。
8第4章匯編語言與匯編程序
4.1.3常量常量是程序運(yùn)行中數(shù)值不變的量。有數(shù)值常量和符號常量。
常量可以數(shù)值形式出現(xiàn)在符號指令中,這種常量稱作數(shù)值常量;
將經(jīng)常使用的數(shù)值預(yù)先定義一個名字,然后用該名字來表示該常量,這種常量稱作符號常量。9第4章匯編語言與匯編程序
4.1.3常量
數(shù)值常量,常用的有二進(jìn)制數(shù)、十進(jìn)制數(shù)、十六進(jìn)制數(shù)和ASCII碼字符。ASCII碼字符用作數(shù)值常量時,需用單引號引起來,如‘B’、‘BC’、‘$’等所有可以打印或顯示的ASCII碼字符。
符號常量,需使用相應(yīng)的賦值偽指令EQU或“=”號定義。
例4.3:XEQU212或X=21210第4章匯編語言與匯編程序
4.1.4數(shù)值表達(dá)式數(shù)值表達(dá)式由常量與運(yùn)算符構(gòu)成。運(yùn)算符分三類:算術(shù)運(yùn)算符(+、-、×、/、MOD)、邏輯運(yùn)算符(AND、OR、XOR、NOT)和關(guān)系運(yùn)算符(EQ、NE、LT、GT、LE、GE)3種運(yùn)算。11第4章匯編語言與匯編程序
4.1.5標(biāo)號標(biāo)號是機(jī)器指令在內(nèi)存中的符號地址。匯編語言程序中第一條指令、轉(zhuǎn)移的目標(biāo)指令和重復(fù)執(zhí)行的指令前面都要加上一個標(biāo)號,作為轉(zhuǎn)移指令或循環(huán)指令的目的地址。標(biāo)號名也由程序員遵循標(biāo)識符命名規(guī)則命名。標(biāo)號一般只在代碼段中定義和使用,標(biāo)號代表指令的地址,由標(biāo)識符和冒號組成。程序開始處的標(biāo)號,需在代碼段結(jié)束之后,加上“END標(biāo)號”,如“ENDSTART”。12第4章匯編語言與匯編程序
4.1.5標(biāo)號標(biāo)號有3個屬性:段地址、偏移地址和類型。標(biāo)號的段地址是定義該標(biāo)號所在段的段地址。標(biāo)號的偏移地址是標(biāo)號所在段的段首址到該標(biāo)號定義指令的字節(jié)距離。標(biāo)號的類型有NEAR和FAR兩種。用“:”定義的標(biāo)號為NEAR類型,NEAR類型的標(biāo)號只能在定義該標(biāo)號的段內(nèi)使用,而FAR類型的標(biāo)號卻無此限制。
13第4章匯編語言與匯編程序
4.1.6變量和地址表達(dá)式變量是存儲器中的數(shù)據(jù)或數(shù)據(jù)區(qū)的符號表示。變量名即是數(shù)據(jù)的地址或數(shù)據(jù)區(qū)的首地址。地址表達(dá)式是由變量、常量、寄存器(SI、DI、BX、BP)的內(nèi)容(用寄存器名置入方括號中表示)和運(yùn)算符組成的有意義的式子。指令中的存儲器的地址可以用變量或地址表達(dá)式給出。
14第4章匯編語言與匯編程序
4.1.6變量和地址表達(dá)式由于存儲器是分段使用的,因此變量或地址表達(dá)式都具有3重屬性:段地址、偏移地址和類型。變量的段地址是指變量所在段的段首地址除以10H之商。當(dāng)需要訪問該變量時,其段地址一定要在其相應(yīng)的段寄存器中。變量的偏移地址是指變量所在段的段首址到該變量的字節(jié)距離。變量的段地址和偏移地址分別用SEG或OFFSET兩個算符來指定,只要在操作數(shù)中指定帶SEG或OFFSET算符的變量名,就可以分別產(chǎn)生該變量的段地址或偏移地址。例4.4:變量Y的段地址和偏移地址可表示為SEGY和OFFSETY。
15第4章匯編語言與匯編程序
4.1.6變量和地址表達(dá)式變量的類型是指存取該變量中的數(shù)據(jù)所需要的字節(jié)數(shù)。變量的類型可以是字節(jié)(Byte)、字(Word)、雙字(Dword)、4字(Qword)和10字節(jié)(Tbyte)。變量使用數(shù)據(jù)定義偽指令DB(定義字節(jié))、DW(定義字)、DD(定義雙字)、DQ(定義4字)、DT(定義10字節(jié))來定義。
變量的格式:[變量名]數(shù)據(jù)定義偽指令表達(dá)式[,……]變量名在格式中使用了可選符號[],作為可選項(xiàng)。若無變量名則為定義無名數(shù)據(jù)區(qū)。表達(dá)式確定了變量的初值,用戶可以根據(jù)需求選擇單項(xiàng)或多項(xiàng)表達(dá)式。16第4章匯編語言與匯編程序
4.1.6變量和地址表達(dá)式變量使用的表達(dá)式可以是以下幾種:(1)數(shù)值表達(dá)式。(2)ASCII碼字符串(只有用DB定義變量時,才允許串長度即引號中的字符數(shù)超過2個字符)。(3)地址表達(dá)式(只適用DW和DD兩個偽指令),如果該地址表達(dá)式為一變量或標(biāo)號名時,用DW定義,則是取其偏移地址來初始化變量,若用DD定義,則是取其段地址和偏移地址來初始化變量。(4)?,表示所定義變量無確定初值。一般用來預(yù)留若干字節(jié)(或字、雙字)存儲單元,以存放程序的運(yùn)行結(jié)果。(5)nDUP(表達(dá)式),其中DUP(duplicate)為重復(fù)字句,n是重復(fù)因子(只能取大于等于1的正整數(shù),它表示定義了n個表達(dá)式),它倆之間一定要空格,表達(dá)式的類型由數(shù)據(jù)定義偽指令確定。(6)以上表達(dá)式組成的序列用逗號分隔。174.2指令格式18第4章匯編語言與匯編程序
指令的格式:操作碼[操作數(shù)1][,操作數(shù)2][,……][,操作數(shù)n]操作數(shù)字段可以是0個、1個、2個或多個,通常稱為零地址、單地址、雙地址或多地址指令。在微型計(jì)算機(jī)中常采用單地址指令和雙地址指令,一方面指令代碼長度縮短了,另一方面也提高了處理速度。在雙地址指令中,分別稱兩個操作數(shù)為源操作數(shù)和目的操作數(shù)。指令的一般格式是:操作碼[目的操作數(shù)][,源操作數(shù)]194.3尋址方式
20寄存器尋址是指操作數(shù)存放在寄存器中,指令中給出寄存器名。例:MOVDX,AX;DX←AX
執(zhí)行過程如圖所示:
特點(diǎn):
(1)操作數(shù)在寄存器中,寄存器在CPU內(nèi)部,指令執(zhí)行時,操作就在CPU的內(nèi)部進(jìn)行,不需要訪問存儲器來取得操作數(shù),因而執(zhí)行速度快。
(2)寄存器號比內(nèi)存地址短,匯編后機(jī)器碼長度短。
(3)寄存器尋址方式既可用于源操作數(shù),也可用于目標(biāo)操作數(shù),還可以兩者都用寄存器尋址方式。1.寄存器尋址第4章匯編語言與匯編程序
21
立即尋址即指令中直接給出操作數(shù)本身。采用該尋址方式的操作數(shù)與指令代碼一起存放在代碼段中。例:MOVAX,1234H;AX←1234H
注意:立即尋址通常用于雙操作數(shù)指令中,且只能是源操作數(shù)。執(zhí)行過程如圖所示:2.立即尋址第4章匯編語言與匯編程序
223.直接尋址直接尋址即指令中給出操作數(shù)所在存儲單元的有效地址,缺省的段為數(shù)據(jù)段。為了區(qū)別于立即數(shù),有效地址用[]括起。例:以下指令中源或目標(biāo)操作數(shù)采用了直接尋址方式
(1)MOVAX,[2000H];AX←(DS:2000H)(2)MOV[1200],BL;(DS:1200H)←BL(3)MOVES:[0100],AL;(ES:0100H)←AL
說明:DS:2000表示內(nèi)存單元地址;
(DS:2000)表示地址是DS:2000的內(nèi)存單元內(nèi)容。第4章匯編語言與匯編程序
23【例】設(shè)DS=4000H,(42000H)=12H,(42001H)=34H,執(zhí)行指令MOVAX,[2000H]后,AX=?
①根據(jù)指令中給出的有效地址得到存儲單元的物理地址:
DS×16+2000H=42000H②把該內(nèi)存單元開始的兩個字節(jié)的內(nèi)容傳送到AX中。低地址單元內(nèi)容傳送到AL中,高地址單元內(nèi)容傳送到AH中。AX=3412H
執(zhí)行過程如圖所示:說明:直接尋址允許數(shù)據(jù)存于附加段、堆棧段、代碼段,這稱為“段超越”,此時,需要段說明。第4章匯編語言與匯編程序
244.間接尋址
間接尋址是把內(nèi)存操作數(shù)的有效地址存儲于寄存器中,指令中給出存放地址的寄存器名。
8086/8088中可用于間接尋址的寄存器有基址寄存器BX、BP和變址寄存器SI、DI。為區(qū)別于寄存器尋址,寄存器名要用“[]”括起來。例:MOVAX,[SI];AX←(DS:SI+1,DS:SI)
第4章匯編語言與匯編程序
25有效地址EA計(jì)算方法如下:EA=SI SI作間址寄存器。DI DI作間址寄存器。BX BX作間址寄存器。BP BP作間址寄存器。物理地址PA計(jì)算方法如下:物理地址=DS×10H+SI或DI或BX或物理地址=SS×10H+BP
注意:不同的寄存器所隱含對應(yīng)的段不同。采用SI、DI、BX寄存器,數(shù)據(jù)存于數(shù)據(jù)段中;采用BP寄存器,數(shù)據(jù)存于堆棧段中。第4章匯編語言與匯編程序
26【例】設(shè)DS=3000H,SI=2000H,(32000H)=50H,(32001H)=40H,執(zhí)行指令MOVAX,[SI]后,AX=?
①根據(jù)指令中給出的寄存器及寄存器內(nèi)容得到存儲單元的物理地址:
DS×16+2000H=32000H②把該內(nèi)存單元開始的兩個字節(jié)的內(nèi)容傳送到AX中。低地址單元內(nèi)容傳送到AL中,高地址單元內(nèi)容傳送到AH中。
AX=4050H
執(zhí)行過程如圖所示:第4章匯編語言與匯編程序
275.基址尋址源操作數(shù)在存儲器中,其偏移地址是指令中指定的寄存器BX或BP的內(nèi)容與指令中給出的位移量相加之和,段地址同間址。如:
MOV[BX+6],AL或MOV6[BX],AL
該指令的源操作數(shù)是寄存器AL,目的地在當(dāng)前數(shù)據(jù)段中,目的操作數(shù)是DS:[BX+6]。執(zhí)行的操作是:AL→DS:[BX+6]具體地,若DS=1359H、BX=0124H,則傳送數(shù)據(jù)的地址是1359H:0124H+6=136BAH;該指令執(zhí)行的操作是將AL的內(nèi)容送136BAH。第4章匯編語言與匯編程序
28
又如:MOV[BP+6],AX或MOV6[BP],AX
源操作數(shù)是寄存器AX,目的地在堆棧段中,目的操作數(shù)是SS:[BP+6]。執(zhí)行的操作是:AL→SS:[BP+6],AH→SS:[BP+7]具體地,若SS=1355H、BP=0030H,則傳送數(shù)據(jù)的地址是1355H:0030H+6=13586H和1355H:0030H+7=13587H;該指令執(zhí)行的操作是將AL的內(nèi)容送13586H、將AH的內(nèi)容送13587H。上述兩種寫法,即將位移量放在方括號內(nèi)與放在方括號外,功能是一樣的,前者意義明確些,后者上機(jī)操作要方便些。5.基址尋址第4章匯編語言與匯編程序
296.變址尋址變址尋址與基址尋址類似,只不過是用SI和DI取代BX和BP。約定的段地址在DS中。
第4章匯編語言與匯編程序
307.基址變址尋址采用基址變址尋址時,操作數(shù)的有效地址分為兩部分,一部分存于基址寄存器BX或BP中,另一部分存于變址寄存器SI或DI中,指令中分別給出兩個寄存器名。操作數(shù)的有效地址為:
EA1=BX+SI/DI或EA2=BP+SI/DI
當(dāng)基址寄存器選用BX時,數(shù)據(jù)隱含存于數(shù)據(jù)段中;當(dāng)基址寄存器選用BP時,數(shù)據(jù)隱含存于堆棧段中,即操作數(shù)的物理地址為:
PA1=DS×10H+EA1或PA2=SS×10H+EA2
第4章匯編語言與匯編程序
31
【例】設(shè)SS=3000H,BP=0100H,SI=5,(30105H)=78H,執(zhí)行指令MOVAL,[BP][SI]后,AL=?
①根據(jù)指令中給出的寄存器名及寄存器內(nèi)容,得到存儲單元的物理地址:
SS×16+BP+SI=30105H②把該內(nèi)存單元中內(nèi)容傳送到AL中。
AL=78H
執(zhí)行過程如圖所示:
7.基址變址尋址第4章匯編語言與匯編程序
32
8086/8088的指令有哪些尋址方式?它們的具體含義是什么?指令中如何表示它們?
8086/8088的指令有7種尋址方式,它們是:(1)寄存器尋址。操作數(shù)在指定寄存器中。指令中直接用寄存器名表示。(2)立即尋址。源操作數(shù)為常量(立即數(shù))。指令中用數(shù)值常量或符號常量表示。(3)直接尋址。操作數(shù)在指定的存儲器中。存儲器的偏移地址用含有變量名的地址表達(dá)式或用段名不含變量名的數(shù)值表達(dá)式表示。
第4章匯編語言與匯編程序
33
8086/8088的指令有哪些尋址方式?它們的具體含義是什么?指令中如何表示它們?
(4)間接尋址。操作數(shù)在存儲器中,存儲器的偏移地址在給定的寄存器中。指令中用置于方括號中的間接寄存器名表示。(5)基址尋址。操作數(shù)在存儲器中,存儲器的偏移地址是基址寄存器的內(nèi)容與指令給出的位移量之和。指令中用含有基址寄存器(在方括號中)的地址表達(dá)式表示。
第4章匯編語言與匯編程序
34
8086/8088的指令有哪些尋址方式?它們的具體含義是什么?指令中如何表示它們?
(6)變址尋址。操作數(shù)在存儲器中,存儲器的偏移地址是變址寄存器的內(nèi)容與指令給出的位移量之和。指令中用含有變址寄存器(在方括號中)的地址表達(dá)式表示。(7)基址變址尋址。操作數(shù)在存儲器中,存儲器的偏移地址是基址寄存器和變址寄存器的內(nèi)容與指令給出的位移量3項(xiàng)相加之和。指令中用含有基址寄存器和變址寄存器(在方括號中)的地址表達(dá)式表示。
第4章匯編語言與匯編程序
354.4常用指令
36
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令(1)傳送指令
指令格式:MOVDST,SRC執(zhí)行操作:(DST)←(SRC)該指令把源操作數(shù)的內(nèi)容傳送到目的操作數(shù)。能夠完成以下幾種傳送:37
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令①CPU內(nèi)部寄存器之間數(shù)據(jù)傳送;例4.16:MOVAL,BLMOVAX,BX②立即數(shù)傳至CPU內(nèi)部的通用寄存器組;例4.17:MOVAL,4MOVAX,0FFC1H③CPU內(nèi)部寄存器與存儲器之間的數(shù)據(jù)傳送;例4.18:MOVAX,[SI]MOVAL,BUFFER④立即數(shù)與存儲器之間的數(shù)據(jù)傳送。例4.19:MOVBYTEPTRMEM,20H38
第4章匯編語言與匯編程序
和MOV指令一樣,任何指令的目的操作數(shù)均不能為立即數(shù)。此外,大多數(shù)指令也應(yīng)遵循以下規(guī)則:
·立即數(shù)不能傳送至段寄存器;
·存儲器之間不能直接傳遞數(shù)據(jù)(串除外);
·CS不能作為目的操作數(shù),IP不能參與傳送;
·段寄存器之間不能直接傳遞數(shù)據(jù);
·源操作數(shù)和目的操作數(shù)類型要求一致,源操作數(shù)/目的操作數(shù)有寄存器則傳送長度由寄存器位數(shù)決定;源操作數(shù)/目的操作數(shù)均無寄存器則需限定存儲器操作數(shù)位數(shù)。39
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令(2)堆棧操作指令
①壓入堆棧指令
指令格式:PUSHSRC該指令將指定的寄存器或存儲單元的內(nèi)容壓入棧頂。操作數(shù)必須為字。指令分兩步進(jìn)行:先SP-1→SP,然后把數(shù)據(jù)(高位字節(jié))送至SP所指單元;再次使SP-1→SP,把數(shù)據(jù)(低位字節(jié))送至SP所指單元。40例:SP=2000H,SS=1000H,AX=1234H執(zhí)行PUSHAX,則堆棧內(nèi)容與SP如下:
SP=1FFEH3412××SP→1FFE1FFFSP→2000M第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令(2)堆棧操作指令
①壓入堆棧指令
指令格式:PUSHSRC該指令將指定的寄存器或存儲單元的內(nèi)容壓入棧頂。操作數(shù)必須為字。指令分兩步進(jìn)行:先SP-1→SP,然后把數(shù)據(jù)(高位字節(jié))送至SP所指單元;再次使SP-1→SP,把數(shù)據(jù)(低位字節(jié))送至SP所指單元。41
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令(2)堆棧操作指令
②全部通用寄存器內(nèi)容壓棧指令指令格式:PUSHA該指令將將8個16位通用寄存器內(nèi)容壓棧,壓棧的順序?yàn)锳X、CX、DX、BX、SP、BP、SI和DI。③標(biāo)志寄存器內(nèi)容壓棧指令指令格式:PUSHF42
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令(2)堆棧操作指令
④彈出堆棧指令指令格式:POPDST該指令分兩步進(jìn)行:先彈出棧頂數(shù)據(jù)(低位字節(jié)),修改SP,SP+1→SP;再彈出棧頂數(shù)據(jù)(高位字節(jié)),再修改SP,SP+1→SP。⑤全部通用寄存器內(nèi)容彈出指令指令格式:POPA⑥標(biāo)志寄存器內(nèi)容彈出指令指令格式:POPF43
第4章匯編語言與匯編程序
使用堆棧操作指令時應(yīng)注意:·堆棧操作必須以字為單位;·不影響標(biāo)志位;·不能用立即尋址方式;·
DST不能是CS。44
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令1.通用數(shù)據(jù)傳送指令(3)數(shù)據(jù)交換指令
指令格式:XCHGOPR1,OPR2執(zhí)行操作:(OPR1)←→(OPR2)例4.21:XCHGAL,BH;(AL)←→(BH)45
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令2.地址傳送指令(1)傳送偏移地址指令
指令格式:LEAREG,SRC執(zhí)行操作:(REG)←EA(SRC)這條指令的源操作數(shù)必須是一個內(nèi)存操作數(shù),目的操作數(shù)必須是一個16位的通用寄存器。該指令通常用來給某個16位通用寄存器設(shè)置偏移地址的初值,以便從此開始存取多個數(shù)據(jù)。例4.22:LEAAX,BUFFER若執(zhí)行前:AX=1234H,BUFFER=0100H,EA=5678H則執(zhí)行以后:AX=5678H,BUFFER=0100H46
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令2.地址傳送指令(2)傳送數(shù)據(jù)段地址指針指令
指令格式:LDSREG,SRC
執(zhí)行操作:(REG)←(SRC)(DS)←(SRC+2)
4個相繼字節(jié)→寄存器(通常是SI)和DS。47
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令2.地址傳送指令(3)傳送數(shù)據(jù)段地址指針指令指令格式:LESREG,SRC執(zhí)行操作:(REG)←(SRC)(ES)←(SRC+2)
4個相繼字節(jié)→寄存器(通常是DI)和ES。LDS和LES指令完成一個地址指針的傳送。地址指針包括段地址部分和偏移地址部分。指令將段地址送入DS或ES,偏移量部分送入到一個16位的指針寄存器或變址寄存器。
48
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令3.查表轉(zhuǎn)換指令指令格式:XLAT[source-table]執(zhí)行操作:[BX+AL]→AL該指令的操作數(shù)都是隱含的,所執(zhí)行的操作是將BX為基地址,AL為位移量的字節(jié)存儲單元中的數(shù)據(jù)送AL即[BX+AL]→AL。在匯編語言中,該指令也可以寫作XLATB(B表示字節(jié)操作)或XLATBtable(table為表的首地址)。注意:使用換碼指令時,字節(jié)表格長度不超過256。49
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令4.輸入輸出指令輸入輸出指令可以分為兩大類:一類是端口直接尋址的輸入輸出指令;另一類是端口通過DX寄存器間接尋址的輸入輸出指令。在直接尋址的指令中只能尋址28=256個端口(0~255),而間接尋址的指令中可尋址216=64K個端口(0~65535)。
50
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令4.輸入輸出指令(1)輸入指令①直接尋址的輸入指令指令格式:INACC,PORT執(zhí)行操作:(ACC)←(PORT)此命令是將8/16位數(shù)據(jù)直接經(jīng)輸入端口PORT(0~255)送入AL/AX累加器中。51
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令4.輸入輸出指令(1)輸入指令②間接尋址的輸入指令指令格式:INACC,DX執(zhí)行操作:(ACC)←(DX)此命令是從DX寄存器內(nèi)容指定的端口中,將8/16位數(shù)據(jù)送入AL/AX累加器中。這種尋址方式的端口地址由16位地址表示,執(zhí)行這條指令前應(yīng)將16位地址存入DX寄存器中。52
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令4.輸入輸出指令(2)輸出指令①直接尋址的輸出指令指令格式:OUTPORT,ACC執(zhí)行操作:(PORT)←(ACC)此命令是從AL或AX累加器輸出8/16位數(shù)據(jù)到指定的I/O端口中。②間接尋址的輸入指令指令格式:INDX,ACC執(zhí)行操作:(DX)←(ACC)此命令是從AL或AX累加器中輸出8/16位數(shù)據(jù)到由DX寄存器內(nèi)容指定I/O端口中。
53
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令5.標(biāo)志傳送指令(1)把標(biāo)志寄存器的低8位傳送到AH寄存器的指定位指令格式:LAHF標(biāo)志寄存器F中低8位包括SF、ZF、AF、PF、CF五個標(biāo)志位,對應(yīng)的位是位7、6、4、2和0,而位5、3和1沒有定義。例4.26:假定CF=PF=1,ZF=SF=AF=0,執(zhí)行指令LAFH之后,AH內(nèi)容為00×0×1×1。54
第4章匯編語言與匯編程序
4.4.1數(shù)據(jù)傳送指令5.標(biāo)志傳送指令(2)把AH寄存器的指定位傳到標(biāo)志寄存器中的S、Z、A、P和C標(biāo)志位指令格式:SAHF該指令與LAHF指令的操作相反。這條指令是把AH寄存器的內(nèi)容傳送到標(biāo)志寄存器的低8位。標(biāo)志寄存器的相應(yīng)位受到影響,它取決于AH中相應(yīng)位的狀態(tài)。本指令對OF、DF、IF和TF無影響。(3)把整個標(biāo)志寄存器(包括全部九個標(biāo)志)壓入堆棧指令指令格式:PUSHF(4)把棧頂內(nèi)容彈出到標(biāo)志寄存器指令指令格式:POPF55
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令1.加法指令(1)加指令A(yù)DD指令格式:ADDDST,SRC執(zhí)行操作:DST←DST+SRCADD指令有如下5種形式:
ADDREG,IMM;REG+IMM→REGADDREG,REG;REG+REG→REGADDREG,MEM;REG+MEM→REGADDMEM,IMM;;MEM+IMM→MEMADDMEM,REG;MEM+REG→MEM56
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令1.加法指令
(2)帶進(jìn)位的加指令A(yù)DC指令格式:ADCDST,SRC執(zhí)行操作:DST←DST+SRC+CFADC指令有如下5種形式:
ADCREG,IMM;REG+IMM+CF→REGADCREG,REG;REG+REG+CF→REGADCREG,MEM;REG+MEM+CF→REGADCMEM,IMM;;MEM+IMM+CF→MEMADCMEM,REG;MEM+REG+CF→MEM57
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令1.加法指令A(yù)DD和ADC兩指令按執(zhí)行結(jié)果影響狀態(tài)標(biāo)志位:當(dāng)結(jié)果的最高位(字節(jié)操作是D7,字操作是D15)產(chǎn)生進(jìn)位,CF=1;否則CF=0。當(dāng)結(jié)果為0時,ZF=1;否則ZF=0。當(dāng)結(jié)果的最高位為1時,SF=1;否則SF=0,即SF總與結(jié)果的最高位一致。當(dāng)結(jié)果不在符號數(shù)范圍:字節(jié)運(yùn)算時不在字節(jié)補(bǔ)碼數(shù)范圍(-128~127),字運(yùn)算時不在字補(bǔ)碼數(shù)范圍(-32768~32767)時,OF=1;否則OF=0。當(dāng)結(jié)果的二進(jìn)制位1的個數(shù)為偶數(shù)時,PF=1;否則PF=0。當(dāng)運(yùn)算時,D3產(chǎn)生進(jìn)位,AF=1;否則AF=0。58
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令1.加法指令
(3)增量指令I(lǐng)NC指令格式:INCDST執(zhí)行操作:DST←DST+1使用增量指令時,操作數(shù)不得出現(xiàn)二義性。例4.28:INC[SI]是非法的,因?yàn)閰R編程序不能確定是字節(jié)增1還是字增1??梢允褂肞TR算符使之成為合法指令:INCBYTEPTR[SI]或INCWORDPTR[SI]
注意:段寄存器不能用此命令加1。該指令影響SF、ZF、AF、PF和OF,但對CF沒有影響。59
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令2.減法指令
(1)減指令SUB指令格式:SUBDST,SRC執(zhí)行操作:DST←DST-SRC(2)帶借位的減指令SBB指令格式:SBBDST,SRC執(zhí)行操作:DST←DST-SRC-CF(3)減量指令DEC指令格式:DECDST執(zhí)行操作:DST←DST-1減法類指令對標(biāo)志位的影響,除將進(jìn)位改為借位外與加法類指令相同。60
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令2.減法指令
(4)比較指令CMP指令格式:CMPDST,SRC執(zhí)行操作:DST-SRC比較指令除了不回送結(jié)果外,其他一切均同SUB指令。該指令主要用來判斷兩數(shù)的大小與是否相等。比較指令后面常常是條件轉(zhuǎn)移指令,根據(jù)比較的結(jié)果實(shí)現(xiàn)程序的分支。61
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令3.乘法指令
8086/8088指令系統(tǒng)中有兩條乘法指令,可以實(shí)現(xiàn)無符號數(shù)的乘法和帶符號數(shù)的乘法,它們只有源操作數(shù),隱含目標(biāo)操作數(shù)。CPU在執(zhí)行乘法時,一個操作數(shù)始終放在累加器中(8位AL;16位AX),這是隱含的。8位數(shù)相乘結(jié)果16位,存放在AX中,16位數(shù)相乘結(jié)果32位,存放在DX和AX中。
62
圖4-9乘法指令的操作示意圖
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令3.乘法指令乘法指令分無符號數(shù)乘法指令MUL和帶符號數(shù)乘法指令I(lǐng)MUL兩種。指令格式:MULSRCIMULSRC其中源操作數(shù)SRC可以是字節(jié)或字,可為寄存器或存儲器操作數(shù),不能為立即數(shù)。目的操作數(shù)是AL或AX,視SRC的類型屬性決定是AL還是AX。63
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令3.乘法指令乘法指令對除CF和OF以外的狀態(tài)標(biāo)志位無定義(注意:無定義和不影響不同,無定義是指指令執(zhí)行后這些狀態(tài)標(biāo)志位的狀態(tài)不確定,而不影響則是指該指令的執(zhí)行不影響狀態(tài)標(biāo)志位,因而狀態(tài)標(biāo)志應(yīng)保持原狀態(tài)不變)。對于MUL指令,如果乘積的高一半為0(即字節(jié)操作的AH=0或字操作時DX=0),則CF和OF均為0;否則CF和OF均為1。對于IMUL指令,如果乘積的高一半是低一半的符號擴(kuò)展,則CF和OF均為0,否則CF和OF均為1。
64
圖4-10除法指令的操作示意圖
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令4.除法指令除法指令分無符號數(shù)除法指令DIV和帶符號數(shù)除法指令I(lǐng)DIV兩種。指令格式:DIVSRCIDIVSRC其中源操作數(shù)SRC可以是字節(jié)或字,可為寄存器或存儲器操作數(shù),不能為立即數(shù)。目的操作數(shù)是AX或DX和AX。65
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令4.除法指令除法指令所執(zhí)行的操作是用指令中指定的源操作數(shù)SRC除AX中的16位二進(jìn)制數(shù)或DX和AX中的32位二進(jìn)制數(shù),商放入AL或AX,余數(shù)放入AH或DX,如圖4-10所示。被除數(shù)是AX還是DX和AX,由源操作數(shù)是字節(jié)還是字確定。除法指令對所有的狀態(tài)標(biāo)志位均無定義。
66
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令5.擴(kuò)展指令①字節(jié)擴(kuò)展指令指令格式:CBW執(zhí)行操作:如果(AL)﹤80H,則(AH)=00H,否則(AH)=FFH;CBW指令將一個字節(jié)(8位),按其符號擴(kuò)展成字,它是隱含操作數(shù)指令,隱含操作數(shù)為AL或AH,對狀態(tài)標(biāo)志位沒有影響。②字?jǐn)U展指令指令格式:CWD執(zhí)行操作:CWD指令將一個字(16位)按其符號擴(kuò)展成雙子(32位),它是隱含操作數(shù)指令,隱含的操作數(shù)為寄存器AX和DX中的值。CWD和CBW一樣,對狀態(tài)標(biāo)志位沒有影響。
67
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令5.擴(kuò)展指令CWD和CBW指令在帶符號的乘法(IMUL)和除法(IDIV)運(yùn)算中十分有用,常常在字節(jié)或字的運(yùn)算之前,將AL和AX中數(shù)據(jù)的符號位進(jìn)行擴(kuò)展。
68
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令以上介紹的都是對二進(jìn)制數(shù)進(jìn)行操作。二進(jìn)制數(shù)在計(jì)算機(jī)上進(jìn)行運(yùn)算是非常簡單的。但是人們習(xí)慣用十進(jìn)制數(shù)。在計(jì)算機(jī)中,十進(jìn)制數(shù)是用BCD碼來表示的。BCD碼有兩類:壓縮BCD碼和非壓縮BCD碼。二進(jìn)制數(shù)算術(shù)運(yùn)算指令對BCD數(shù)進(jìn)行運(yùn)算,會得到一個非BCD數(shù)或不正確的BCD數(shù)。69
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令例4.30:00000011B+00001001B=00001100B00001001B+00000111B=00010000B第一個結(jié)果是非BCD數(shù);第二個結(jié)果是不正確的BCD數(shù)。其原因是BCD數(shù)向高位的進(jìn)位是逢10進(jìn)1,而4位二進(jìn)制數(shù)向高位進(jìn)位是逢16進(jìn)1,中間相差6。若再加上6,就可以得到正確的BCD數(shù):
00001100B+00000110B=00010010B00010000B+00000110B=00010110B8086/8088對BCD數(shù)使用二進(jìn)制數(shù)算術(shù)運(yùn)算指令進(jìn)行運(yùn)算,然后執(zhí)行一條能把結(jié)果轉(zhuǎn)換成正確的BCD數(shù)的專用調(diào)整指令來處理BCD數(shù)的結(jié)果。
70
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令(1)BCD數(shù)加法調(diào)整指令指令格式:DAAAAADAA執(zhí)行操作:是將AL中的數(shù)當(dāng)作兩個壓縮BCD數(shù)相加之和來進(jìn)行調(diào)整,得到兩位壓縮BCD數(shù)。具體操作是,若(AL&0FH)>9或AF=1,則AL加上6;若(AL&0F0H)>90H或CF=1,則AL加60H。71
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令例4.31:MOVAX,3456HADDAL,AH;AL=8AHDAA;AL=90HAAA執(zhí)行操作:是將AL中的數(shù)當(dāng)作兩個非壓縮BCD數(shù)相加之和進(jìn)行調(diào)整,得到正確的非壓縮BCD數(shù)送AX。具體操作是,若(AL&0FH)>9或AF=1,則(AL+6)&0FH送AL,AH加1;否則AL&0FH送AL,AH不變。應(yīng)特別注意,AAA指令執(zhí)行前AH的值。72
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令例4.32:MOVAX,0806HADDAL,AH;AX=080EHMOVAH,0AAA;AX=0104H由調(diào)整指令所執(zhí)行的具體操作可以看到,對結(jié)果進(jìn)行調(diào)整時要用到進(jìn)位標(biāo)志和輔助進(jìn)位標(biāo)志,所以調(diào)整指令應(yīng)緊跟在BCD數(shù)作為加數(shù)的加法指令之后。所謂“緊跟”是指在調(diào)整指令與加法指令之間不得有改變標(biāo)志位的指令。73
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令(2)BCD數(shù)減法調(diào)整指令指令格式:DAS
AASDAS執(zhí)行操作:是將AL中的數(shù)當(dāng)作兩個壓縮BCD數(shù)相減之差來進(jìn)行調(diào)整,得到正確的壓縮BCD數(shù)。具體操作是:若(AL&0FH)>9或AF=1,則AL減6,(AL&0F0H)>90H或CF=1,則AL減60H。74
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令例4.33:MOVAX,5634HSUBAL,AH;AL=DEH,有借位
DAS;AL=78H,保持借位即134-56AAS執(zhí)行操作:是將AL中的數(shù)當(dāng)作兩個非壓縮BCD數(shù)相減之差進(jìn)行調(diào)整得到正確的非壓縮BCD數(shù)。具體操作是:若(AL&0FH)>9或AF=1,則(AL-6)&0FH送AL,AH減1;否則AL&0FH送AL,AH不變。應(yīng)特別注意,AAS指令執(zhí)行前AH的值。75
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令例4.34:MOVAX,0806HSUBAL,07H;AX=08FFHAAS;AX=0709H76
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令(3)非壓縮BCD數(shù)乘除法調(diào)整指令
指令格式:AAMAAD壓縮BCD數(shù)對乘除法的結(jié)果不能進(jìn)行調(diào)整,故只有非壓縮BCD數(shù)乘除法調(diào)整指令。AAM執(zhí)行操作:是將AL中的小于64H的二進(jìn)制數(shù)進(jìn)行調(diào)整,在AX中得到正確的非壓縮BCD數(shù)。具體操作是AL/0AH送AH,ALMOD0AH送AL。
77
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令例4.35:MOVAL,63HAAM;AX=0909HAAD執(zhí)行操作:是將AX中的兩位非壓縮BCD數(shù)變換為二進(jìn)制數(shù)。在做二位非壓縮BCD數(shù)除以一位非壓縮BCD數(shù)時,先將AX中的被除數(shù)調(diào)整為二進(jìn)制數(shù),然后用二進(jìn)制除法指令DIV相除,保存AH中的余數(shù)后,再用AAM指令把商變回為非壓縮的BCD數(shù)。
78
第4章匯編語言與匯編程序
4.4.2算術(shù)運(yùn)算指令6.BCD數(shù)調(diào)整指令例4.36:MOVAX,0906HMOVDL,06HAAD;AX=0060HDIVDL;AL=10H、AH=0MOVDL,AH;存余數(shù)
AAM;AX=0106H
除法的調(diào)整不同于加法、減法和乘法,它們的調(diào)整是在相應(yīng)運(yùn)算操作之后進(jìn)行,而除法的調(diào)整在除法操作之前進(jìn)行。調(diào)整指令都隱含著AX或AL,都在AX或AL中進(jìn)行。79
第4章匯編語言與匯編程序
4.4.3位操作1.邏輯運(yùn)算指令
這類指令包括邏輯運(yùn)算與移位兩種類型,它們均可直接對寄存器或存儲器中的位進(jìn)行操作。
(1)求補(bǔ)指令
指令格式:NEGDST執(zhí)行操作:DST←0-(DST)將操作數(shù)地址中的內(nèi)容求補(bǔ)后再送入操作數(shù)地址中。該指令的操作數(shù)只有通用寄存器REG和存儲器MEM。特別需要強(qiáng)調(diào)的是該指令是求補(bǔ)指令,不是求補(bǔ)碼指令。不論操作數(shù)地址中的數(shù)是符號數(shù)還是無符號數(shù),是正數(shù)還是負(fù)數(shù),也不管它是補(bǔ)碼形式還是原碼形式或反碼形式的數(shù),該指令均對其進(jìn)行求補(bǔ)操作。其標(biāo)志位影響同SUB指令。80
第4章匯編語言與匯編程序
4.4.3位操作1.邏輯運(yùn)算指令
例4.37:MOVAX,0FF64H
NEGAL;AX=FF9CH,OF=0、SF=1、ZF=0、PF=1、CF=1
SUBAL,9DH;AX=FFFFH,OF=0、SF=1、ZF=0、PF=1、CF=1
NEGAX;AX=0001H,OF=0、SF=0、ZF=0、PF=0、CF=1
DECAL;AX=0000H,OF=0、SF=0、ZF=1、PF=1、CF=1
NEGAX;AX=0000H,OF=0、SF=0、ZF=1、PF=1、CF=0
由此可見,若將執(zhí)行求補(bǔ)指令前后的數(shù)均視作補(bǔ)碼數(shù),求補(bǔ)指令則將該數(shù)變?yōu)榻^對值相等符號相反的另一數(shù)。
81
第4章匯編語言與匯編程序
4.4.3位操作1.邏輯運(yùn)算指令
(2)求反指令
指令格式:NOTDST執(zhí)行操作:DST←FFFFH-(DST)指令的意義是將操作數(shù)地址中的數(shù)逐位取反后再送回操作數(shù)地址中。指令的操作數(shù)可以是寄存器或存儲器,但不能是立即數(shù)。82
第4章匯編語言與匯編程序
4.4.3位操作1.邏輯運(yùn)算指令
(3)邏輯與指令指令格式:ANDDST,SRC
執(zhí)行操作:DST∧SRC→DST(4)邏輯或指令指令格式:ORDST,SRC
執(zhí)行操作:DST∨SRC→DST(5)邏輯異或指令指令格式:XORDST,SRC
執(zhí)行操作:DST⊕SRC→DST83
第4章匯編語言與匯編程序
4.4.3位操作1.邏輯運(yùn)算指令
AND、OR、XOR這3類指令都將標(biāo)志位CF和OF清0,對標(biāo)志位SF、ZF和PF的影響同加操作。AND指令可以用來取出目的操作數(shù)中與源操作數(shù)的1對應(yīng)的位。OR指令可以用來將目的操作數(shù)和源操作數(shù)中的所有1位拼合在一起。XOR指令可以用來將通用寄存器清0,還可以用來將目的操作數(shù)中的某些位取反。
84
第4章匯編語言與匯編程序
4.4.3位操作1.邏輯運(yùn)算指令
(6)測試指令
指令格式:TESTDST,SRC
執(zhí)行操作:DST∧SRCTEST指令與AND指令的關(guān)系同CMP指令與SUB指令的關(guān)系。TEST指令主要用來檢測與源操作數(shù)中為1的位相對應(yīng)的目的操作數(shù)中的那幾位是否為0或?yàn)?,供其后面的條件轉(zhuǎn)移指令實(shí)現(xiàn)程序的分支。85
第4章匯編語言與匯編程序
4.4.3位操作2.移位指令
移位指令的目的操作數(shù)可以是通用寄存器或存儲器,可以是字節(jié)也可以是字;源操作數(shù)為移位的次數(shù),只能是CL或1,即若移位次數(shù)不是1次就要先將移位次數(shù)送入CL,然后再執(zhí)行源操作數(shù)為CL的移位指令。CL的值為0,則不移位。以CL為源操作數(shù)的移位指令執(zhí)行以后,CL的值不變。86
第4章匯編語言與匯編程序
4.4.3位操作2.移位指令
(1)邏輯右移
指令格式:SHRDST,SRC執(zhí)行操作:是將DST中的8位或16位二進(jìn)制數(shù)向右移動1位或者CL位,最右邊位(即最低位)或者最后移出位移至CF,最左邊的1位(即最高位)或CL位依次補(bǔ)0。
87
第4章匯編語言與匯編程序
4.4.3位操作2.移位指令
(2)算術(shù)右移指令格式:SARDST,SRC
執(zhí)行操作:是將DST中的8位或16位二進(jìn)制數(shù)向右移動1位或者CL位,最右邊位(即最低位)或者最后移出位移至CF,最左邊位(即最高位)既向右移動又保持不變。88
第4章匯編語言與匯編程序
4.4.3位操作2.移位指令
(3)算術(shù)/邏輯左移指令格式:SAL/SHLDST,SRC執(zhí)行操作:是將DST中的8位或16位二進(jìn)制數(shù)向左移動1位或者CL位,最左邊位(即最高位)或者最后移出位移至CF,最右邊的1位(即最低位)或右邊的CL位移入0。89
第4章匯編語言與匯編程序
4.4.3位操作2.移位指令
(4)循環(huán)右移指令格式:RORDST,SRC執(zhí)行操作:是將DST中的8位或16位二進(jìn)制數(shù)向右移動1位或者CL位,從右邊移出位既移入CF又移入左邊的空出位,最后移出位移至最左邊位(即最高位),同時保留在CF。90
第4章匯編語言與匯編程序
4.4.3位操作2.移位指令
(5)循環(huán)左移
指令格式:ROLDST,SRC
執(zhí)行操作:是將DST中的8位或16位二進(jìn)制數(shù)向左移動1位或者CL位,從左邊移出位既移入CF又移入右邊的空出位,最后移出位移至最右邊位(即最低位),同時保留在CF。91
第4章匯編語言與匯編程序
4.4.3位操作2.移位指令
(6)帶進(jìn)位循環(huán)右移指令格式:RCRDST,SRC
執(zhí)行操作:是將DST和進(jìn)位CF中的9位或17位二進(jìn)制數(shù)一同向右移動1位或者CL位,dest中的最右邊位(即最低位)或者最后移出位移至CF,CF(原內(nèi)容)移至dest的最左邊位(即最高位)或者中間位。
92
第4章匯編語言與匯編程序
4.4.3位操作2.移位指令
(7)帶進(jìn)位循環(huán)左移
指令格式:RCLDST,SRC
執(zhí)行操作:是將DST中的8位二進(jìn)制數(shù)和進(jìn)位CF一同向左移動1位或者CL位,dest中的最左邊位(即最高位)或者最后移出位移至CF,CF(原內(nèi)容)移至dest的最右邊位(即最低位)或者中間位。93
第4章匯編語言與匯編程序
4.4.4串操作1.字符串傳送指令
指令格式:(1)MOVS(2)MOVSB
(3)MOVSW執(zhí)行操作:將存儲器中的字節(jié)或字傳送到存儲器中。即從SI寄存器指定的存儲單元中傳送8位或16位數(shù)到由DI指定的存儲單元中,然后DI和SI的內(nèi)容是增加還是減少取決于DF標(biāo)志。若采用重復(fù)前綴(REP),則可以用一條指令完成整個數(shù)據(jù)塊的傳送。但要用重復(fù)前綴時,數(shù)據(jù)塊長度必須放在寄存器CX中。本指令對標(biāo)志位無影響。其中第二、三種格式明確地注明是傳送字節(jié)或字,第一種格式則應(yīng)在操作數(shù)中表明是字還是字節(jié)操作。
94
第4章匯編語言與匯編程序
4.4.4串操作2.字符串裝入指令
指令格式:(1)LODS
(2)LODSB
(3)LODSW執(zhí)行操作:是將DS數(shù)據(jù)段中SI為偏移地址的源串中的一個字節(jié)或一個字取出送AL或AX;同時修改SI指向下一個字節(jié)或字。
95
第4章匯編語言與匯編程序
4.4.4串操作3.字符串填充指令
指令格式:(1)STOS
(2)STOSB
(3)STOSW執(zhí)行操作:是將AL或AX中的內(nèi)容存放到ES數(shù)據(jù)段中DI為偏移地址的目的串中;同時修改DI指向下一個字節(jié)或字。
96
第4章匯編語言與匯編程序
4.4.4串操作4.字符串比較指令
指令格式:(1)CMPS
(2)CMPSB
(3)CMPSW執(zhí)行操作:是用DS:SI指向的源串中的一個字節(jié)或字減去ES:DI指向的目的串中的一個字節(jié)或字,減的結(jié)果既不送入源串也不送入目的串,僅根據(jù)減操作設(shè)置標(biāo)置位;同時修改SI和DI指向下一個字節(jié)或字。97
第4章匯編語言與匯編程序
4.4.4串操作5.字符串搜索指令
指令格式:(1)SCAS
(2)SCASB
(3)SCASW執(zhí)行操作:是用AL或AX減去ES:DI指向的目的串中的一個字節(jié)或字,減的結(jié)果,既不送累加器也不送目的串中,減操作僅影響標(biāo)志位;同時修改DI指向下一操作數(shù)。98
第4章匯編語言與匯編程序
4.4.5程序控制指令
1.過程調(diào)用指令(1)CALLaddr調(diào)用由操作數(shù)指定的子程序(段間)。該指令是將CALL指令的下一條指令的地址壓入棧頂。緊接著將跟在CALL指令操作碼后面的4個字節(jié)內(nèi)容放入IP和CS中。順序如下:①指令的第二、第三字節(jié)放入IP中;②指令的第四、第五字節(jié)放入CS中。
99
第4章匯編語言與匯編程序
4.4.5程序控制指令
1.過程調(diào)用指令(2)CALLdispl6
調(diào)用由操作數(shù)指定的子程序(段內(nèi))。該指令是將CALL指令下一條指令的地址壓入棧頂。緊跟在操作碼后的兩個宇節(jié)當(dāng)作16位位移量放壓入IP中。100
第4章匯編語言與匯編程序
4.4.5程序控制指令
1.過程調(diào)用指令(3)CALLmem/reg
將CALL指令的下一條指令的地址壓人棧頂。然后把指定的存儲器單元的內(nèi)容或寄存器的內(nèi)容送到IP(段內(nèi)調(diào)用)與CS(段間調(diào)用)中。101
第4章匯編語言與匯編程序
4.4.5程序控制指令
2.無條件轉(zhuǎn)移指令無條件轉(zhuǎn)移指令有4種形式,addr表示32位地址,disp表示8位位移量,disp16表示16位位移量。
JMPaddrJMPdispJMPdisp16JMPmem/reg
JMP指令也有段內(nèi)轉(zhuǎn)移與段間轉(zhuǎn)移,通常在指令中用FAR與NEAR來區(qū)別,這與CALL相似,但JMP指令不要求返回,因此不保留任何信息。JMP指令對標(biāo)志無影響。102
第4章匯編語言與匯編程序
4.4.5程序控制指令
3.過程返回指令RETRETF
每個子程序的最后一條指令都是RET指令,由它控制返回調(diào)用程序。RET表示一個段內(nèi)返回指令。棧頂指針SP+2。RETF表示段間返回。從棧頂彈出第一個字送到IP中,SP+2,接著再彈出一個字送入CS中,SP再加上2。RETF指令使SP加上4。
103
第4章匯編語言與匯編程序
4.4.5程序控制指令
3.過程返回指令RETdispl6RETFdispl6
RETdispl6與RETFdispl6與前兩條相似,也是從段內(nèi)或段間返回,所不可同的是在返回之后,還調(diào)整了棧指針SP,除了使SP加上必須的2(段內(nèi)返回)或4(段間返回)之外,再使SP加上指令中給出的displ6位移量,這樣就可允許用戶廢除一些在執(zhí)行CALL指令以前入棧的參數(shù)。104
第4章匯編語言與匯編程序
4.4.5程序控制指令
4.條件轉(zhuǎn)移指令指令助記符功能標(biāo)志設(shè)置JE/JZ相等/等于0轉(zhuǎn)移ZF=1JNE/JNZ不相等/不等于0轉(zhuǎn)移ZF=0JC有進(jìn)(借)位轉(zhuǎn)移CF=1JNC無進(jìn)(借)位轉(zhuǎn)移CF=0JS為負(fù)轉(zhuǎn)移SF=1JNS為正轉(zhuǎn)移SF=0JO溢出轉(zhuǎn)移OF=1JNO無溢出轉(zhuǎn)移OF=0JP/JPE偶轉(zhuǎn)移PF=1JNP/JPO奇轉(zhuǎn)移PF=0(1)簡單的條件轉(zhuǎn)移指令105
第4章匯編語言與匯編程序
4.4.5程序控制指令
4.條件轉(zhuǎn)移指令(2)無符號數(shù)條件轉(zhuǎn)移指令
指令助記符功能JB/JNAE低于/不高于等于轉(zhuǎn)移JNB/JAE不低于/高于等于轉(zhuǎn)移JA/JNBE高于/不低于等于轉(zhuǎn)移JNA/JBE不高于/低于等于轉(zhuǎn)移106
第4章匯編語言與匯編程序
4.4.5程序控制指令
4.條件轉(zhuǎn)移指令(3)符號數(shù)條件轉(zhuǎn)移指令
指令助記符功能JL/JNGE小于/不大于等于轉(zhuǎn)移JNL/JGE不小于/大于等于轉(zhuǎn)移JG/JNLE大于/不小于等于轉(zhuǎn)移JNG/JLE不大于/小于等于轉(zhuǎn)移107
第4章匯編語言與匯編程序
4.4.5程序控制指令
5.循環(huán)指令(1)LOOP指令指令格式:LOOPshort-lable執(zhí)行操作:是將CX減1,然后判斷CX是否等于0。若CX≠0,則控制程序轉(zhuǎn)移到short-lable所指的指令,否則順序執(zhí)行。使用LOOP指令之前,必須把循環(huán)次數(shù)送入CX寄存器中,一條LOOPshort-lable指令,相當(dāng)于DECCX和JNZshort-lable兩條指令。
108
第4章匯編語言與匯編程序
4.4.5程序控制指令
5.循環(huán)指令(2)LOOPZ/LOOPE指令
指令格式:LOOPZshort-lable或LOOPEshort-lable執(zhí)行操作:是先將CX減1,然后判斷CX的內(nèi)容和ZF標(biāo)志的狀態(tài)。若CX≠0,且ZF=1時,將程序轉(zhuǎn)移到short-lable所指的指令,否則順序執(zhí)行。
109
第4章匯編語言與匯編程序
4.4.5程序控制指令
5.循環(huán)指令(3)LO
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 天津養(yǎng)老產(chǎn)業(yè)園區(qū)買賣合同模板
- 城市地鐵施工合同條款
- 2024年教育貸款按揭合同范本
- 農(nóng)業(yè)用電借用合同
- 花園工作室別墅花園施工合同
- 2024年度環(huán)保節(jié)能項(xiàng)目融資合同3篇
- 時尚發(fā)布會現(xiàn)場制片管理合同
- 墻板施工合同文化中心裝飾
- 海灘排水溝施工合同
- 大型住宅區(qū)建設(shè)施工合同
- DB51T3062-2023四川省高標(biāo)準(zhǔn)農(nóng)田建設(shè)技術(shù)規(guī)范
- 輪轂產(chǎn)品設(shè)計(jì)參考手冊2007
- 中國姓氏名字文化
- 部編版八年級歷史上冊《第18課九一八事變與西安事變》教案及教學(xué)反思
- 2023年成都市生物畢業(yè)會考知識點(diǎn)含會考試題及答案
- 高速公路總監(jiān)辦年度平安總結(jié)
- 常用介電常數(shù)
- 2023年小學(xué)德育處三年發(fā)展規(guī)劃
- 高中走讀申請書范文(必備5篇)-1
- 國家開放大學(xué)《管理學(xué)基礎(chǔ)》形考任務(wù)4參考答案
- 電焊工考試題庫(300道)
評論
0/150
提交評論