《匯編語言》期末考試摘要與試卷_第1頁
《匯編語言》期末考試摘要與試卷_第2頁
《匯編語言》期末考試摘要與試卷_第3頁
《匯編語言》期末考試摘要與試卷_第4頁
《匯編語言》期末考試摘要與試卷_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第三章

1、指令由操作碼和操作數(shù)兩部分組成

2、操作碼說明計算機要執(zhí)行哪種操作,如傳送、運算、移位、跳轉(zhuǎn)等操作,它是指令中不

可缺少的組成部分

3、操作數(shù)是指令執(zhí)行的參與者,即各種操作的對象,有些指令不需要操作數(shù),通常的指令

都有一個或兩個操作數(shù)

4、操作碼:用一個唯一的助記符表示(指令功能的英文縮寫);對應(yīng)著機器指令的一個二進

制編碼

5、操作數(shù):可以是一個具體的數(shù)值;可以是存放數(shù)據(jù)的寄存器;或指明數(shù)據(jù)在主存位置的

存儲器地址

6、尋找操作數(shù)的過程就是操作數(shù)的尋址

7、代碼格式:

操作碼標示尋址方式對基地址的偏移量立即尋址方式立即數(shù)

8、操作碼操作數(shù)1,操作數(shù)2;

操作數(shù)2,稱為源操作數(shù)src,它表示參與指令操作的一個對象

操作數(shù)1,稱為目的操作數(shù)dest,它不僅可以作為指令操作的一個對象,還可以用來存

放指令操作的結(jié)果

分號后的內(nèi)容是對指令的解釋

9、MOV指令的功能是將源操作數(shù)src傳送至目的操作數(shù)dest

10、立即數(shù)尋址方式:指令中的操作數(shù)直接存放在機器代碼中,緊跟在操作碼之后的主存單

元中;立即數(shù)尋址方式常用來給寄存器賦值.

11、寄存器尋址方式:操作數(shù)存放在CPU的內(nèi)部寄存器reg中??梢允牵?/p>

8位寄存器r8:AH、AL、BH、BL、CH、CL、DH、DL

16位寄存器rl6:AX、BX、CX、DX、SI、DI、BP、SP

4個段寄存器seg:CS、DS、SS、ES

12、存儲器尋址方式:指令中給出操作數(shù)的主存地址信息(偏移地址,稱之為有效地址EA),

而段地址在默認的或用段超越前綴指定的段寄存器中。

13、多種存儲器尋址方式:1、直接尋址方式;2、寄存器間接尋址方式

3、寄存器相對尋址方式;4、基址變址尋址方式

5、相對基址變址尋址方式

14、直接尋址方式:

>有效地址在指令中直接給出

>默認的段地址在DS段寄存器,可使用段超越前綴ES改變

15、寄存器間接尋址方式:有效地址存放在基址寄存器BX或變址寄存器SI、DI中;默認

的段地址在DS段寄存器,可使用段超越前綴ES改變。

16、寄存器相對尋址方式:有效地址是寄存器內(nèi)容與有符號8位或16位位移量之和,寄存

器可以是BX、BP或SI、DI

有效地址=BX/BP/SI/DI+8/16位位移量

段地址對應(yīng)BX/SI/DI寄存器默認是DS,對應(yīng)BP寄存器默認是

SS;可用段超越前綴ES改變

例:MOVAXJDI+06H];AX-DSJDI+06H]

MOVAX,[BP+06H];AX-SS:[BP+06H]

17、基址變址尋址方式:有效地址由基址寄存器(BX或BP)的內(nèi)容加上變址寄存

器(SI或DI)的內(nèi)容構(gòu)成:有效地址=BX/BP+SI/DI

段地址對應(yīng)BX基址寄存器默認是DS,對應(yīng)BP基址寄存器默認

是SS;可用段超越前綴ES改變

例:MOVAXJBX+SI];AX-DS:[BX+SI]

MOVAX,[BP+DI];AX-SS:[BP+DI]

18、相對基址變址尋址方式:有效地址是基址寄存器(BX/BP)、變址寄存器(SI/DI)與一

個8位或16位位移量之和:

有效地址=BX/BP+SI/DI+8/16位位移量

例:MOVAX,[BX+SI+06H];AX-DS:[BX+SI+06H]

注意:位移量可用符號表示;同一尋址方式有多種表達形式

19、與轉(zhuǎn)移地址有關(guān)的尋址方式:

1、直接尋址方式:轉(zhuǎn)移地址象立即數(shù)一樣,直接在指令的機器代碼中

2、間接尋址方式:轉(zhuǎn)移地址在寄存器或主存單元中,就是通過寄存器或存儲器的間接

尋址方式

20、目標地址的范圍:段內(nèi)

1、段內(nèi)轉(zhuǎn)移——近轉(zhuǎn)移(near)

在當前代碼段64KB范圍內(nèi)轉(zhuǎn)移(±32KB范圍)

不需要更改CS段地址,只要改變IP偏移地址

2、段內(nèi)轉(zhuǎn)移——短轉(zhuǎn)移(short)

轉(zhuǎn)移范圍可以用一個字節(jié)表達,在段內(nèi)一128?+127范圍的轉(zhuǎn)移

3、段間轉(zhuǎn)移——遠轉(zhuǎn)移(far)

a)從當前代碼段跳轉(zhuǎn)到另一個代碼段,可以在1MB范圍

b)需要更改CS段地址和IP偏移地址

c)目標地址必須用一個32位數(shù)表達,叫做32位遠指針,它就是邏輯地址

注意:實際編程時,匯編程序會根據(jù)目標地址的距離,自動處理成短轉(zhuǎn)移、近轉(zhuǎn)移

或遠轉(zhuǎn)移;程序員可用操作符short、nearptr或farptr強制

21、段內(nèi)轉(zhuǎn)移、直接尋址:JMPlabel;1P-IP+位移量

位移量是緊接著JMP指令后的那條指令的偏移地址,到目標指令的偏移地址的地

址位移;當向地址增大方向轉(zhuǎn)移時,位移量為正;向地址減小方向轉(zhuǎn)移時,位移量為負

例:jmpagain;轉(zhuǎn)移到again處繼續(xù)執(zhí)行

again:decex;標號again的指令

jmpoutput;轉(zhuǎn)向output

output:movresult,al;標號output的指令

22、段內(nèi)轉(zhuǎn)移、間接尋址:JMPrl6/ml6;IP-rl6/ml6

將一個16位寄存器或主存字單元內(nèi)容送入IP寄存器,作為新的指令指針,但不修

改CS寄存器的內(nèi)容

例:jmpax;IP-AX

jmpwordptr[2000h];IP-[2000h]

23、段間轉(zhuǎn)移、直接尋址:JMPfarptrlabel;IP-label的偏移地址;CS-label的段地址

將標號所在段的段地址作為新的CS值,標號在該段內(nèi)的偏移地址作為新的IP值;

這樣,程序跳轉(zhuǎn)到新的代碼段執(zhí)行

例:jmpfarptrotherseg;遠轉(zhuǎn)移到代碼段2的otherseg

24>段間轉(zhuǎn)移、間接尋址:JMPfarptrmem;IP-[mem],CS-[mem+2]

用一個雙字存儲單元表示要跳轉(zhuǎn)的目標地址。這個目標地址存放在主存中連續(xù)的兩

個字單元中的,低位字送IP寄存器,高位字送CS寄存器

例:movwordptr[bx],0

Movwordptr[bx+2],1500h

JMPfarptr[bx];轉(zhuǎn)移到1500h:0

25、用符號表示位移量:

在寄存器相對尋址或相對基址變址尋址方式中,位移量可用符號表示:

MOVAXJSI+COUNT];COUNT是事先定義的變量或常量(就是數(shù)值)

MOVAX,[BX+SI+WNUM];WNUM也是變量或常量

26、多種表達形式:

同一尋址方式可以寫成不同的形式:

MOVAX,[BX][SI]等同于MOVAX,[BX+SI]

MOVAX,COUNTLSIJ等同于MOVAX,[SI+COUNTJ

MOVAX,WNUM[BX1[SI]等同于MOVAX,WNUM|BX+SI]

等同于MOVAX,[BX+SI+WNUM]

27、80x86指令系統(tǒng)共有117條基本指令,可分成6個功能組

數(shù)據(jù)傳送指令;算術(shù)運算指令;邏輯指令

串處理指令;控制轉(zhuǎn)移指令;處理機控制指令

28、數(shù)據(jù)傳送是計算機中最基本、最重要的一種操作;傳送指令也是最常使用的一類指令

傳送指令把數(shù)據(jù)從一個位置傳送到另一個位置

除標志寄存器傳送指令外,均不影響標志位

重點掌握:MOVXCHGXLATPUSHPOPLEA

29、有3條指令:MOVXCHGXLAT

MOV:把一個字節(jié)或字的操作數(shù)從源地址傳送至目的地址

例:MOVreg/mem,imm;立即數(shù)送寄存器或主存

MOVreg/mem/seg,reg;寄存器送(段)寄存器或主存

MOVreg/seg,mem;主存送(段)寄存器

MOVreg/mem,seg;段寄存器送寄存器或主存

30、立即數(shù)傳送:moval,4;al*-4,字節(jié)傳送

movcx,0ffh;cx*-00fTh,字傳送

movbyteptr[si],Oah;byteptr說明是字節(jié)操作

movwordptr[si+2],0bh;wordptr說明是字操作

注意:立即數(shù)是字節(jié)量還是字量;明確指令是字節(jié)操作還是字操作

31、寄存器傳送:movax,bx;ax*-bx,字傳送

movah,al;ah-al,字節(jié)傳送

32、存儲器傳送:moval,[bx]movdx,[bp];dx*ss:[bp]

moves,[si];es-ds:[si]

注意:不存在存儲器向存儲器的傳送指令

33、段寄存器傳送:mov[si],dsmovax,es;ax-es

movds,ax;ds*-ax*-es

注意:對段寄存器的操作有一些限制

c

2

c

34、非法傳送種種

兩個操作數(shù)的類型不一致:例如源操作數(shù)是字節(jié),而目的操作數(shù)是字;或相反

兩個操作數(shù)不能都是存儲器:例:傳送指令很靈活,但主存之間的直接傳送卻不允許

段寄存器的操作有一些限制:例:段寄存器屬專用寄存器,對他們的操作能力有限

35、兩個操作數(shù)的類型要一致

絕大多數(shù)雙操作數(shù)指令,除非特別說明,目的操作數(shù)與源操作數(shù)必須類型一致,否

則為非法指令例如:MOVAL,050AH;非法指令:050Ah為字,而AL為字節(jié)

寄存器有明確的字節(jié)或字類型,有寄存器參與的指令其操作數(shù)類型就是寄存器的類型

對于存儲器單元與立即數(shù)同時作為操作數(shù)的情況,必須顯式指明;byteptr指示字節(jié)

類型,wordptr指示字類型

36、兩個操作數(shù)不能都是存儲器

80x86指令系統(tǒng)不允許兩個操作數(shù)都是存儲單元(除串操作指令),要實現(xiàn)這種傳

送,可通過寄存器間接實現(xiàn)。例如:

movax,bufferl;ax-bufferl(將bufferl內(nèi)容送ax)

movbufferl,ax;buffer!^~ax

;這里bufferl和buffer!是兩個字變量

;實際表示直接尋址方式

37、要小心段寄存器的操作

不允許立即數(shù)傳送給段寄存器:MOVDS,100H;非法指令:立即數(shù)不能傳送段寄存器

不允許直接改變CS值例:MOVCS,[SI];不允許使用的指令

不允許段寄存器之間的直接數(shù)據(jù)傳送MOVDS,ES;非法指令:不允許段寄存器間傳送

38、交換指令XCHG(exchange)

把兩個地方的數(shù)據(jù)進行互換例:XCHGreg,reg/mem;reg—reg/mem

寄存器與寄存器之間對換數(shù)據(jù)

例:movax,1234h;ax=1234h

movbx,5678h;bx=5678h

xchgax,bx;ax=5678h,bx=1234h

xchgah,al;ax=7856h

寄存器與存儲器之間對換數(shù)據(jù)

例:xchgax,[2000h];字交換,等同于xchg[2000h],ax

xchgal,[2000h];字節(jié)交換,等同于xchg[2000h],al

不能在存儲器與存儲器之間對換數(shù)據(jù)

39、換碼指令XLAT(translate)

將BX指定的緩沖區(qū)中、AL指定的位移處的一個字節(jié)數(shù)據(jù)取出賦給AL

例:XLAT;al-ds:[bx+al]

換碼指令執(zhí)行前:在主存建立一個字節(jié)量表格,內(nèi)含要轉(zhuǎn)換成的目的代碼,表格首地址

存放于BX,AL存放相對表格首地址的位移量

換碼指令執(zhí)行后:將AL寄存器的內(nèi)容轉(zhuǎn)換為目標代碼

movbx,l()Oh

moval,03h

xlat

換碼指令沒有顯式的操作數(shù),但使用了BX和AL;因為換碼指令使用了隱含尋址方式一一

采用默認操作數(shù)

40、堆棧操作指令

>堆棧是一個“后進先出FILO”(或說“先進后出FILO”)的主存區(qū)域,位于堆棧段中;

SS段寄存器記錄其段地址

>堆棧只有一個出口,即當前棧頂;用堆棧指針寄存器SP指定

>棧頂是地址較小的一端(低端),棧底不變

41、堆棧和隊列

>堆棧:按照后進先出(LIFO)的原則組織的存儲器空間(棧)

>隊列:按照先進先出(FIFO)的原則組織的存儲器空間

42、堆棧的操作

堆棧只有兩種基本操作:進棧和出棧,對應(yīng)兩條指令PUSH和POP

PUSH:進棧指令先使堆棧指針SP減2,然后把一個字操作數(shù)存入堆棧頂部

例:PUSHrl6/ml6/seg;SP-SP-2,SS:[SP]*-rl6/ml6/seg

POP;出棧指令把棧頂?shù)囊粋€字傳送至指定的目的操作數(shù),然后堆棧指針SP加2

例:POPrl6/ml6/seg;rl6/ml6/seg*-SS:[SP],SP=SP+2

43、堆棧的特點

>堆棧操作的單位是字,進棧和出棧只對字量

>字量數(shù)據(jù)從棧頂壓入和彈出時,都是低地址字節(jié)送低字節(jié),高地址字節(jié)送高字節(jié)

>堆棧操作遵循先進后出原則,但可用存儲器尋址方式隨機存取堆棧中的數(shù)據(jù)

>堆棧常用來:臨時存放數(shù)據(jù);傳遞參數(shù);保存和恢復(fù)寄存器

44、標志寄存器傳送指令

標志寄存器傳送指令用來傳送標志寄存器FLAGS的內(nèi)容,方便進行對各個標志位的直

接操作

有2對4條指令:低8位傳送:LAHF和SAHF;16位傳送:PUSHF和POPF

45、標志低字節(jié)進出AH指令

LAHF;AH-FLAGS的低字節(jié)

>LAHF指令將標志寄存器的低字節(jié)送寄存器AH

>SF/ZF/AF/PF/CF狀態(tài)標志位分別送入AH的第7/6/4/2/0位,而AH的第5/3/1位任

SAHF;FLAGS的低字節(jié)+AH

>SAHF將AH寄存器內(nèi)容送FLAGS的低字節(jié)

A用AH的第7/6/4/2/0位相應(yīng)設(shè)置SF/ZF/AF/PF/CF標志

PUSHF;SP*-SP-2;SS:[SP]*-FLAGS

>PUSHF指令將標志寄存器的內(nèi)容壓入堆棧,同時棧頂指針SP減2

POPF:FLAGS-SS:[SP];SP+SP+2

>POPF指令將棧頂字單元內(nèi)容送標志寄存器,同時棧頂指針SP加2

46、置位單步標志

pushf;保存全部標志到堆棧

popax;從堆棧中取出全部標志

orax,0100h;設(shè)置D8=TF=1,;ax其他位不變

pushax;將ax壓入堆棧

popf;FLAGS-AX;將堆棧內(nèi)容取到標志寄存器

47、地址傳送指令

>地址傳送指令將存儲器單元的邏輯地址送至指定的寄存器

1、有效地址傳送指令LEA2、指針傳送指令LDS和LES

>注意不是獲取存儲器單元的內(nèi)容

48、有效地址傳送指令LEA(loadEA)

>將存儲器操作數(shù)的有效地址傳送至指定的16位寄存器中

例:LEArl6,mem;rl6+mem的有效地址EA

49、獲取有效地址

movbx,0400h

movsi,3ch

leabx,[bx+si+0f62h];BX=0400h+003ch+0f62h=139EH

勺獲得主存單元的有效地址;不是物理地址,也不是該單元的內(nèi)容

3可以實現(xiàn)計算功能

50、指針傳送指令

LDS指令將主存中mem指定的字送至rl6,并將mem的下一字送DS寄存器

例:LDSrl6,mem;rl6-mem,;DS=mem+2

ALES指令將主存中mem指定的字送至rl6,并將mem的下一字送ES寄存器

例:LESrl6,mem;rl6-mem,;ES-mem+2

51、地址指針傳送

movwordptr[3060h],0100h

movwordptr[3062h],1450h

lesdi,[3060h];es=1450h,di=0100h

Idssi,[3060h];ds=1450h,si=0100h

mem指定主存的連續(xù)4個字節(jié)作為邏輯地址(32位的地址指針),送入DS:rl6或ES:rl6

52、輸入輸出指令

>80x86通過輸入輸出指令與外設(shè)進行數(shù)據(jù)交換;呈現(xiàn)給程序員的外設(shè)是端口(Port)

即I/O地址

>80x86用于尋址外設(shè)端口的地址線為16條,端口最多為216=65536(64K)個,端

口號為0000H?FFFFH

>每個端口用于傳送一個字節(jié)的外設(shè)數(shù)據(jù)

53、輸入輸出尋址方式

>80x86的端口有64K個,無需分段,設(shè)計有兩種尋址方式

?直接尋址:只用于尋址00H?FFH前256個端口,操作數(shù)i8表示端口號

間接尋址:可用于尋址全部64K個端口,DX寄存器的值就是端口號

>對大于FFH的端口只能采用間接尋址方式

54、輸入指令I(lǐng)N:將外設(shè)數(shù)據(jù)傳送給CPU內(nèi)的AL/AX

例:INAL,i8;字節(jié)輸入:AL+I/O端口(i8直接尋址)

INAL,DX;字節(jié)輸入:AL+I/O端口(DX間接尋址)

INAX,i8;字輸入:AX+I/O端口(i8直接尋址)

INAX,DX;字輸入:AX+I/O端口(DX間接尋址)

55、字量數(shù)據(jù)傳送實際上實現(xiàn)了連續(xù)的兩個端口地址的字節(jié)量傳送

例:inal,21h

movah,al

inal,20h;直接尋址,字節(jié)量輸入等同于下一句

inax,20h;直接尋址,字量輸入子也等同于下一句

movdx,20h

inax,dx;I間接尋址,字量輸入

56、輸出指令OUT::將CPU內(nèi)的AL/AX數(shù)據(jù)傳送給外設(shè)

例:OUTi8,AL;字節(jié)輸出:I/O端口=AL(i8直接尋址)

OUTDX,AL-;字節(jié)輸出:I/O端口一AL(DX間接尋址)

OUTi8,AX;字輸出:1/0端口-AX68直接尋址)

OUTDX,AX:;字輸出:I/O端口-AX(DX間接尋址)

57、間接尋址,字節(jié)量輸出實例:

movdx,3fch

moval,80h

outdx,al

58、算術(shù)運算類指令

>四則運算是計算機經(jīng)常進行的一種操作。算術(shù)運算指令實現(xiàn)二進制(和十進制)數(shù)

據(jù)的四則運算

>請注意算術(shù)運算類指令對標志的影響

■掌握:ADD/ADC/INC>SUB/SBB/DEC/NEG/CMP

■熟悉:MUL/IMUL、DIV/IDIV

■理解:CBW/CWD>DAA/DAS、AAA/AAS/AAM/AAD

59、加法指令A(yù)DD

>ADD指令將源與目的操作數(shù)相加,結(jié)果送到目的操作數(shù)

>ADD指令按狀態(tài)標志的定義相應(yīng)設(shè)置

格式:ADDreg,imm/reg/mein;reg<-reg+imm/reg/mem

ADDmem,iinm/reg;mem-mem+imm/reg

例:moval,Ofbh;al=Ofbhaddal,07h;al=02h

movwordptr[200h],4652h;|200h]=4652h

movbx,lfeh;bx=lfehaddal,bl;al=00h

addwordptr[bx+2],()f()f()h;[200h]=3742h

60、帶進位加法指令A(yù)DC

>ADC指令將源與目的操作數(shù)相加,再加上進位CF標志,結(jié)果送到目的操作數(shù)

>ADC指令按狀態(tài)標志的定義相應(yīng)設(shè)置

>ADC指令主要與ADD配合,實現(xiàn)多精度加法運算

格式:ADCreg,imm/reg/mem;reg*-reg+imm/reg/mem+CF

ADCmem,imm/reg;mem+mem+imm/reg+CF

61、增量指令I(lǐng)NC(increment)

>INC指令對操作數(shù)加1(增量)

>INC指令不影響進位CF標志,按定義設(shè)置其他狀態(tài)標志

格式:INCreg/mem;reg/mem*-reg/mem+1

62、減法指令SUB(subtract)

ASUB指令將目的操作數(shù)減去源操作數(shù),結(jié)果送到目的操作數(shù)

>SUB指令按照定義相應(yīng)設(shè)置狀態(tài)標志

格式:SUBreg,imm/reg/mem;reg-reg-imm/reg/mem

SUBmem,imm/reg;mem-mem-imm/reg

63、帶借位減法指令SBB

SBB指令將目的操作數(shù)減去源操作數(shù),再減去借位CF(進位),結(jié)果送到目的操作數(shù)。

>SBB指令按照定義相應(yīng)設(shè)置狀態(tài)標志

>SBB指令主要與SUB配合,實現(xiàn)多精度減法運算

格式:SBBreg,imm/reg/mem;reg-reg-imm/reg/mem-CF

SBBmem,imm/reg;mem-mem-imm/reg-CF

64>減量指令DEC(decrement)

>DEC指令對操作數(shù)減1(減量)

>DEC指令不影響進位CF標志,按定義設(shè)置其他狀態(tài)標志

格式:DECreg/mem;reg/memreg/mem-1

?INC指令和DEC指令都是單操作數(shù)指令

?主要用于對計數(shù)器和地址指針的調(diào)整

65、求補指令NEG(negative)

>NEG指令對操作數(shù)執(zhí)行求補運算:用零減去操作數(shù),然后結(jié)果返回操作數(shù)

>求補運算也可以表達成:將操作數(shù)按位取反后加1

>NEG指令對標志的影響與用零作減法的SUB指令一樣

格式:NEGreg/mem;reg/mem^0—reg/mem

例:movax,0ff64h

negal;ax=ff9ch,OF=0^SF=1>ZF=O、PF=KCF=1

66、比較指令CMP(compare)

>CMP指令將目的操作數(shù)減去源操作數(shù),按照定義相應(yīng)設(shè)置狀態(tài)標志

>CMP指令執(zhí)行的功能與SUB指令,但結(jié)果不回送目的操作數(shù)

格式:CMPreg,imm/reg/mem;reg—imm/reg/mem

CMPmem,imm/reg;mem-imm/reg

實例:cmpal,100;al-100

jbbelow;al<100,跳轉(zhuǎn)到below執(zhí)行

立執(zhí)行比較指令之后,可以根據(jù)標志判斷兩個數(shù)是否相等、大小關(guān)系等

67、乘法指令

MULr8/m8;無符號字節(jié)乘法;AX^-ALXr8/m8

MULrl6/ml6;無符號字乘法;DX.AX^AXXrl6/ml6

IMULr8/m8;有符號字節(jié)乘法;AX^-ALXr8/m8

IMULrl6/ml6;有符號字乘法;DX?AX-AXXrl6/ml6

68、乘法指令的功能

>乘法指令分無符號和有符號乘法指令

>乘法指令的源操作數(shù)顯式給出,隱含使用另一個操作數(shù)AX和DX

字節(jié)量相乘:AL與r8/m8相乘,得到16位的結(jié)果,存入AX

字量相乘:AX與rl6/ml6相乘,得到32位的結(jié)果,其高字存入DX,低字存入AX

>乘法指令利用OF和CF判斷乘積的高一半是否具有有效數(shù)值

69、乘法指令對標志的影響

A乘法指令如下影響OF和CF標志:

MUL指令——若乘積的高一半(AH或DX)為0,貝!|OF=CF=0;否貝!IOF=CF=1

IMUL指令——若乘積的高一半是低一半的符號擴展,則OF=CF=0;否則均為1

>乘法指令對其他狀態(tài)標志沒有定義

注意:對標志沒有定義:指令執(zhí)行后這些標志是任意的、不可預(yù)測(就是誰也不知道

是0還是1);對標志沒有影響:指令執(zhí)行不改變標志狀態(tài)

70、除法指令

DIVr8/m8;無符號字節(jié)除法:AL-AX+r8/m8的商,Ah-AX+r8/m8的余數(shù)

DIVrl6/ml6;無符號字除法:;AX*-DX.AX4-rl6/ml6的商,DX-DX.AX+rl6/ml6

的余數(shù)

IDIVr8/m8;有符號字節(jié)除法:AL-AX+r8/m8的商,Ah*AX+r8/m8的余數(shù)

IDIVrl6/ml6;有符號字除法:;AX*-DX.AX^-rl6/ml6的商,DX-DX.AX+rl6/ml6

的余數(shù)

71、除法指令的功能

>除法指令分無符號和有符號除法指令

>除法指令的除數(shù)顯式給出,隱含使用另一個操作數(shù)AX和DX作為被除數(shù)

■字節(jié)量除法:AX除以r8/m8,8位商存入AL,8位余數(shù)存入AH

■字量除法:DX.AX除以rl6/ml6,16位商存入AX,16位余數(shù)存入DX

>除法指令對標志沒有定義

>除法指令會產(chǎn)生結(jié)果溢出

72、除法錯中斷

>當被除數(shù)遠大于除數(shù)時,所得的商就有可能超出它所能表達的范圍。如果存放商

的寄存器AL/AX不能表達,便產(chǎn)生溢出,80x86CPU中就產(chǎn)生編號為0的內(nèi)部中斷

——除法錯中斷

1、對DIV指令,除數(shù)為0,或者在字節(jié)除時商超過8位,或者在字除時商超過16位

則發(fā)生除法溢出

2、對IDIV指令,除數(shù)為0,或者在字節(jié)除時商不在-128?127范圍內(nèi),或者在字除時

商不在-32768?32767范圍內(nèi),則發(fā)生除法溢出

73、符號擴展指令

CBW;AL的符號擴展至AH

;如AL的最高有效位是0,則AH=00

;AL的最高有效位為1,則AH=FFH。AL不變

CWD;AX的符號擴展至DX

;如AX的最高有效位是(),則DX=()()

;AX的最高有效位為1,貝!|DX=FFFFH。AX不變

>符號擴展指令常用于獲得倍長的數(shù)據(jù)

74、符號擴展的概念:符號擴展是指用一個操作數(shù)的符號位(即最高位)形成另一個操作

數(shù),后一個操作數(shù)的各位是全0(正數(shù))或全1(負數(shù))。符號擴展不改變數(shù)據(jù)大小

cwd;DX.AX+AX

idivbx;AX-DX.AX+BX

?利用符號擴展指令得到除法指令所需要的倍長于除數(shù)的被除數(shù)

C對無符號數(shù)除法應(yīng)該采用直接使高8位或高16位清0的方法,獲得倍長的被除數(shù)

75、十進制調(diào)整指令

>十進制數(shù)調(diào)整指令對二進制運算的結(jié)果進行十進制調(diào)整,以得到十進制的運算結(jié)果

A分成壓縮BCD碼和非壓縮BCD碼調(diào)整

76、BCD碼

>二進制編碼的十進制數(shù):一位十進制數(shù)用4位二進制編碼來表示

77、壓縮BCD碼加、減調(diào)整指令

ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)

DAA;AL-將AL的加和調(diào)整為壓縮BCD碼

(SUBAL,i8/r8/m8)

(SBBAL,i8/r8/m8)

DAS;AL-將AL的減差調(diào)整為壓縮BCD碼

A78、使用DAA或DAS指令前,應(yīng)先執(zhí)行以AL為目的操作數(shù)的加法或減法指令

>DAA和DAS指令對OF標志無定義,按結(jié)果影響其他標志,例如CF反映壓縮BCD

碼相加或減的進位或借位狀態(tài)

78、壓縮BCD加法

moval,68h;al=68h,壓縮BCD碼表示真值68

movbl,28h;bl=28h,壓縮BCD碼表示真值28

addal,bl;二進制力口法:al=68h+28h=90h

daa;十進制調(diào)整:al=96h;實現(xiàn)壓縮BCD碼加法:68+28=96

79、非壓縮BCD碼加、減調(diào)整指令

(ADDAL,i8/r8/m8)(ADCAL,i8/r8/m8)

AAA;AL*將AL的加和調(diào)整為非壓縮BCD碼

;AH-AH+調(diào)整的進位

(SUBAL,i8/r8/m8)(SBBAL,i8/r8/m8)

AAS;AL-將AL的減差調(diào)整為非壓縮BCD碼

;AH+AH-?調(diào)整的借位

80、非壓縮BCD碼乘、除調(diào)整指令

(MULr8/m8)

AAM;AX*將AX的乘積調(diào)整為非壓縮BCD碼

AAD;AX-將AX中非壓縮BCD碼擴展成二進制數(shù)(DIVr8/m8)

81、AAM指令跟在字節(jié)乘MUL之后,將乘積調(diào)整為非壓縮BCD碼

>AAD指令跟在字節(jié)除DIV之前,先將非壓縮BCD碼的被除數(shù)調(diào)整為二進制數(shù)

>AAM和AAD指令根據(jù)結(jié)果設(shè)置SF、ZF和PF,但對OF、CF和AF無定義

82、非壓縮BCD加

movax,0608h;ax=0608h,非壓縮BCD碼表示真值68

movbl,09h;bl=09h,非壓縮BCD碼表示真值9

addal,bl;二進制力口法:al=08h+09h=llh

aaa;十進制調(diào)整:ax=0707h;實現(xiàn)非壓縮BCD碼加法:68+9=77

83、非壓縮BCD減

movax,0608h;ax=0608h,非壓縮BCD碼表示真值68

movbl,09h;bl=09h,非壓縮BCD碼表示真值9

subal,bl;二進制減法:al=08h-09h=fTh

aas;十進制調(diào)整:ax=0509h;實現(xiàn)非壓縮BCD碼減法:68-9=59

83、非壓縮BCD乘

movax,0608h;ax=0608h,非壓縮BCD碼表示真值68

movbl,09h;bl=09h,非壓縮BCD碼表示真值9

mulbl;二進制乘法:al=08hX09h=0048h

aam;十進制調(diào)整:ax=0702h;實現(xiàn)非壓縮BCD碼乘法:8X9=72

84、非壓縮BCD除

movax,0608h;ax=0608h,非壓縮BCD碼表示真值68

movbl,09h;bl=09h,非壓縮BCD碼表示真值9

aams二進制擴展:ax=68=0044h

divbl;除法運算:商al=07h,余數(shù)ah=05h

;實現(xiàn)非壓縮BCD碼初法:68+9=7(余5)

85REP重復(fù)前綴指令

REP;每執(zhí)行一次串指令,CX減1;直到CX=0,重復(fù)執(zhí)行結(jié)束

86重復(fù)串傳送

movsi,offsetsource

movdi,offsetdestination

movex,100;ex-傳送次數(shù)

cld

repmovsb

(again:movsb;傳送一個字節(jié)

decex;傳送次數(shù)減1

jnzagain;判斷傳送次數(shù)ex是否為0

;不為0(ZF=0),則轉(zhuǎn)移again位置執(zhí)行

;否則,結(jié)束

)

87重復(fù)串存儲

movax,0

movdi,0

movcx,8000h

eld

repstosw

(again:stosw;傳送一個字

decex;傳送次數(shù)減1

jnzagain;判斷傳送次數(shù)ex是否為0

)

88REPZ重復(fù)前綴指令

REPZ;每執(zhí)行一次串指令,CX減1

;并判斷ZF是否為0,

;只要CX=0或ZF=0,重復(fù)執(zhí)行結(jié)束

89REPNZ重復(fù)前綴指令

REPZ;每執(zhí)行一次串指令,CX減1

;并判斷ZF是否為1,

;只要CX=0或ZF=1,重復(fù)執(zhí)行結(jié)束

比較字符串

movsi,offsetstringl

movdi9offsetstring!

movcx9count

cld

repzcmpsb;重復(fù)比較兩個字符

jnzunmat;字符串不等,轉(zhuǎn)移

moval,0;字符串相等,設(shè)置00h

jmpoutput;轉(zhuǎn)向output

unmat:moval,Offh;設(shè)置ffh

output:movresult,al;輸出結(jié)果標記

90重復(fù)比較的解釋

>指令repzcmpsb結(jié)束重復(fù)執(zhí)行的情況

①ZF=0,即出現(xiàn)不相等的字符

②CX=0,即比較完所有字符:

這種情況下,如果ZF=0,說明最后一個字符不等;而ZF=1表示所有字符比較后都相等,

也就是兩個字符串相同

>所以,重復(fù)比較結(jié)束后,jnzunmat指令的條件成立ZF=0,表示字符串不相等

91查找字符串

movdi,offsetstring

moval,20h

movcx9count

cld

repnzscasb;搜索

jzfound;為0(ZF=1),發(fā)現(xiàn)空格

...;不含空格,則繼續(xù)執(zhí)行

found:...

85、教學要求

1.熟悉80x86的基本參數(shù)、堆棧工作原理、指令對標志的影響、符號擴展的含義、壓

縮和非壓縮BCD的格式

2.掌握基本指令:MOV/XCHG/XLAT,PUSH/POP>LEA;CLC/STC/STC,

CLD/STD;ADD/ADC/INC、SUB/SBB/DEC/CMP/NEG、CBW/CWD

3.熟悉串操作尋址特點

4.掌握基本指令:AND/OR/XOR/NOT/TEST、SHL/SHR/SAR、ROL/ROR

/RCL/RCR^MOVS/LODS/STOS>REP

5.熟悉特色指令:CMPS/SCAS

6.了解不常使用的指令:REPZ/REPNZ

第四章

重點掌握:

/程序的格式、開發(fā)方法

/參數(shù)的表達、變量的定義

/變量和標號的屬性

1源程序分別用兩種格式書寫

?第一種格式從MASM5.0開始支持:簡化段定義格式

?:?第二種格式MASM5.0以前就具有:完整段定義格式

2lt301a.asm(文件名)

.modelsmall;定義程序的存儲模式

.stack;定義堆棧段

.data;定義數(shù)據(jù)段

stringdb'Hello,Everybody!\0dh,0ah,,$,

;在數(shù)據(jù)段定義要顯示的字符串

.code;定義代碼段

.startup;程序起始點,建立DS、SS

movdx,offsetstring;指定字符串

movah,9

int21h;利用功能調(diào)用顯示信息

.exit0;程序結(jié)束點,返回DOS

end;匯編結(jié)束

3SampleA.ASM

?modelsmall

.stack

.data

...;在數(shù)據(jù)段定義數(shù)據(jù)

.code

.startup;(注1)

...;在代碼段填入指令序列

.exit0;(注2)

...;子程序代碼

end

4;SampleC.ASM

.modelsmall

.stack

.data

...;在數(shù)據(jù)段定義數(shù)據(jù)

.code

start:movax,@data

movds,ax

...;在代碼段填入指令序列

movax,4c00h

int21h

...;子程序代碼

endstart

5lt301b.asm(文件名)

stacksegmentstack;定義堆棧段

dw512dup(?)

;堆棧段有512字(1024字節(jié))空間

stackends;堆棧段結(jié)束

datasegment;定義數(shù)據(jù)段

stringdb'Hello,Everybody!\()dh,()ah,,$,

dataends

codesegment'code,;定義代碼段

assumecs:code,ds:data9ss:stack

start:movax,data;建立DS段地址

movds,ax

movdx,offsetstring

movah,9

int21h

movax,4c00h

int21h;利用功能調(diào)用返回DOS

codeends;代碼段結(jié)束

endstart

;匯編結(jié)束,同時指明程序起始點

6完整段定義格式MASM5.x支持

SampleB.ASM

stacksegmentstack

dw512dup(?)

stackends

datasegment

...;在數(shù)據(jù)段定義數(shù)據(jù)

dataends

codesegment'code'

assumecs:code9ds:data,ss:stack

start:movax,data

movds,ax

...;在代碼段填入指令序列

movax,4c00h

int21h

...;子程序代碼

codeends

endstart

7硬指令——使CPU產(chǎn)生動作、并在程序執(zhí)行時才處理的語句,就是第3章學習的處理

器指令

8偽指令(Directive)——不產(chǎn)生CPU動作、在程序執(zhí)行前由匯編程序處理的說明性語句,

例如,數(shù)據(jù)說明、變量定義等等

9偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān)

10匯編語言程序的過程:(即匯編語言程序的開發(fā)方法)編輯:源程序:文件名.asm;匯

編:目標模塊:文件名.obj;連接:可執(zhí)行文件:文件名.exe;調(diào)試:應(yīng)用程序

11匯編是將源程序翻譯成由機器代碼組成的目標模塊文件的過程

12連接程序能把一個或多個目標文件和庫文件合成一個可執(zhí)行程序

13經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運行:

It301a操作系統(tǒng)裝載該文件進入主存,并開始運行

14完整段定義由SEGMENT和ENDS這一對偽指令實現(xiàn),SEGMENT偽指令定義一個邏

輯段的開始,ENDS偽指令表示一個段的結(jié)束

>段定義指令后的4個關(guān)鍵字用于確定段的各種屬性,堆棧段要采用stack組合類型,

代碼段應(yīng)具有,code,類別,其他為可選屬性參數(shù)

15段定位(align)屬性

>指定邏輯段在主存儲器中的邊界,可為:

BYTE段開始為下一個可用的字節(jié)地址(xxxxxxxxb)

WORD段開始為下一個可用的偶數(shù)地址(xxxxxxxOb)

DWORD段開始為下一個可用的4倍數(shù)地址(xxxxxxOOb)

PARA段開始為下一""b可用的節(jié)地址(xxxx0000b)

PAGE段開始為下一個可用的頁地址(00000000b)

>簡化段定義偽指令的代碼和數(shù)據(jù)段默認采用WORD定位,堆棧段默認采用PARA

定位

>完整段定義偽指令的默認定位屬性是PARA,其低4位已經(jīng)是0,所以默認情況下

數(shù)據(jù)段的偏移地址從0開始

16段組合(combine)屬性

>指定多個邏輯段之間的關(guān)系,可為:

PRIVATE本段與其他段沒有邏輯關(guān)系,不與其他段合并,每段都有自己的段地址。這

是完整段定義偽指令默認的段組合方式

PUBLIC連接程序把本段與所有同名同類型的其他段相鄰地連接在一起,然后為所有這些

段指定一個共同的段地址,也就是合成一個物理段。這是簡化段定義偽指令默認的段組合

STACK本段是堆棧的一部分,連接程序?qū)⑺蠸TACK段按照與PUBLIC段的同樣方式

進行合并。這是堆棧段必須具有的段組合

17段字(use)屬性

>為支持32位段而設(shè)置的屬性

>對于16位x86CPU來說,它默認是16位段,即USE16

而對于匯編32位x86CPU指令時,它默認采用32位段,即USE32;但可以使用USE16

指定標準的16位段

>編寫運行于實地址方式(8086工作方式)的匯編語言程序,必須采用16位段

18段類別(class)屬性

>當連接程序組織段時,將所有的同類別段相鄰分配

>段類別可以是任意名稱,但必須位于單引號中

>大多數(shù)MASM程序使用‘code,、'data,和,stack,來分別指名代碼段、數(shù)據(jù)段和堆棧

段,以保持所有代碼和數(shù)據(jù)的連續(xù)

19END[標號]

>指示匯編程序MASM到此結(jié)束匯編過程

>源程序的最后必須有一條END語句

>可選的標號用于指定程序開始執(zhí)行點,連接程序?qū)?jù)此設(shè)置CS:IP值

>采用了.startup偽指令就不需要再用“end標號”指明開始執(zhí)行點,但還要有end

偽指令

注意:程序終止和匯編結(jié)束是兩碼事

20語句格式

執(zhí)行性語句——由硬指令構(gòu)成的語句,它通常對應(yīng)一條機器指令,出現(xiàn)在程序的代碼段中:

標號:硬指令助記符操作數(shù),操作數(shù);注釋

說明性語句——由偽指令構(gòu)成的語句,它通常指示匯編程序如何匯編源程序:

名字偽指令助記符參數(shù),參數(shù),…;注釋

21標號、名字與標識符

>標號是反映硬指令位置(邏輯地址)的標識符,后跟一個冒號分隔

>名字是反映偽指令位置(邏輯地址)和屬性的標識符,后跟空格或制表符分隔,沒

有一個冒號

>標識符(Identifier)一般最多由26個字母、數(shù)字及規(guī)定的特殊符號(如一、$、?、

@)組成,不能以數(shù)字開頭。默認情況下,匯編程序不區(qū)別標識符中的字母大小寫

>一個程序中,每個標識符的定義是唯一的,還不能是匯編語言采用的保留字

22保留字

>保留字(ReservedWord)是匯編程序已經(jīng)利用的標識符,主要有:

o硬指令助記符——例如:MOV、ADD

o偽指令助記符——例如:DB、EQU

o操作符——例如:OFFSET、PTR

o寄存器名——例如:AX、CS

o預(yù)定義符號----例如:@data

o匯編語言大小寫不敏感

23助記符

>硬指令助記符可以是任何一條處理器指令,也可以是一條宏指令

24操作數(shù)與參數(shù)

>處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲單元

>偽指令的參數(shù)可以是常數(shù)、變量名、表達式等,可以有多個,參數(shù)之間用逗號分隔

25注釋

>語句中由分號“;”開始的部分為注釋內(nèi)容,用以增加源程序的可讀性

>必要時,一個語句行也可以由分號開始作為階段性注釋

>匯編程序在翻譯源程序時將跳過該部分,不對它們做任何處理

26分隔符

>語句的4個組成部分要用分隔符分開

>標號后用冒號,注釋前用分號

>操作數(shù)之間和參數(shù)之間使用逗號分隔

>其他部分通常采用空格或制表符

>多個空格和制表符的作用與一個相同

>MASM支持續(xù)行符巴”

27匯編語言源程序的組成原則

>完整的匯編語言源程序由段組成

>一個匯編語言源程序可以包含若干個代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之

間的順序可隨意排列

>需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有

一個起始點

>所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi),說明性語句可根據(jù)需要位于任一段

內(nèi)

>通常,程序還需要一個堆棧段

28數(shù)值型參數(shù)

>在源程序語句格式的4個組成部分中,參數(shù)是指令的操作對象(在學習硬指令時被

稱為操作數(shù)),參數(shù)之間用逗號分隔

A參數(shù)根據(jù)指令不同可以沒有,可以有1個、2個或多個

>匯編語言程序中,指令參數(shù)有數(shù)值型,它的主要形式是常數(shù)和數(shù)值表達式;

>硬指令的操作數(shù)有立即數(shù);立即數(shù)就要用數(shù)值型參數(shù)表達

29常數(shù)

>常數(shù)(常量)表示一個固定的數(shù)值

>它又分成多種形式:

(1)十進制常數(shù)(2)十六進制常數(shù)(3)二進制常數(shù)(4)八進制常數(shù)(5)字符串常數(shù)

(6)符號常數(shù)

30數(shù)值表達式

>數(shù)值表達式一般是指由運算符連接的各種常數(shù)所構(gòu)成的表達式

>匯編程序在匯編過程中計算表達式,最終得到一個數(shù)值

>程序運行之前,就已經(jīng)計算出了表達式;所以,程序運行速度沒有變慢,但增強程

序的可讀性

>MASM對除偽指令外各種匯編時處理的指令統(tǒng)稱為操作符(Operator)

31運算符

>算術(shù)運算符:+-*/MOD或叫:力口、減、乘、除、取余

>邏輯運算符:ANDORXOR

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論