博主聯系方式:
QQ:1540984562
QQ交流群:892023501
群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。
【沒事兒可以到我主頁看看】https://blog.csdn.net/qq_42604176
傳送類指令
- 1.通用傳送類指令:MOV指令
- MOV例題講解:
- 2.取有效指令LEA指令:
- LEA例題講解:
- 3.取地址指針指令:LDS、LES
- LDS例題講解:
- LES例題講解:
- 4.標志傳送指令:LAHF、SAHF
- 5.數據交換指令:XCHG
- 6.字節轉換指令:XLAT
- 7.堆棧操作指令:PUSH、POP、PUSHF、POPF
- 棧操作例題講解:
功能:把數據、地址、或立即數傳送到寄存器或存儲單元中 。
1.通用傳送類指令:MOV指令
MOV指令的格式為: MOV DST, SRC (MOV指令的實質是:把SRC的內容復制到DST中,執行操作后 SRC的內容不變!)
語法格式:MOV reg/mem/seg ,reg/mem/seg/imm
Reg:寄存器,mem:存儲器,seg:段寄存器,imm立即數
對標志位的影響:除標志寄存器傳送指令外,均不影響標志位
當無法通過任一個操作數確定是操作類型時,需要利用匯編語言的操作符顯式指明
MOV [BX+SI], 255 ;非法指令,修正:
MOV BYTE PTR [BX+SI],255;BYTE PTR說明是字節操作
MOV WORD PTR [BX+SI],255;WORD PTR說明是字操作
MOV例題講解:
問:將以AREA1為首地址的100個字節數據搬移到以AREA2為首地址的內存中,若AREA1和AREA2都在當前數據段中,可以用帶有循環控制的數據傳送程序來實現。
MOV SI,OFFSETAREA1;(OFFSET是取地址
MOV DI,OFFSETAREA2; 偏移量,必須加上)
;SI DI作為指針指向兩個內存的首地址
MOV CX,100; 循環次數為100
AGAIN:MOV AL,[SI];RD為低MOV [DI],AL ;WR為低 通過中間寄存器,將SI指向的內容轉移到DI指向的空間INC SI INC DI ;指針自加1DEC CX ;計數器減1JNZ AGAIN ;結果不為0轉移 等效于LOOP
有關尋址方式的一些語法要求請看這里!!!
2.取有效指令LEA指令:
指令格式: LEA reg16 ,存儲器尋址方式/地址標號
將源操作數指向的偏移地址送入寄存器中
LEA BX,[BX+SI+0F62H]
如指令執行前:
(BX)=0400H,(SI)=003CH
則指令執行后:
(BX)=0400H+003CH+ 0F62H=139EH;139EH是偏移地址!不是DS:139EH中的內容!
LEA 指令與MOV 指令的區別:
LEA SI,BUFF;將標號BUFF的偏移地址送入寄存器中
MOV SI,BUFF;將標號BUFF所指存儲單元的內容送入SI
LEA例題講解:
問:如指令執行前(SI)=3000H,(BX)=0400H,MEEM=12000H,DS=1000H,執行LEA BX,MEEM指令后BX的內容為
BX存儲的是MEEM的偏移地址,BX=MEEM-DS*16H=2000H;
問:執行LEA BX,(SI)指令后BX的內容為
BX存儲的是SI的偏移地址所以BX=(SI)=3000H;
3.取地址指針指令:LDS、LES
LDS指令 (指針送寄存器和DS)
指令格式:LDS reg16 ,存儲器尋址方式
語法格式:LDS reg16 ,reg16/mem/lable
指令功能:從src指定的存儲單元開始,由4個連續存儲單元中取出前2字節送到reg,取出后2字節送到DS中
LDS例題講解:
問:LDS AX,(SI +20 ) (20050H)=1234H,(20052H)=5678H,AX=0000H,DS=2000H,SI=0030H,
執行的結果為:AX=???,DS=???
src存儲單元地址=DS*16H + SI + 20H =20000+0030+0020=20050;
AX=(20050)=1234H;
DS=(20050+2)=5678H;
問:已知指令執行前(22000H~22005H)=12H、34H,56H、78H,9AH、BCH,AX=0000H,DS=2000H,BX=2000H,MEEM=22002H,執行指令LDS AX,MEEM和執行指令LDS AX,(BX)
LES指令 (指針送寄存器和ES)
指令格式:LES reg16 ,存儲器尋址方式
語法格式: LES reg16 ,reg16/mem/lable ;
指令功能:從src指定的存儲單元開始,由4個連續存儲單元中取出前2字節送到reg,取出后2字節送到ES中
LES例題講解:
問:LES AX,20(SI)或 LES AX,(SI +20 ) 假設執行前為(20050H)=1234H,(20052H)=5678H,AX=0000H,DS=2000H,SI=0030H
執行的結果為:AX=???,ES=???
物理地址=20020+0030H=20050H
AX=(20050H)=1234H
ES=(20050+2H)=5678H
4.標志傳送指令:LAHF、SAHF
5.數據交換指令:XCHG
執行的操作:交換DST與SRC的內容 DST SRC
語法格式為: XCHG reg/mem,reg/mem
注意點:這種交換只能在通用寄存器之間、通用寄存器與存貯器之間進行,存儲器與存儲器之間不能交換段寄存器不能作為一個操作數。
例:XCHG BX ,[BP+SI]
如指令執行前:(BX)=6F30H,(BP)=0200H,2F246H=54H 2F247H=51H ,(SI)=0046H,(SS)=2F00H,(2F00H)=4254H,OPR2的物理地址=2F00×16+0200+0046=2F246H
則指令執行后:(BX)=5154H,(2F246H)=6F30H。
6.字節轉換指令:XLAT
7.堆棧操作指令:PUSH、POP、PUSHF、POPF
堆棧概念–存儲器的一段區域,按“先進后出”的原則進行存取操作。8086/8088系統,堆棧位于堆棧段,其段地址由SS指示,SP寄存器作為指針,SP內容始終指向棧頂所在存儲單元。
堆棧是一塊特殊的存儲區域,利用這塊區域可以存儲返回地址等信息,從而實現子程序的嵌套調用。
作用:在調用一個過程時,保存返回地址;暫時存放寄存器或存儲器單元操作數的內容。
PUSH:
指令格式:進棧 PUSH SRC (堆棧壓入指令,進棧指令)
操作:(SP) (SP)-2, 指針-2
((SP)+1,(SP)) SRC 把操作數壓入棧中
功能:將16位寄存器,段寄存器,16位存儲單元數據壓入堆棧。
POP:
指令格式: 出棧 POP DST
操作:(DST) ((SP)+1,(SP)),
(SP) (SP)+2
過程:
壓棧和出棧的流程:
MOV AX,8000H
MOV SS,AX ;設堆棧段地址 (SS)=8000H
MOV SP,2000H ;設堆棧指針
MOV DX,3E4AH
PUSH DX ;(先進) DX內容存入(SS×16+1FFEH=(SP-2))
PUSH AX ; AX內容存入(SS×16+1FFCH =(SP-2-2) )
PUSH (2000H);取數據段 (DS×16+2000H)內容進棧;存入(SS×16+1FFAH =(SP-2-2-2) )POP (2000H); (SS×16+1FFAH)到(DS×16+2000H)
POP AX ; (SS×16+1FFCH)到AX
POP DX ;(后出) (SS×16+1FFEH)到DX
PUSHF和POPF:
棧操作例題講解:
1、交換DS 和 ES的內容
PUSH DS;
PUSH ES;
POP DS;
POP ES;
2、在子程序設計時,需要從子程序返回時保持通用寄存器不變,這時候可以利用堆棧把寄存器保護起來
PUSH AX;
PUSH BX;
PUSH CX;
PUSH DX;
//調用子程序;
//子程序返回;
POP DX;
POP CX;
POP BX;
POP AX;
注意事項:
PUSH操作使棧頂向低地址方向移動,而POP操作則剛好相反;
·堆棧操作只能作字操作;
·SS:SP在任何時候都指向當前的棧頂
【沒事兒可以到我主頁看看】https://blog.csdn.net/qq_42604176