《10.1 X86指令集简介电子课件 计算机系统基础:C语言视角(RISC-V版).ppt》由会员分享,可在线阅读,更多相关《10.1 X86指令集简介电子课件 计算机系统基础:C语言视角(RISC-V版).ppt(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、10.1 X86指令集简介电子课件 计算机系统基础:C语言视角(RISC-V版)X86X86指令集简介指令集简介X86X86指令系统指令系统PCPC机机(台式机,笔记本台式机,笔记本),CPUCPU使用的都是使用的都是X86X86指指令系统令系统X86X86指令集指令集,1978,1978年由美国年由美国IntelIntel公司为其公司为其CPUCPU(80868086)专门开发的指令集)专门开发的指令集命名:早期以命名:早期以80X8680X86这样的数字格式来命名处理这样的数字格式来命名处理器器Intel 8086Intel 8086、8038680386以及以及8048680486等等奔
2、腾系列、赛扬系列、酷睿系列奔腾系列、赛扬系列、酷睿系列CPUCPUCISCCISCX86X86指令集属于指令集属于CISCCISC(Complex Instruction Complex Instruction Set ComputerSet Computer,复杂指令集计算机)指令集,复杂指令集计算机)指令集与与RISC-VRISC-V指令集相比,其操作码、数据类型、指令集相比,其操作码、数据类型、寻址模式、指令格式等,都更加复杂寻址模式、指令格式等,都更加复杂数千条指令数千条指令寄存器寄存器3232位的通用寄存器仅有位的通用寄存器仅有8 8个个EAXEAX(AccumulatorAccum
3、ulator,累加寄存器,用于算术运算),累加寄存器,用于算术运算)ECXECX(CounterCounter,计数寄存器),计数寄存器)EDXEDX(DataData,数据寄存器),数据寄存器)EBXEBX(BaseBase,基址寄存器),基址寄存器)ESP(Stack PointerESP(Stack Pointer,栈指针寄存器,栈指针寄存器)EBPEBP(Base PointerBase Pointer,基址指针寄存器),基址指针寄存器)ESIESI(Source IndexSource Index,源索引寄存器),源索引寄存器)EDIEDI(Destination IndexDest
4、ination Index,目标索引寄存器),目标索引寄存器)“E”E”代表扩展(代表扩展(ExtendedExtended)相对于相对于1616位的寄存器扩展为位的寄存器扩展为3232位位每个通用寄存器有其独特的用途,从命名即可每个通用寄存器有其独特的用途,从命名即可获知获知特殊寄存器特殊寄存器EIPEIP(Instruction PointerInstruction Pointer,指令指针寄存器,指令指针寄存器,即即PCPC)EFLAGSEFLAGS(标志寄存器)(标志寄存器)指令格式指令格式前缀(前缀(PrefixPrefix):):1 1个字节个字节操作码(操作码(OpcodeOpc
5、ode):):1 1,2 2或或3 3个字节个字节寄存器寄存器/内存寻址模式(内存寻址模式(ModR/MModR/M):):1 1个字节个字节缩放索引基址(缩放索引基址(SIBSIB,Scale Index BaseScale Index Base):):1 1个字节个字节偏移量(偏移量(Displacement Displacement):):1 1,2 2或或4 4个字节个字节立即数(立即数(ImmediateImmediate):):1 1,2 2或或4 4个字节个字节PrefixOpcodeModR/MSIBDisplacementImmediate前缀前缀操作码操作码寄存器寄存器/内
6、存寻址模式内存寻址模式缩放索引基址缩放索引基址偏移量偏移量立即数立即数可变长指令格式可变长指令格式只有操作码是必需的,其他字段均为可选字段只有操作码是必需的,其他字段均为可选字段指令编码从指令编码从1 1个字节,到十几个字节不等个字节,到十几个字节不等常用指令常用指令数据传送指令数据传送指令MOV,PUSH,POP,LEAVEMOV,PUSH,POP,LEAVE地址传送指令地址传送指令LEALEA算术算术/逻辑运算指令逻辑运算指令ADD,CMPADD,CMP流程控制指令流程控制指令JMP,JLE,CALL,RETJMP,JLE,CALL,RETMOVMOV指令指令使用使用最频繁最频繁的指令的指
7、令寄存器和寄存器之间数据传送寄存器和寄存器之间数据传送寄存器和内存之间数据传送寄存器和内存之间数据传送还允许将立即数传送至寄存器或内存中还允许将立即数传送至寄存器或内存中汇编格式汇编格式 movmovReg/Mem,Reg/Mem/ImmReg/Mem,Reg/Mem/Imm2 2操作数操作数指令,目标操作数在前,源操作数在后,指令,目标操作数在前,源操作数在后,而且两个操作数之一可以是内存中的数而且两个操作数之一可以是内存中的数示例示例 movmov eax,esp+60eax,esp+60源操作数是内存中的数源操作数是内存中的数寻址模式:寻址模式:“寄存器相对寄存器相对”栈指针寄存器栈指针
8、寄存器ESPESP中的值中的值 +偏移量偏移量6060,计算出内,计算出内存地址存地址将此内存地址中的数据加载到将此内存地址中的数据加载到EAXEAX寄存器中寄存器中“”,表示操作数是内存中的数,表示操作数是内存中的数在中括号在中括号“”前加前加WORD/DWORD/BYTE PTRWORD/DWORD/BYTE PTR为了标识内存中的数的位数,为了标识内存中的数的位数,1616位位/32/32位位/8/8位位PUSHPUSH指令指令将一个寄存器中的值压栈将一个寄存器中的值压栈例如:例如:pushpushebpebp;将将EBPEBP寄存器中的值压栈寄存器中的值压栈该指令可分解为:该指令可分解
9、为:subsubesp,4esp,4;ESP;ESP ESP-4 ESP-4 mov movesp,ebpesp,ebp;MESP;MESP EBPEBPPOPPOP指令指令将栈顶的数据弹出,加载到一个寄存器中将栈顶的数据弹出,加载到一个寄存器中例如:例如:poppopeaxeax;将栈顶的值弹出,加载到将栈顶的值弹出,加载到EAXEAX寄存器中寄存器中该指令可分解为:该指令可分解为:movmoveax,espeax,esp;EAX;EAX MESP MESP add addesp,4esp,4;ESP;ESP ESP+4 ESP+4LEAVELEAVE指令指令从函数返回前的栈帧弹出从函数返回
10、前的栈帧弹出作用相当于:作用相当于:movmovesp,ebpesp,ebp;ESP;ESP EBP EBP pop popebpebp;EBP;EBP MESP,ESP MESP,ESP ESP+4 ESP+4LEALEA指令指令Load Effective Address,Load Effective Address,加载有效地址指令加载有效地址指令把一个内存地址加载到寄存器中把一个内存地址加载到寄存器中汇编格式汇编格式 LEALEAReg,MemReg,Mem例如:例如:lealeaeax,esp+20eax,esp+20;EAX;EAX ESP+20 ESP+20注意,该指令与注意,该
11、指令与MOVMOV指令的区别指令的区别该指令中的中括号该指令中的中括号“”,代表内存地址,而不,代表内存地址,而不是该内存地址中的数据是该内存地址中的数据算术算术/逻辑运算指令逻辑运算指令2 2操作数指令操作数指令第一个操作数既是目标操作数,又是源操作数第一个操作数既是目标操作数,又是源操作数第二个操作数是源操作数第二个操作数是源操作数两个操作数之一可以是内存中的数两个操作数之一可以是内存中的数ADDADD指令指令汇编格式如下:汇编格式如下:addaddReg/Mem,Reg/Mem/ImmReg/Mem,Reg/Mem/Imm可以做寄存器与寄存器,寄存器与立即数的运可以做寄存器与寄存器,寄存
12、器与立即数的运算,还可以与内存中的数做运算算,还可以与内存中的数做运算CMPCMP指令指令比较目标操作数和源操作数的值,根据比较结比较目标操作数和源操作数的值,根据比较结果,对果,对标志寄存器标志寄存器EFLAGSEFLAGS的相应位进行设置的相应位进行设置例如:例如:cmpcmpedx,eaxedx,eax;比较比较EDXEDX和和EAXEAX中的值的大小中的值的大小计算计算“EDX-EAX”EDX-EAX”的减法结果的减法结果;在不溢出的情况下,设置在不溢出的情况下,设置EFLAGSEFLAGS的的OFOF(溢出标志)(溢出标志)位为位为0 0如果结果小于零,则设置如果结果小于零,则设置S
13、FSF(符号标志)位为(符号标志)位为1 1如果大于零,设置如果大于零,设置SFSF位为位为0 0如果等于零,设置如果等于零,设置ZFZF(零标志)位为(零标志)位为1 1 注意:算术注意:算术/逻辑运算指令均根据运算结果,逻辑运算指令均根据运算结果,设置设置EFLAGSEFLAGS的相应位的相应位JMPJMP指令指令无条件跳转指令无条件跳转指令汇编格式:汇编格式:jmp Labeljmp Label将将EIPEIP的值设置为的值设置为LabelLabel所标识的指令地址,即跳所标识的指令地址,即跳转至转至LabelLabel所标识的指令去执行所标识的指令去执行条件分支指令条件分支指令带条件的
14、跳转指令(带条件的跳转指令(JGJG,JGEJGE,JLJL,JLEJLE,JEJE,JNEJNE等)等)根据根据EFLAGSEFLAGS中的标志位,设置中的标志位,设置EIPEIP的值,完成的值,完成相应的跳转相应的跳转汇编格式如下:汇编格式如下:jXjXLabelLabelJLEJLE指令指令 例如:例如:jlejleL3L3JLEJLE指令表示小于等于跳转指令表示小于等于跳转如果如果EFLAGSEFLAGS中中SFSF位与位与OFOF位的值不同,或者位的值不同,或者ZFZF位为位为1 1,就跳转至标记,就跳转至标记L3L3所标识的指令去执行所标识的指令去执行CALLCALL调用子例程调用子例程汇编格式汇编格式 callcallLabelLabel对当前指令的下一条指令地址(即对当前指令的下一条指令地址(即返回地址返回地址)进行进行压栈压栈操作,以便将来实现子例程的返回;操作,以便将来实现子例程的返回;设置设置EIPEIP的值,跳转到的值,跳转到LabelLabel所标识的指令去执所标识的指令去执行行RETRET指令指令与与CALLCALL正好相反正好相反弹出栈中保存的返回地址,加载到弹出栈中保存的返回地址,加载到EIPEIP中,跳中,跳转到该返回地址中的指令去执行转到该返回地址中的指令去执行