第3章 80 x86 的指令系统和寻址方式
-
Upload
martina-mclean -
Category
Documents
-
view
135 -
download
5
description
Transcript of 第3章 80 x86 的指令系统和寻址方式
-
3 80x86
3.180x86 3.2 80x86 3.3 80x86
-
34
-
MOV DST , SRC (DST)(SRC)MOV AX,BX (AX)=1234H, (BX)=4321H (AX)=4321H, (BX)=4321H
-
(R)(M)(imm)
-
3.180x86
-
1.imm8i800HFFH16i160000HFFFFHR/M
-
3.1 MOV AL, 9 AL= 09H3.2 MOV AX, 3064H AX= 3064H
-
2. CPUreg8AHALBHBLCHCLDHDL16AXBXCXDXSIDIBPSP4segCSDSSSES
-
MOV AX, BX AX= 1234HBX= 5678H AX= 5678HBXMOV AXBL
-
EAEffective Address 8086EA
-
3Direct addressing
-
MOV AX, [2000H] DS= 3000HAX= 3050H
-
MOV AX,[2000h] MOV AX,ES:[2000h] MOV AXVALUE MOV AX[VALUE] MOV AXESVALUE MOV AXES[VALUE]
-
4. BXBPSIDI[]BXSIDIBP
-
MOV AX, [BX] DS= 2000H, BX= 1000H = 20000H + 1000H = 21000H AX= 50A0H
-
MOV AX,[SI] MOV AX, DS:[SI] MOV CL,[BX] MOV CL, DS:[BX] MOV BL,[BP] MOV BL, SS:[BP] MOV AX,ES:[SI] MOV CL,SS:[BX] MOV BL,DS:[BP]
-
5.816BXBPSIDIBX/SI/DIDSBPSS
-
MOV AX, COUNT[SI]MOV AX,[COUNT+SI] COUNT16 DS= 3000HSI= 2000HCOUNT = 3000H, = 30000H + 2000H + 3000H = 35000H
-
MOV AX,10H[SI] MOV AX,DS:10H[SI]MOV AX,ARRAY[BX] MOV AX,DS:ARRAY[BX]MOV TABLE[DI],AL MOV DS:TABLE[DI],ALMOV TABZ[BP],BL MOV SS:TABZ[BP],BL
-
DSMOV AL,0024H[SI]0024H(SI)=0(AL)=12H(SI)=1(AL)=34H(SI)=2(AL)=56H(SI)=3(AL)=78H(SI)=4(AL)=9AHEA=24H+(SI)(SI)SI
-
6.BXBPSIDIEABX/BPSI/DIBXDSBPSS
-
MOV AX, [BX][DI] MOV AX, [BX+DI] (DS ) = 2100HBX= 0158HDI= 10A5H EA = 0158H +10A5H = 11FDH = 21000H +11FDH = 221FDH
-
MOV AX,[BX][SI] MOV AX,DS:[BX+SI]MOV AX,[BP][DI] MOV AX,SS:[BP+DI]MOV AX,DS:[BP][DI] MOV AX, DS:[BP+DI]
-
7.BX/BPSI/DI816EABX/BPSI/DI8/16BX/BPSI/DIBXDSBPSS
-
MOV AX, MASK[BX][SI] MOV AX, MASK[BX+SI] MOV AX, [MASK+BX+SI] DS= 3000HBX= 2000HSI= 1000HMASK = 0250H = 30000H + 2000H + 1000H + 0250H = 33250HAX= 1234H
-
MOV AX, 06H[BX+SI] MOV AX, DS:[BX+SI+06H]MOV AL,TAB[BX][DI] MOVAL,DS:TABLE[BX][DI] MOV TAB1[BP][SI],DXMOV SS:TAB1[BP][SI],DX
MOV AX,ARRAY[BX][BP] MOV AX,DA[SI][DI]
-
BXSIMOV AL,ARRAY[BX][SI] [ ][BX][SI] [BX+SI]
-
16/32
-
8 MOV EAX, COUNT[ESI*4]
-
9 MOV ECX, [EAX][EDX*8]
-
10 MOV EAX, TABLE[EBP][EDI*4]
-
CS:IP
-
3.3 80x86
DEST,SRCDEST
-
1. MOV(move)MOVSX(move with sign-extend)MOVZX(move with zero-extend)PUSHPOPPUSHA/PUSHAD(push all registers)POPA/POPAD(pop all registers)XCHG(exchange)
-
MOVmoveMOVdst, src ;move (dst) (src) dstsrc dstCS dstsrc MOV
-
MOV
-
MOVmoveMOV AL,5MOV AX,BXMOV BP,DSMOV DS,AXMOV [BX],AXMOV ES:VAR,12MOV AL,BX MOV DS,1234H MOV CS,AX MOV DS,CS MOV VAR1,VAR2 MOV 12,AL
-
MOVSXMOVSX DST,SRC DSTSRC MOVSX reg1reg2 MOVSX regmem8/1616/32 MOVSX EAXCL MOVSX EDX[EDI]
-
MOVZXMOVZX DSTSRC DSTSRC MOVSX reg1reg2 MOVSX regmem MOVZX DXAL MOVZX EAXDATA
-
PUSHPUSH SRC 16 SPSP2 ((SP)+1,(SP)) (SRC) 32ESPESP4 ((ESP)+3,(ESP)+2, (ESP)+1, (ESP)) (SRC)R/M
-
POPPOP DST 16 (DST) ((SP)+1,(SP)) (SP) (SP)+2 32 (DST) ((ESP)+3,(ESP)+2, (ESP)+1, (ESP)) ESPESP4
R/M
-
push axpush bxpush ds...pop dspop bxpop ax
-
PUSHA/PUSHADPUSHA PUSHAD 16 32
-
POPA/POPADPOPA POPAD 16 32
-
XCHGexchangeXCHG DST,SRCDST SRC
-
XCHGmov ax,1234hax=1234hmov bx,5678hbx=5678hxchg ax,bxax=5678hbx=1234hxchg ah,alax=7856hxchg ax,ds:[2000h]xchg al, ds:[2000h]
-
XCHG: (BX)=6F30H, (BP)=0200H, (SI)=0046H, (SS)=2F00H,(2F246H)=4154H, XCHG BX,[BP+SI]=(SS) 16+(BP)+(SI)=2F000H+0200H+0046H=2F246H(BX) (2F246H)(BX)=4154H,(2F246H)=6F30H
-
2.INinput OUToutputXLATtranslateEAXAXAL
-
IN IN ALPORT IN AXPORT IN EAXPORT ALPORT AX PORT1PORT EAX PORT3PORT+2PORT1PORT
-
IN IN ALDX IN AXDX IN EAXDX AL((DX)) AX ((DX)+1,(DX)) EAX ((DX)+3,(DX)+2, (DX)+1,(DX))
-
OUT OUT PORTAL OUT PORTAX OUT PORTEAX ALPORT AX PORT1PORT EAX PORT3PORT+2PORT1PORT
-
OUT OUT DXAL OUT DXAX OUT DXEAX AL ((DX)) AX ((DX)+1,(DX)) EAX ((DX)+3,(DX)+2, (DX)+1,(DX))
-
378H379H37AH MOV DX379H IN ALDX
MOV DX37AH OUT DXAL
-
XLAT XLAT OPR XLAT16: (AL)((BX)+(AL)) 32: (AL)((EBX)+(AL))
-
XLAT Mov ax,1234H mov cl,4 mov bx,100hloop1:ror ax,4 Xlat ; ;loop1
-
3.LEA(load effective address)LDS(load DS with pointer)LES(load ES with pointer)LFS(load FS with pointer)LGS(load GS with pointer)LSS(load SS with pointer)
-
LEALEA REGSRCREGSRC16/32
-
LEABX0400HSI003CH 0403CH1234H MOV BX[BXSI] LEA BX[BX+SI]
-
LDSLDS REGSRC REGSRC DS SRC2 DSSRC4
-
: (DS)=B000H, (BX)=080AH, (0B080AH)=05AEH, (0B80CH)=4000H, (405AEH)=9634H,LDS DI,[BX]MOV AX,[DI](AX)=?(DI)=05AEH(DS)=4000H: (DS)=4000H (DI)=05AEH (AX)=9634H
-
LAHFload AH with flagsSAHF (store AH into flags)PUSHF/PUSHFD(push the flags or eflags)POPF/POPFD(pop the flags or eflags)
-
LAHFAHLAHF AHFLAGSSAHF AHSAHF (FLAGS) AH
-
PUSHF/PUSHFDPUSH PUSHFD (SP) (SP)2 ((SP)+1,(SP)) (FLAGS): (ESP) (ESP)2 ((ESP)+3,(ESP+2),(ESP)+1,(ESP)) (EFLAGS) AND 0FCFFFFH
-
POPF/POPFDPOPF POPFD (FLAGS) ((SP)+1,(SP)) (SP) (SP)+2 (EFLAGS) ((ESP)+3,(ESP)+2,(ESP)+1,(ESP)) (ESP) (ESP)+4
-
5.CBW (convert byte to word)CWD /CWDE (convert word to double word)CDQ (convert double to quad)BSWAP (byte swap)
-
CBWCBW ALAHAXCWD/CWDE CWD CWDECWD AXDXDXAXCWDE AXEAX
-
CDQ4CDQEAXEDXEDXEAX4
-
BSWAP BSWAP r32321423BSWAP EAXEAX11223344HEAX44332211H486CPU
-
1.ADDADCadd with carryINCincrementXADDexchange and add
-
ADD ADD DSTSRCDSTSRC+DSTADCADC DSTSRC DSTSRC+DST+CFINCINC OPROPR OPR+1
-
XADD XADD DSTSRCTEMPSRCDST SRC DST DST TEMP486CPU
-
ZFSFCF OF INCCF
-
ADD AX,BXADD AL,BLSUB CX,20HADD DL,DA_BYTESUB DA_WORD,DX(AL)=0E5HADD AL,0A4H AL
CF=1,ZF=0,SF=1,OF=0229+164=393=256+137
(-27)+(-92)=-119
-
2F365H2E024HMOV DX,2MOV AX,0F365HADD AX,0E024HADC DX,5CF=1,ZF=0,SF=1,OF=0CF=0,ZF=0,SF=0,OF=0AXDX
-
2.SUBsubtractSBBsubtract with borrowDECdecrementNEGnegateCMPcompareCMPXCHGcompare and exchangeCMPXCHG8Bcompare and exchange 8 byte
-
SUBSUB DSTSRCDSTDSTSRCSBBSBB DSTSRCDSTDSTSRCCF
-
DECDEC OPROPROPR1NEG NEG OPROPROPR
-
CMP CMP OPR1OPR2OPR1OPR2CMPEXCHG CMPXCHG DSTSRCACDST ACDST ZF1DSTSRC ZF0ACDSTSRC81632ALAXEAX
-
CMPXCHG8BCMPXCHG8B DST EDXEAXDST EDXEAXDST ZF1DST ECXEBX ZF0EDXEAXDST
-
ZF SFCF OF DECCFNEG0CF01 1283276865536OF10
-
MOV AL,-73SUB AL,-87AL
1011 01111010 1001
0000 1110CF=0,ZF=0,SF=0,OF=0-7314-87AL=0EH
-
AL=13H,NEG ALALALAL=-13HCF=1,ZF=0,SF=1,OF=0
- CMPCMPXYX>Y CF0X
-
CMPXYX>YX>Y>=0 X-Y SF=0OF00>=X>Y X-Y SF0OF0X>=0,YY
- CMPXYX
-
CMP(CMP AL,BL)AL=-2BL=127AL=-2BL=-1
-
CMP(CMP AL,BL)AL=-1BL=-2AL=127BL=-2
-
3.MUL(unsigned multiple) IMUL(signed multiple)
-
MULIMULMUL / IMUL SRC: (AX) (AL)(SRC) : (DX, AX) (AX)(SRC) : (EDX,EAX) (EAX)(SRC)
-
CFOFMUL0CF0OF0CF1OF1IMULCF0OF0CF1OF1
-
4.DIV(unsigned divide)IDIV(signed divide)
-
DIVIDIVDIV / IDIV SRC (AL) (AX) /SRC (AH) (AX) /SRC (AX) (DX, AX) / SRC (DX) (DX, AX) / SRC (EAX) (EDX, EAX) / SRC (EDX) (EDX, EAX) / SRC
-
5.BCDBCD
-
()
-
1.AND DST,SRCOR DST,SRCXOR DST,SRCNOT DST TEST OPR1OPR2 (DST)(DST) (SRC) (DST)(DST) (SRC) (DST)(DST) (SRC) (DST)(DST) (OPR1) (OPR2) NOTCF0OF0SFZF
-
AL01 MOV AL,0BFHAND AL,0FCH 1011 1111 AND 1111 1100 1011 1100(AL)=0BCH
-
MOV AL,43HOR AL,20H 0100 0010 OR 0010 0000 0110 0000 (AL)=63HAL51
-
AL01
MOV AL,11HXOR AL,03H 0001 0001 XOR 0000 0011 0001 0010 (AL)=12H
-
4.
-
SHL OPR,CNT SHR OPR,CNTOPR CNT / CF0 DST OF ( CNT=1) CF ,ZF,SF,PFOPR RMCNT1CL/ 2
-
SAL OPR,CNT SAR OPR,CNTSALSHLSAR1 CF OPR OF ( CNT=1) CF ,ZF,SF,PFDST RMCNT1CL
-
MOV CL,4MOV AL,0F0HAL=F0HSHL AL,1AL=E0HCF=1SF=1ZF=0PF=0OF=0SHR AL,1AL=70HCF=0SF=0ZF=0PF=0OF=1SAR AL,CLAL=03HCF=1SF=0ZF=0PF=1SAR AL,1AL=38HCF=0SF=0ZF=0PF=0OF=0
-
ROL (rotate left)ROR (rotate right)RCL (rotate left through carry)RCR (rotate right through carry)
-
ROLROL OPRCNT RORROR OPRCNT
-
RCLRCL OPRCNTRCRRCR OPRCNT
-
DX.AX32SHL AX,1RCL DX,1DXAXCF0
-
ALBLALROR AL,1
RCL BL,1
ROL AL,1ALD0
-
8086StringWB
-
MOVS(move string)CMPS(compare string)SCAS(sacn string)LODS(load from string)STOS(store in to string)INS(input from port to string)OUTS(output string to prot)
-
REPMOVS,STOS,LODS,INSOUTSREPCount Reg0REP string primitiveCount Reg=0,REPCount RegCount Reg-113
-
MOVSMOVS DEST,SRCMOVSBMOVSWMOVSD
-
MOVS ES:BYTE PTR[DI], DS:[SI]((Destination-index))((Source-index))(Source-index))(Source-index)) 1(Destination-index)(Destination-index) 1(Source-index))(Source-index) 2(Destination-index)(Destination-index) 2(Source-index))(Source-index) 4(Destination-index)(Destination-index) 4DF=0DF=1
-
20 DATSEG SEGMENT DATAX DB ABCDEFGHIJKLMNOPQRST DATAY DB 20 DUP(?) DATSEG ENDS
-
CODSEG SEGMENT ASSUME CS:CODSEG,DS:DATSEG,ES:DATSEG START: MOV AX,DATSEG MOV DS,AX MOV ES,AX CLD MOV SI,OFFSET DATAX MOV DI,OFFSET DATAY MOV CX,20 REP MOVSB MOVAX,4C00H INT 21H CODSEG ENDS END START REP MOVS byte ptr [di],[si]
-
SIDICX CLDSTD
-
STOS STOS DST STOSB STOSW STOSD
-
((Destination-index))(AL)(Destination-index)(Destination-index) 1((Destination-index))(AX)(Destination-index)(Destination-index) 2((Destination-index))(EAX)(Destination-index)(Destination-index) 4DF=0DF=1
-
1020Hextra segment mess2 db 10 dup(?)extra ends lea di,mess2 mov cx,10 cld rep stosb
lea di,meass2mov ax,2020hmov cx,5rep stosw
-
LODS LODS SRC LODSB LODSW LODSD(AL)((Source-index)), (Source-index)(Source-index)) 1(AX)((Source-index)), (Source-index)(Source-index)) 2(EAX)((Source-index)), (Source-index)(Source-index)) 4
-
3.37 1STOS0AAH100 2LODS0AAHbad memory DTSEG SEGMENT DATAM DB 100 DUP(?) MESG DB bad memory, $ DTSEG ENDS
-
CDSEG SEGMENT ASSUMECS:CDSEG,DS:DTSEG,ES:DTSEG START: MOV AX,DTSEG MOV DS,AX MOV ES,AX CLD MOV CX,50 MOV DI,OFFSET DATAM MOV AX,0AAAAH REP STOSW MOV SI,OFFSET DATAM MOV CX,100
-
AGAIN: LODSB XOR AL,0AAH JNZ OVER LOOPAGAIN JMP EXIT OVER:MOV AH,09 MOV DX,OFFSET MESG INT 21H EXIT:MOV AX,4C00H INT 21HCDSEG ENDS END START
-
REPE/REPZREPNE/REPNZCMPSSCASREPE/REPZ/REPE(REPZ) String PrimitiveCount Reg=0ZF=0Count RegCount Reg-113
-
REPNE/REPNZ/REPNE(REPNZ) String PrimitiveCount Reg=0ZF=1Count RegCount Reg-113
-
CMPS CMPS SRC,DST CMPSB CMPSW CMPSD
-
((Destination-index))-((Source-index))(Source-index))(Source-index)) 1(Destination-index)(Destination-index) 1(Source-index))(Source-index) 2(Destination-index)(Destination-index) 2(Source-index))(Source-index) 4(Destination-index)(Destination-index) 4DF=0DF=1
-
SCAS SCAS DST SCASB SCASW SCASD
-
(AL)((Destination-index)), (Destination-index)(Destination-index)) 1(AX)((Destination-index)), (Destination-index)(Destination-index)) 2(EAX)((Destination-index)), (Destination-index)(Destination-index)) 4
-
"LABEL""LABLE" 1"The spelling is correct" 2"Wrong splling" DATASEG SEGMENT DAT_DICT DB 'LABEL' DAT_TYPE DB 'LABLE' MESS1 DB 'The spelling is correct ','$' MESS2 DB 'Wrong spelling ','$' DATASEG ENDS CODESEG SEGMENTASSUME CS:CODESEG,DS:DATASEG,ES:DATASEG
-
START: MOV AX,DATASEG MOV DS,AX MOV ES,AX CLD MOV SI,OFFSET DAT_DICT MOV DI,OFFSET DAT_TYPE MOV CX,05 REPECMPSB JEOVER MOV DX,OFFSET MESS2 JMP DISP OVER: MOV DX,OFFSET MESS1 DISP: MOV AH,09 INT 21H MOV AX,4C00H INT 21H CODSEG ENDS END START
-
HU DAMINGHU DANINGDATA SEGMENT NAME DB 'HU DAMING', '$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOVDS,AX MOVES,AX
-
CLD MOV AL,'M' MOV DI,OFFSET NAME MOVCX,09 REPNESCASB JNEDISP DECDI MOVBYTE PTR [DI],'N' DISP: MOVAH,09 MOVDX,OFFSET NAME INT21H MOVAX,4C00H INT21H CODE ENDS ENDSTART
-
STRBUFSTRINGDSEG SEGMENT PARA 'Data'
STRBUFDB 'ASASAASASSASSAASASAS'COUNTEQU $-STRBUFSTRINGDB 'AS'MESSGDB "THE NUMBER OF 'AS' IS : "NUMDB ?DB 0AH,0DH,'$
DSEG ENDS
-
STRBUFSTRING2CMPSWSISI+2AASSISI-1CMPSWDI DI+2STRDI DI-2-2
-
SI STRBUFDI STRINGCX -1DF 0LOPNEXT1NEXT
-
LEA SI,STRBUFLEA DI,STRINGMOV CX,COUNT-1CLDMOV BL,0LOP:CMPSWJNZ NEXT1INC BLDEC CXJMP NEXTNEXT1:DEC SINEXT:DEC DIDEC DICMP CX,0;CX0-1JZ OUTPUTLOOP LOPOUTPUT:ADD BL,30HMOV NUM,BLMOV AH,9LEA DX,MESSGINT 21H
-
JMP JMP SHORT OPR(IP)(IP)+8JMP NEAR PRT OPR(IP)(IP)+16 lea si,str1 lea di,str2Next: dec di dec si mov al,20h jmp next
-
JMP JMP WORD PTR ORP (IP)(EA)JMP BX JMP WORD PTR[BX+TABLE] JMP [BX][SI](DS)=2000H,(BX)=1256H,(SI)=528FH,TABLE=20A1H,(232F7H)=3280H,(264E5H)=2450H
-
JMP JMP FAR PTR OPR (IP)OPR (CS) OPR JMP FAR PTR NEXTROUTINTJMP DWORD PTR OPR (IP)(EA) (CS) (EA+2)JMP DWORD PRT[INTERS+BX]
-
COUNT (COUNT) -1(COUNT)=0?
-
LOOP loopLOOPZ/LOOPNEloop while zero, or equalLOOPNZ/LOOPNE loop while nonzero, or not equal
-
LOOPLOOP OPR(Count Reg)0LOOPZ/LOOPE LOOPZ(LOOPE) OPRZF=1(Count Reg)0LOOPNZ/LOOPNE LOOPNZ(LOOPNE) OPRZF=0(Count Reg)0(Count Reg)(Count Reg)-1IPIP
-
BLOCK1BLOCK2BLOCK2 DATA SEGMENT BLOCK1 DW 100 DUP() BLOCK2 DW 100 DUP() DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: CLD MOV CX,100 MOV SI,OFFSET BLOCK1 MOV DI,OFFSET BLOCK2 NEXT:LODSW ADD AX,ES:[DI] STOSW LOOP NEXT CODE ENDS END START
-
LASCII_STRASCII20HNOT_FOUND MOVCX,L MOVSI,-1 MOVAL,20HNEXT: INC SICMPAL,ASCII_STR[SI]LOOPNENEXTJNZNOT_FOUND
NOT_FOUND:
-
1.
-
3.4 80x86CPU
-
MOV ADD SUB AND
-
1AX\ALimmw
-
2REG D5D4D3 38R
REGw=1w=0000AXAL001CXCL010DXDL011BXBL100SPAH101BPCH110SIDH111DIBH
-
2MOD: D7D62R/M: D2D1D032) 3) 1R/M
-
MODR/MEA11000110w=0W=1000( BX+SI)DS( BX+SI) +D8DS( BX+SI ) +D16DSALAX001( BX+DI)DS( BX+DI)+D8DS( BX+DI)+D16DSCLCX010( BP+SI )SS( BP+SI ) +D8SS( BP+SI )+D16SSDLDX011( BP+DI )SS( BP+DI ) +D8SS( BP+DI ) +D16SSBLBX100( SI )DS(SI) +D8DS(SI) +D16DSAHSP101(DI)DS(DI) +D8DS(DI) +D16DSCHBP110D16DS(BP) +D8SS(BP) + D16SSDHSI111(BX)DS(BX) +D8DS(BX) + D16DSBHDI
-
3MOD=11/00 MOD=01, 3MOD=10, 34
-
41
-
ADDR-R3MOVR-R2IMULR16128-154IDIVR16165-184R ,12JMP15416
-
28086 1 -- 2 -- 3 -- 4 --