第3章 80 x86 的指令系统和寻址方式

173
3 80x86 的指令系统和寻址方式 § 3.1 80x86 的寻址方式 § 3.2 80x86 的指令系统 § 3.3 80x86 的机器语言指令概况

Upload: martina-mclean

Post on 02-Jan-2016

132 views

Category:

Documents


5 download

DESCRIPTION

第3章 80 x86 的指令系统和寻址方式. § 3.180 x86 的寻址方式 § 3. 2 80x86 的指令系统 § 3. 3 80x86 的机器语言指令概况. 基本概念—指令的构成. 指令由操作码和操作数两部分组成 操作码 说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数 是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数. 基本概念—与数据有关的寻址方式. 在指令中为了取得操作数地址所使用的方式 寻找操作数的过程就是操作数的寻址 - PowerPoint PPT Presentation

TRANSCRIPT

  • 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 --