《微型计算机原理及接口技术》课件第3章_第1页
《微型计算机原理及接口技术》课件第3章_第2页
《微型计算机原理及接口技术》课件第3章_第3页
《微型计算机原理及接口技术》课件第3章_第4页
《微型计算机原理及接口技术》课件第3章_第5页
已阅读5页,还剩119页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Intel指令系统与程序设计Intel指令系统汇编语言及源程序结构汇编语言与C语言混合编程接口单核处理器平台的程序设计多核处理器平台的程序设计1Intel指令系统Intel指令系统的发展1978年,16位8086处理器24种操作数寻址模式,6大类、共89条指令1985年,32位80386处理器137条指令,增加了对32位寄存器和寻址的支持1993年,IntelPentium处理器SIMD指令集,

MMX,SSEAVX…2Intel指令系统

Intel指令类型通用目的指令X87浮点处理指令及SIMD状态管理指令多媒体指令MMX和流SIMD扩展(SSE)指令MMX、SSE、SSE2、SSE3和SSE4AESNI和PCLMULQDQ指令IntelAVX指令FMA扩展和F16C指令AVX2和AVX-512指令通用的位处理指令TSX指令系统指令IA-32e模式:64位模式指令VMX指令SMX指令3Intel指令系统

Intel指令的寻址方式16位系统的寻址方式操作数寻址:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、寄存器相对寻址、基址+变址寻址、基址+变址+相对寻址、隐含寻址转移地址寻址方式:段内相对寻址、段内间接寻址、段间直接寻址、段间间接寻址32位系统的寻址方式寄存器寻址方式立即数方式存贮器寻址方式64位系统的寻址方式4516位系统的寻址方式寻址方式——寻找操作数的方法寻找操作数的地址(一般指源操作数)寻找要执行的下一条指令的地址在8086指令系统中,说明操作数所在地址的寻址方式可分为8种:立即寻址直接寻址寄存器寻址寄存器相对寻址基址-变址寻址相对的基址-变址寻址寄存器间接寻址隐含寻址616位系统的寻址方式——立即寻址操作数(为一常数)直接由指令给出此操作数称为立即数立即寻址只能用于源操作数例:

MOVAX,1C8FHMOVBYTEPTR[2A00H],8FH

错误例:×MOV2A00H,AX;错误!7立即数操作码低8位高8位存储器MOV操作码02H31HAHAL代码段代码段立即寻址指令在存储器中的存放形式AX指令操作例:MOVAX,3102H;AX3102H

执行后,(AH)=31H,(AL)=02H16位系统的寻址方式——立即寻址816位系统的寻址方式——直接寻址指令中直接给出操作数的16位偏移地址偏移地址也称为有效地址(EA,EffectiveAddress)默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀偏移地址也可用符号地址来表示,如ADDR、VAR例:

MOVAX,[2A00H]MOVDX,ES:[2A00H]MOVSI,TABLE_PTR9指令操作例:MOVAX,[3102H]AL(3102H),AH(3103H)如果(DS)=2000H,(23012H)=CDH,(23013H)=ABH则操作数的物理地址为:

20000H+3102H=23102H指令执行后:(AX)=ABCDHMOV操作码02H31HAHAL23102HCDHABH存储器代码段数据段..16位系统的寻址方式——直接寻址1016位系统的寻址方式——寄存器寻址操作数放在某个寄存器中源操作数与目的操作数字长要相同寄存器寻址与段地址无关例:

MOVAX,BXMOV[3F00H],AXMOVCL,AL

错误例:

×MOVAX,BL;字长不同

×MOVES:AX,DX;寄存器与段无关11AXSI2233H2233H

指令操作例:MOVSI,AX;SI(AX)

指令执行前:(AX)=2233H

指令执行后:(AX)=2233H,(SI)=2233H16位系统的寻址方式——寄存器寻址1216位系统的寻址方式——寄存器间接寻址操作数的偏移地址(有效地址EA)放在寄存器中只有SI、DI、BX和BP可作间址寄存器EA=(BX)(BP)(SI)(DI)例:MOVAX,[BX]MOVCL,CS:[DI]

错误例:

×MOVAX,[DX]×

MOVCL,[AX]13指令操作例:MOVAX,[SI]若(DS)=6000H,

(SI)=1200H,(61200H)=44H,(61201H)=33H则指令执行后,(AX)=3344H。44H33H60001200DSSI6000061200

61200HAX存储器数据段

+)120044H33H16位系统的寻址方式——寄存器间接寻址1416位系统的寻址方式——寄存器相对寻址EA=间址寄存器的内容加上一个8/16位的位移量EA=(BX)(BP)(SI)(DI)+8位16位位移量

寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)15例:MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BP+1000H];

默认段寄存器为SS

指令操作例:MOVAX,DATA[BX]

若(DS)=6000H,(BX)=1000H,DATA=2A00H,(63A00H)=66H,(63A01H)=55H

则物理地址=60000H+1000H+2A00H=63A00H

指令执行后:(AX)=5566H(见下页图示)16位系统的寻址方式——寄存器相对寻址16操作码00偏移量低2A偏移量高DS6000BX1000+DATA2A0063A0063A00HAHALAX代码段数据段.........66H55HMOVAX,DATA[BX]16位系统的寻址方式——寄存器相对寻址1716位系统的寻址方式——基址-变址寻址若操作数的偏移地址:由基址寄存器(BX或BP)给出——

基址寻址方式由变址寄存器(SI或DI)给出——

变址寻址方式由一个基址寄存器的内容和一个变址寄存器的内容相加而形成操作数的偏移地址,称为基址-变址寻址EA=(BX)(BP)+(SI)(DI)同一组内的寄存器不能同时出现。18例:

MOVAX,[BX][SI]MOVAX,[BX+SI]MOVAX,DS:[BP][DI]错误例:

×MOVAX,[BX][BP]

×

MOVAX,[DI][SI]16位系统的寻址方式——基址-变址寻址1983000操作码DS

8000BX

2000+SI

100083000HAHALAX代码段数据段.........YYXX指令操作例:MOVAX,[BX][SI]假定:(DS)=8000H,(BX)=2000H,SI=1000H则物理地址=80000H+2000H+1000H=83000H指令执行后:(AL)=[83000H](AH)=[83001H]16位系统的寻址方式——基址-变址寻址2016位系统的寻址方式——相对的基址-变址寻址在基址-变址寻址的基础上再加上一个相对位移量注意事项同基址-变址寻址EA=(BX)(BP)+(SI)(DI)+8位16位位移量

MOVAX,BASE[BX][SI];基本语法MOVAX,BASE[SI][BX]MOVAX,[BX+BASE][SI]MOVAX,[BX+SI+BASE]MOVAX,[BX]BASE[SI]MOVAX,[BX+SI]BASE

例:21指令操作例:MOVAX,DATA[DI][BX]若(DS)=8000H,(BX)=2000H,(DI)=1000H,DATA=200H,则指令执行后(AH)=[83021H],(AL)=[83020H]8320083200HAHALAX+DATA0200操作码代码段数据段.........YYXXDS

8000BX

2000

DI

100016位系统的寻址方式——相对的基址-变址寻址22使用相对的基址-变址寻址方式可以很方便地访问二维数组。基址寄存器数组首地址变址寄存器数组元素行址位移量数组元素列址(偏移地址)二维数组例:内存图示(按行存储)(行位移地址)(行内元素下标)183252409A=16位系统的寻址方式——相对的基址-变址寻址2316位系统的寻址方式——隐含寻址指令操作数是隐含的,在指令中未显式地指明例:MULBL指令隐含了被乘数AL及乘积AX类似的指令还有:DIV、CBW、MOVS等(AL)×(BL)→AX24段内相对寻址在段内相对寻址方式中,指令应指明一个8位或16位的相对地址位移量DISP(有正负符号,用补码表示)。此时,转移地址应该是代码段寄存器CS内容加上指令指针IP内容,再加上相对地址位移量DISP。例:JMPDISP116位系统转移地址的寻址方式25段内间接寻址在段内间接寻址方式中,转移地址的段内偏移地址要么存放在一个16位的寄存器中,要么存放在存贮器的两个相邻单元中。存放偏移地址的寄存器和存贮器的地址将按指令码中规定的寻址方式给出。此时,寻址所得到的不是操作数,而是转移地址。例:JMPCX16位系统转移地址的寻址方式——段内间接寻址26段间直接寻址在段间直接寻址方式中,指令码中将直接给出16位的段地址和16位的段内偏移地址。

例:JMPFARPTRADD1在执行这条段间直接寻址指令时,指令操作码后的第二个字将赋予代码段寄存器CS,第一个字将赋予指令指针寄存器IP。最后CS内容和IP内容相加则得转移地址。16位系统转移地址的寻址方式——段间直接寻址27段间间接寻址方式和段内间接寻址相似。但是,由于确定转移地址需要32位信息,因此段间间接寻址只适用于存贮器寻址方式。用这种寻址方式可计算出存放转移地址的存贮单元的首地址,与此相邻的4个单元中,前两个单元存放16位的段内偏移地址,而后两单元存放的是16位的段地址。例:JMPDWORDPTR[BP][DI]16位系统转移地址的寻址方式——段间间接寻址32位系统的寻址方式28符符符符符符描述符表寻址计算方式32位系统的寻址方式直接寻址方式位移量就是操作数的有效地址,此位移量包含在指令中INCWORDPTR[500];字的有效地址为500寄存器间接寻址方式操作数的有效地址即基址寄存器的内容。例:MOV[ECX],EDX;ECX指出有效地址基址寻址方式基址寄存器的内容和位移量相加形成有效地址。例:MOVECX,[EAX+24];由EAX中内容加24组成有效地址2932位系统的寻址方式变址寻址方式变址寄存器的内容和位移量相加形成有效地址。例:ADDEAX,[ESI],5

;ESI的内容加5组成有效地址带比例因子的变址寻址方式变址寄存器的内容乘以比例因子,再加位移量得到有效地址。例:IMULEBX,[ESI×4],7

;ESI的内容乘以4再加7形成有效地址基址变址寻址方式基址寄存器的内容加变址寄存器的内容组成有效地址。MOVEAX,[ESI][EBX]

;EBX的内容加ESI的内容即有效地址3032位系统的寻址方式基址加比例因子变址寻址方式变址寄存器的内容乘以比例因子,再加上基址寄存器的内容作为有效地址。例:MOVECX,[EDI×8][EAX]

EDI的内容乘以8再加上EAX内容即为有效地址带位移量的基址变址寻址方式基址寄存器的内容加变址寄存器的内容,再加位移量形成有效地址。例:ADDEDX,[ESI][EBP+10H]

;ESI的内容加EBP的内容再加10H即为有效地址3132位系统的寻址方式带位移量的基址比例因子变址方式变址寄存器的内容乘以比例因子,再加上基址寄存器的内容,又加上位移量,形成有效地址。例:MOVEAX,[EDI×4][EBP+80]

;EDI的内容乘以4,加上EBP的内容,再加上80即有效地址。3264位系统的寻址方式偏移可以被直接指定为不变的值(称为位移)或由下述分量来确定:位移(Displacement)—8、16或32位的值,补码。基址(Base)—32位通用寄存器中的值,或64位(如果REX.W被设置),补码。索引(Index)—32位通用寄存器中的值,或64位(如果REX.W被设置),补码。比例因子(Scalefactor)—其值为2、4或8,与索引值相乘。3364位模式中的主存地址64位系统的寻址方式在64位模式中采用RIP相对寻址(RIP+Displacement)时,32位的位移量经符号扩展后与64位RIP(指令指针寄存器)的值相加计算出下条指令的有效地址。34偏移(或有效地址)计算64位系统的寻址方式主存的平坦线性寻址方式各段寄存器指向同一个段描述符,而此段描述符中把段的基地址设为0,长度设为最大(4G),就形成了一个覆盖整个地址空间的巨大段。此时逻辑地址就和物理地址相同,程序员可以将整个主存空间看作自己的存储空间。这样的地址就没有了层次结构(段:偏移),故称为平坦寻址(flataddressing)模式,它是段式管理的特例。35Intel存储器寻址方式对比IntelCPU对存储器寻址时逻辑地址到物理地址的转换Intel指令系统——指令格式1.8086指令格式8086系统汇编语句(指令)格式为:label:mnemonicargument1,argument2例如:LoadReg:MOVAX,DateIntel指令系统——指令格式2.Intel64和IA-32体系结构的指令格式IA-32汇编语句(指令)格式为:label:mnemonicargument1,argument2,argument3例如:LoadReg:MOVEAX,DateIntel64和IA-32体系结构指令编码格式如下图所示,它是对8086指令格式的扩展。指令长度最短1字节,最长17字节。Intel指令系统——指令格式3.IA-32e模式的指令格式IA-32e模式有两个子模式:兼容模式(CompatibilityMode)。允许64位操作系统运行大多数继承的未修改的保护模式软件。64位模式(64-BitMode)。允许64位操作系统运行访问64位地址空间的应用程序。64位模式的指令格式见下图,与上图比较,它在IA-32指令格式的基础上又增加了1字节的REX前缀。Intel指令系统——指令格式4.IntelAVX(advancedvectorextensions)指令格式IntelAVX指令的编码机制是将前缀字节、操作码扩展域、操作数编码域、向量长度编码能力组合到新的前缀VEX中。图5.20示意了具有VEX前缀支持的Intel64指令编码格式。Intel指令系统——16位指令集8086/8088的指令系统大致可分为7种类型:数据传送指令算术运算指令逻辑运算和移位指令串操作指令程序控制指令处理器控制指令输入/输出指令41Intel指令系统——16位指令集类型指令及功能描述举例/说明数据传送MOVOPRD1,OPRD2;OPRD1和OPRD2分别是目的操作数和源操作数。该指令可把一个字节或一个字操作数从源地址传送到目的地址。MOVAL,BLMOVAX,03FFHMOVAL,BUFFERMOV[DI],CXMOVDS,DATA[SI+BX]MOVDEST[BP+DI],ESXCHGOPRD1,OPRD2;交换指令把一个字节或一个字的源操作数与目的操作数相交换。这种交换能在通用寄存器与累加器之间、通用寄存器之间、通用寄存器与存贮器之间进行,但是段寄存器不能作为一个操作数。XCHGAL,CLXCHGAX,DIXCHGBX,SILEAOPRD1,OPRD2;该指令把源操作数OPRD2的地址偏移量传送至目的操作数OPRD1中。源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。LEABX,BUFFERLDSOPRD1,OPRD2;该指令完成一个地址指针的传送。地址指针包括段地址和地址偏移量。指令执行时,将段地址送入DS,地址偏移量送入一个16位的指针寄存器或变址寄存器。LDSSI,[BX]LESOPRD1,OPRD2;这条指令除将地址指针的段地址送入ES外,其他操作与LDS的类似。LESDI,[BX+CONT]PUSHOPRD;该指令将16位操作数压入由SS:SP指示的堆栈。PUSHDXPOPOPRD;该指令从SS:SP指示的堆栈顶部弹出数据写入16位目的操作数。POPDXLAHF;标志寄存器送AH寄存器指令。SAHF;AH寄存器送标志寄存器指令。PUSHF;标志寄存器进栈。POPF;标志寄存器出栈CBW;该指令将AL的符号位(bit7)扩展到整个AH中,即将字节转换成一个字。MOVAL,4FHCBWCWD;该指令将AX的符号位(bit15)扩展到整个DX,即将字转换成双字。MOVAX,834EHCWD42Intel指令系统——16位指令集43算术运算ADDOPRD1,OPRD2;该指令完成两个操作数相加,结果送至目的操作数OPRD1,即OPRD1←OPRD1+OPRD2ADDAX,SIADDBX,3FFHADDSI,AXADDDI,CXADDDX,DATA[BX+SI]ADCOPRD1,OPRD2;该指令与ADD指令基本相同,只是相加时再加上进位位的当前值,即OPRD1←OPRD1+OPRD2+CFMOVAX,FIRSTADDAX,SECONDMOVTHIRD,AXMOVAX,FIRST+2ADCAX,SECOND+2MOVTHIRD+2,AXINCOPRD;该指令对指定的操作数进行加1操作,其操作数可以是通用寄存器,也可以在内存单元中。加1操作时,把操作数看作为无符号的二进制数。INCALINCWORDPTR[SI]SUBOPRD1,OPRD2;该指令进行两个操作数的相减操作,即OPRD1←OPRD1-OPRD2SUBAX,SISUBBX,3FFHSUBSI,AXSUBDI,CXSUBDX,DATA[BX+SI]SBBOPRD1,OPRD2;该指令与SUB相类似,只是相减时,还应减去借位标志CF的当前值。即OPRD1←OPRD1-OPRD2-CFIntel指令系统——16位指令集44DECOPRD;该指令实现对操作数的减1操作,所用的操作数可以是通用寄存器,也可以在内存单元中。减1操作时,把操作数看作为无符号的二进制数。DECAXDECCLNEGOPRD;该指令用来对操作数进行求补操作,即对操作数按位取反后加1。NEGAXCMPOPRD1,OPRD2;该指令为比较指令,与减法指令一样执行OPRD1-OPRD2操作,但相减后不回送结果,只是根据相减结果修改标志位。即:OPRD1-OPRD2CMPAL,100CMPAX,SICMPAX,DATA[BX]MULOPRD;该指令可以完成无符号字节与字节相乘,字与字相乘,并且默认目的操作数放在AL或AX中,而源操作数由指令指出。做16位乘法时,乘积为32位,规定其高16位放在DX中,低16位放在AX中。MOVAL,MUL_BYTECBWMULRSRC_WORDMOVAX,LSRC_WORDMULRSRC_WORDIMULOPRD;该指令完成带符号数的乘法指令,和MUL一样可以进行字节和字节、字和字的乘法运算。结果放在AX或DX、AX中。MOVAL,LSRC_BYTEIMULRSRC_BYTEDIVOPRD;无符号除法指令可以进行字节或字的除法运算,并且规定,8位除法的被除数在AX中;16位除法的被除数在DX与AX中,除数均由指令指出。对8位数除法,商与余数分别放在AL与AH中,对16位除法,商与余数分别放在AX与DX中。MOVAX,NUM_WORDDIVDIVISOR_BYTEMOVAL,NUM_BYTECBWDIVDIVISOR_BYTEIDIVOPRD;该指令是带符号的除法指令。执行除法后,余数符号与被除数相同,其他同DIV指令。Intel指令系统——16位指令集45Intel指令系统——16位指令集46Intel指令系统——16位指令集47Intel指令系统——16位指令集48Intel指令系统——16位指令集49Intel指令系统——16位指令集50Intel指令系统——16位指令集51Intel指令系统——32/64位指令集示例52Intel指令系统——多媒体指令集53MMX指令集MMX寄存器8个64位用于进行MMX运算的寄存器MMX数据类型64位打包字节整型64位打包字整型64位打包双字整型MMX指令47条指令,分为8类数据传送、算术运算、比较运算、格式转换、解包运算、逻辑运算、移位运算、退出MMX状态Intel指令系统——多媒体指令集54数据传送数据传送指令完成内存数据与MMX寄存器,或者MMX寄存器与通用32位寄存器,或者MMX寄存器之间的32位/64位数据传送。32位传送的指令为MOVD,格式:操作码指令格式功能描述0F6E/rMOVDmm,r/m32将通用寄存器或内存32位数据传送到MMX寄存器0F7E/rMOVDr/m32,mm将MMX寄存器传送到通用寄存器或内存Intel指令系统——多媒体指令集55数据传送进行64位传送则需使用MOVQ指令,其格式为:操作码指令格式功能描述0F6F/rMOVQmm,mm/m64将MMX寄存器或内存64位数据传送到MMX寄存器0F7F/rMOVQmm/m64,mm将MMX寄存器传送到MMX寄存器或内存Intel指令系统——多媒体指令集56算术运算操作码指令格式功能描述OFFC/rPADDBmm,mm/m64将MMX寄存器或内存64位数据与MMX寄存器按字节相加,结果存放MMX寄存器中。OFF8/rPSUBBmm,mm/m64目的操作数MMX寄存器按字节减去源操作数MMX寄存器或内存64位数据,差存放到MMX寄存器中。OFE5/rPMULHWmm,mm/m64目的操作数MMX寄存器按4个字数据乘以源操作数MMX寄存器或内存64位数据,积的高16位存放到目的操作数MMX寄存器中。OFF5/rPMADDWDmm,mm/m64目的操作数MMX寄存器按4个字数据乘以源操作数MMX寄存器或内存64位数据,然后将相邻的32位积相加后放到目的操作数MMX寄存器中。PMADDWD指令的操作过程Intel指令系统——多媒体指令集57比较运算例如,假设mm0=0101010101010101H,mm1=0101FFFFFFFFFFFFH,则分别执行比较指令后:PCMPEQBmm0,mm1 ;mm0=FFFF000000000000HPCMPEQWmm0,mm1 ;mm0=FFFF000000000000H这些指令不影响标志位寄存器EFLAGS操作码指令格式功能描述OF74/rPCMPEQBmm,mm/m64目的操作数MMX寄存器与源操作数MMX寄存器或内存64位数按字节进行相等比较,如果对应字节相等,则目的操作数对应字节位置置为全1,否则置为全0。OF75/rPCMPEQWmm,mm/m64目的操作数MMX寄存器与源操作数MMX寄存器或内存64位数按字进行相等比较,如果对应字相等,则目的操作数对应字位置置为全1,否则置为全0。Intel指令系统——多媒体指令集58格式转换例如,假设mm0=0101010101010101H,mm1=0101FFFFFFFFFFFFH,则分别执行格式转换指令后:PACKSSDWmm0,mm1 ;mm0=7FFFFFFF7FFF7FFFH该指令不影响标志位寄存器EFLAGS。操作码指令格式功能描述OF6B/rPACKSSDWmm,mm/m64目的操作数MMX寄存器中2个有符号双字数据与源操作数MMX寄存器或内存64位数中2个有符号双字数据按有符号饱和方式组成4字有符号数据写入目的操作数中。Intel指令系统——多媒体指令集59解包运算解包运算将目的操作数和源操作数中字节数据、字数据或者双字数据按一定规则进行交织形成新的操作数写入目的操作数中。假设mm0=0101010101010101H,mm1=0101FFFFFFFFFFFFH,则分别执行解包运算指令后:PUNPCKHBWmm0,mm1

;mm0=01010101FF01FF01HPUNPCKLBWmm0,mm1

;mm0=FF01FF01FF01FF01H这些指令不影响标志位寄存器EFLAGS。Intel指令系统——多媒体指令集60解包运算操作码指令格式功能描述OF68/rPUNPCKHBWmm,mm/m64目的操作数MMX寄存器与源操作数MMX寄存器或内存64位数中高位的4个字节进行交织,形成新的64位数据写入目的操作数。OF60/rPUNPCKLBWmm,mm/m64目的操作数MMX寄存器与源操作数MMX寄存器或内存64位数中低位的4个字节进行交织,形成新的64位数据写入目的操作数。PUNPCKHBW的操作过程PUNPCKLBW的操作过程Intel指令系统——多媒体指令集61逻辑运算对MMX类型数据进行按位与、与非、或和异或运算操作码指令格式功能描述OFDB/rPANDmm,mm/m64目的操作数MMX寄存器与源操作数MMX寄存器或内存64位数按位相与逻辑运算结果数据写入目的操作数。OFDF/rPANDNmm,mm/m64目的操作数MMX寄存器与源操作数MMX寄存器或内存64位数按位进行与非逻辑运算结果数据写入目的操作数。Intel指令系统——多媒体指令集62移位运算分为逻辑移位和算术移位,只不过移位是根据对应的MMX数据类型进行的,可以多个数据同时进行移位操作例如,假设mm0=F101010101F10101H,mm1=000000000000000EH,则分别执行移位运算指令后:PSLLWmm0,mm1

;mm0=4000400040004000H操作码指令格式功能描述OFF1/rPSLLWmm,mm/m64目的操作数MMX寄存器中4个字逻辑向左移位,移位次数由源操作数指定。Intel指令系统——多媒体指令集63退出MMX状态退出MMX状态指令为EMMS,在MMX指令程序的最后插入该指令,用于清空浮点处理器的标志状态寄存器,通知浮点处理器现在程序退出了MMX状态SSE指令集SSE指令由PentiumⅢ处理器引入,主要是用于对视频、音频处理的增强,进一步提高处理器SIMD处理能力Intel指令系统——多媒体指令集64SSE指令集SSE寄存器SSE指令建立在新增的8个128位的寄存器xmm0-xmm7。而且为了记录这些xmm寄存器在运算过程中的状态,处理器又增加了一个32位状态寄存器MXCSR。SSE寄存器主要增加了对浮点数SIMD操作的支持,可以将128分解为多个浮点数,然后进行同时处理,加快处理速度。Intel指令系统——多媒体指令集65SSE指令集SSE数据类型为了进行SIMD操作,针对这些128位寄存器,SSE技术引入了128位打包单精度浮点数据类型。该数据类型包含4个独立的32位符合IEEE标准的单精度浮点数。SSE指令可以在内存和xmm寄存器(或者xmm寄存器之间)进行数据传送或者转换,也可以通过运算实现4个浮点数据的并行处理。一般情况,128位内存数据必须以16字节对齐方式存取。而且还有专门的指令实现xmm寄存器与64位mm寄存器,以及32位通用寄存器之间的数据传送。Intel指令系统——多媒体指令集66SSE指令8类:数据传送算术运算逻辑运算比较运算混洗运算格式转换状态管理Cache控制、内存排序Intel指令系统——多媒体指令集67SSE2指令集SSE2指令由Pentium4处理器和PentiumXeon处理器引入,针对SSE寄存器xmm只能处理4个单精度浮点数,SSE2则对xmm寄存器定义了可以进行整数运算的多种数据类型,并且引入了新的用于SIMD运算的指令SSE2寄存器8个128位的xmm寄存器进行运算,并且同样包含状态寄存器MXCSR指示系统运行状态SSE2数据类型一个128位的打包浮点数据类型和4个128位整数数据类型2个64位的打包双精度浮点数,128位整数数据类型分别是打包字节数据类型(包括16个字节)、打包字数据类型(包括8个字)、打包双字数据类型(包括4个双字)和打包四字数据类型(包括2个四字)。Intel指令系统——多媒体指令集68SSE2指令打包标量双精度浮点运算指令64位和128位SIMD整数运算指令MMX和SSE指令的128位扩展整数指令Cache控制和指令排序指令69汇编语言及源程序结构——基本概念用指令的助记符、符号地址、标号、伪指令等符号书写程序的语言称为汇编语言。用汇编语言书写的程序称为汇编语言源程序或称源程序。把汇编语言源程序翻译成在机器上能执行的机器语言程序(目的代码程序)的过程叫做汇编,完成汇编过程的系统程序称为汇编程序。汇编程序在对源程序进行汇编过程中,除了将源程序翻译成目的代码外,还能给出源程序书写过程中所出现的语法错误信息,如非法格式,未定义的助记符、标号,漏掉操作数等。汇编程序还可以根据用户要求,自动分配各类存贮区域(如程序区、数据区、暂存区等),自动进行各种进位制数至二进制数的转换,自动进行字符至ASCII码转换及计算表达式的值等。70汇编语言及源程序结构——汇编程序汇编程序可以分为交叉汇编和驻留汇编交叉汇编程序运行交叉汇编程序的计算机与该汇编程序所要汇编成目的程序的机器是不同的。例如,汇编程序可以在IBM-PC/XT系统上运行,而所汇编成的目的代码程序是在MCS51系列微机系统上执行的。驻留汇编程序运行驻留汇编程序的微机系统就是执行汇编后形成目的代码程序的系统。例如,在IBM-PC上对8088的汇编语言源程序进行汇编,汇编后的目的程序就在IBM-PC机上执行。71汇编语言及源程序结构——汇编程序MASM是Microsoft的MacroAssembler的缩写,是微软公司为x86微处理器家族开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境(DEBUG)进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm。MASM4.00:最先广泛使用的MASM版本,用于DOS下汇编编程。MASM5.00:将段定义的伪指令简化为.code与.data之类的定义方式。MASM5.10→MASM5.10BMASM6.00:有许多改进,可以使用扩展内存,可执行文件名从Masm.exe

改为Ml.exe。MASM6.00A→MASM6.00B→MASM6.10→MASM6.10A→MASM6.11(可以编写Win32程序,同时支持Pentium指令)→MASM6.11C→MASM6.12(增加.MMX声明)→MASM6.13(增加.K3D声明)→MASM6.14(很完善的版本,在.XMM中增加了对PentiumIII的SIMD

指令集的支持)→MASM6.15(在VisualC++6.0ProcessorPack中)72汇编语言及源程序结构——汇编程序MASM是Microsoft的MacroAssembler的缩写,是微软公司为x86微处理器家族开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境(DEBUG)进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm.MASM7.0(在VisualC++.NET2002)→MASM7.1(在VisualC++.NET2003)。MASM8.0(在VisualC++.NET2005):可以汇编x64的代码。新版本:(在VisualC++2015中)在VisualC++的bin目录中,皆有ml.exe。VisualC++.NET2005的相同目录,还有ml64.exe(64位版)。相关的说明,都包含在新版VisualC++的说明文件里。73汇编程序做了什么?Hello.asmHello.exe汇编程序汇编语言及源程序结构——汇编程序74汇编程序做了什么?EXE

文件头堆栈段数据段代码段文件头长度SSSPIPCS(16字节整数倍)(16字节整数倍)段内偏移段地址第一个重定位项

(32位双字)的位置000000000指令7指令6指令5指令4指令3指令2指令1重定位项汇编语言及源程序结构——汇编程序75汇编语言及源程序结构——汇编语句汇编语言的语句分类(1)指令语句:经汇编后能产生相应的目的码,或称机器代码,能被CPU直接识别并执行相应的操作。(2)伪指令语句:指示汇编程序在汇编源程序时完成某些工作,比如给变量分配内存单元地址,给某个符号赋一个值等。伪指令语句经汇编后不产生机器代码,所指示的操作是在程序汇编时完成。(3)宏指令语句:允许用户将多次重复使用的程序段定义为宏(MACRO)。76汇编语言及源程序结构——汇编语句汇编语言的语句格式基本格式:[Name]Operator[Operand][;Comment]Name:名字项,用标识符表示的符号。Operator:操作项,语句进行某种操作的助记符。Operand:操作数项。Comment:注释项,以;开始。77汇编语言及源程序结构——汇编语句1.名字项(1)名字项的名称和含义在指令语句或宏指令语句中,称为标号,后跟冒号,对应符号地址。在伪指令语句中,称为符号名,可以是变量名、符号常数名、子程序名或段名。(2)书写规则字母:A-Z,a-z;数字:0-9;特殊符号:?、.、@、_、$等。名字项的第一个字符必须是字母或特殊符号,问号本身不能单独作为名字,最多31个字符。(3)名字项的属性段属性、偏移属性、类型属性标号的属性变量的属性78汇编语言及源程序结构——汇编语句2.操作项操作项表示语句要实现的具体操作,可以是指令、伪指令、宏指令语句的助记符。3.操作数项操作数项根据不同的语句由一个或多个表达式组成,两个以上的表达式之间要用逗号分开。常见形式:常数、寄存器、标号、变量或表达式。79汇编语言及源程序结构——汇编语句(1)数值常数整数的表示方法:二进制B、八进制O(Q)、十进制D(默认)、十六进制H例:MOVAL,0AH实数的表示方法:带小数点的十进制形式和指数形式,例576.7,-312.125,1.2E-1等。短实数(单精度浮点数)4个字节DD伪指令长实数(双精度浮点数)8个字节DQ伪指令暂存实数(扩展精度浮点数)10个字节DT伪指令(2)字符串常数:是指用单引号扩起来的一个字符或多个字符的序列。例如:MOVAH,‘A’或MOVAH,41H(3)符号常数:是指EQU伪指令或赋值语句“=”定义过的符号名。4.注释项80汇编语言及源程序结构——伪指令语句

程序员可以使用伪指令向汇编程序发出某些控制和操作指示,在汇编过程中完成相应的工作。

伪指令由汇编程序解释后完成相应的操作,汇编后不产生目的代码,经过汇编后得到的目的码程序中,伪指令已不复存在。

五类:方式类、数据类、条件类、宏指令类和列清单类。81汇编语言及源程序结构——伪指令语句1.数据定义伪指令主要功能:为变量分配内存单元,也可以预置初值,或预留内存单元。DB、DW、DD、DQ和DT(1,2,4,8,10)格式:[变量名]伪指令名操作数项表操作数项可以由多个操作数组成:常数,表达式,字符串,?或带DUP的表达式。1.数据定义伪指令82类型用途类型用途BYTE8位无符号整数FWORD48位整数(可在保护模式下用作远指针)SBYTE8位有符号整数QWORD64位整数WORD16位无符号整数(可在实模式下用作近指针)TBYTE80位整数SWORD16位有符号整数REAL432位IEEE短实数DWORD32位无符号整数(可在保护模式下用作近指针)REAL864位IEEE长实数SDWORD32位有符号整数REAL1080位IEEE扩展精度实数早期版本:DB、DW、DD、DQ、DT汇编语言及源程序结构——伪指令语句831.数据定义伪指令例:.datavalue1BYTE10hvalue2BYTE?list1BYTE10,20,30,40BYTE50,60,70,80list2BYTE32,41h,00100010b,'a'greetingBYTE"Goodafternoon",0dh,0ah,0arrayWORD5DUP(?) ;5个未初始化的值value3DWORD12345678h78h56h34h0000:0001:0002:12h0003:Intel处理器采用小尾顺序:value3+value3+value3+value3+汇编语言及源程序结构——伪指令语句84汇编语言及源程序结构——伪指令语句2.符号定义伪指令EQUEQU伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替,如:

TIMESEQU50DATADBTIMESDUP(?)上述两个语句实际等效于如下一条语句:

DATADB50DUP(?)3.段定义伪指令SEGMENT和ENDS段名SEGMENT[定位类型][组合类型][类别名]…..;本段语句系列段名ENDS.data.code85汇编语言及源程序结构——伪指令语句4.设定段寄存器伪指令ASSUMEASSUME段寄存器名:段名,段寄存器名:段名,……用于指示汇编程序哪些段是当前段以及这些段与段寄存器之间的联系,但并不能将段基址装入相应的段寄存器。例如: CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK MOVAX,DATA MOVDS,AX … CODEENDS86汇编语言及源程序结构——伪指令语句5.过程定义伪指令过程名PROC属性……

namePROCRET过程名ENDP例题

一个延时子程序,其过程可定义如下:SOFTDLYPROC

PUSHBX

PUSHCX

MOVBL,10DELAY:MOVCX,2801WAIT:

LOOPWAIT

DECBL JNZDELAY POPCX POPBX RETSOFTDLYENDP87汇编语言及源程序结构——伪指令语句远过程调用时被调用过程必定不在本段内CODE1SEGMENT ASSUMECS:CODE1 … FARPROCPROCFAR … RETFARPROC ENDPCODE1ENDSCODE2 SEGMENT ASSUMECS:CODE2 … CALLFARPROC … CALLNEARPROC …NEARPROCPROCNEAR … RETNEARPROCENDPCODE2 ENDS88汇编语言及源程序结构——伪指令语句6.宏命令伪指令宏命令的一般格式为:宏命令名MACRO[形式参量表] …宏体 ENDM例如: GADDMACROX,Y,ADDS MOVAX,Y ADDAX,Y MOVADDS,AX ENDM其中X,Y,ADDS是形式参量。调用时,下面宏命令书写格式正确: GADDDATA1,DATA2,SUM其中DATA1,DATA2,SUM是实参量。89汇编语言及源程序结构——伪指令语句7.汇编结束伪指令END伪指令END表示源程序的结束,令汇编程序停止汇编。因此,任何完整的源程序均应有END指令。一般格式为

END[表达式]其中表达式表示该汇编程序的启动地址。例如: ENDSTART则表明该程序的启动地址为START。90汇编语言及源程序结构——表达式运算符表达式是由常数、变量、标号通过运算符连接而成的。表达式中一般不允许出现寄存器,只有某些能存放段内偏移地址的寄存器才允许出现在表达式中。表达式的值只计算一次,在汇编时完成,而不是在程序运行时完成。91汇编语言及源程序结构——表达式运算符1.算术运算符+、-、*、/、MOD、SHR、SHL2.逻辑运算符NOT、AND、OR、XOR3.关系运算符用于两个表达式值的比较,表达式的值一定是常数或是同一个段内的偏移地址,比较的结果为逻辑值,关系成立,结果为真,用全‘1’表示,否则用全‘0’表示。六种关系运算符:EQ、NE、LT、LE、GT、GE92汇编语言及源程序结构——表达式运算符4.数值返回运算符数值返回运算符的运算对象必须是变量或标号其运算结果是变量或标号的特征值(类型属性值)或是它们对应的内存单元地址(段基址或段内偏移地址)。(1)OFFSET运算符计算出变量或标号的段内偏移地址。(2)SEG运算符取得变量或标号的段基址。(3)TYPE运算符取得变量的类型数字,该数字表示变量所分配的存储单元(字节)数。BYTE=1,WORD=2,DWORD=4取得标号的类型属性值,NEAR=-1,FAR=-293汇编语言及源程序结构——表达式运算符(4)LENGTH运算符仅对变量有效,返回该变量所分配的元素个数。若变量使用重复数据操作符DUP说明,则返回外层DUP操作符前面的数值。否则返回值为1。例如:

A1DB‘ABCD’A2DW10HDUP(1)

MOVAL,LENGTHA1;AL=1MOVCX,LENGTHA2;CX=16(5)SIZE运算符返回变量所分配的总字节数,是LENGTH*TYPE。94汇编语言及源程序结构——表达式运算符5.属性修改运算符(1)PTR运算符格式:类型PTR地址表达式将地址表达式的原类型属性临时修改成PTR运算符前面所指定的类型(BYTE、WORD或DWORD)。(2)SHORT运算符格式:SHORT标号SHORT运算符用来说明JMP指令中转移地址的属性是短属性,其转向地址是在JMP的下一条指令地址IP值加上一个字节的偏移量,即(IP)+127-(IP)-128之间。(3)HIGH和LOW运算符格式:HIGH/LOW表达式两个运算符都是针对一个16位的数或地址表达式的,其中HIGH运算符取其高位字节,LOW运算符取其低位字节。例如:CONSTEQU1234HMOVAH,HIGHCONSTMOVAL,LOWCONST95汇编语言及源程序结构——源程序结构汇编源程序一般应由3个程序段组成代码段许多以符号表示的指令,其内容就是程序要执行的指令数据段在内存中建立一个堆栈区,以便在中断、调用子程序时使用。堆栈段一般可以从几十个字节至几千字节。如果太小,则可能导致程序执行中的堆栈溢出错误。堆栈段在内存中建立一个适当容量的工作区,以存放常数、变量等程序需要对其进行操作的数据。96汇编语言及源程序结构——源程序结构STACKSEGMENTPARASTACK‘STACK’ DB500DUP(0) STACKENDS DATASEGMENT …… DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK START:MOVAX,DATA MOVDS,AX MOVES,AX;设置数据段寄存器

…… MOVAH,4CH INT21H;返回操作系统CODEENDS ENDSTART标准的完整段定义的源程序结构97汇编语言及源程序结构——源程序结构必须用ASSUME伪指令告诉汇编程序,哪一个段和哪一个段寄存器相对应。DOS的装入程序在装入执行时,将把CS初始化为正确的代码段地址,把SS初始化为正确的堆栈段地址,因此在源程序中不需要再对它们进行初始化。因为装入程序已将DS寄存器留作它用,这是为了保证程序段在执行过程中数据段地址的正确性,故在源程序中应有以下两条指令,对它进行初始化。MOVAX,DATAMOVDS,AX在DOS环境下,通常采用DOS的4CH号中断功能调用使汇编语言返回DOS,即采用如下两条指令:MOVAH,4CHINT21H98汇编语言及源程序结构——源程序结构源程序简化结构高版本的汇编程序支持简化段定义的汇编语言源程序,其结构如下:.MODELSMALL;存储模型,可设为Tiny、Small、Medium、;Compact、Large、Huge、Flat型.STACK100H ;定义堆栈段及其大小.DATA ;定义数据段

………… ;数据声明.CODE ;定义代码段START: ;起始执行地址标号MOVAX,@DATA;预定义符号@DATA给出数据段名称和地址MOVDS,AX ;存入数据段寄存器

………… ;具体程序代码MOVAH,4CHINT21HENDSTART ;程序结束99汇编语言与C语言混合编程接口当高级语言采用C语言时,汇编语言与C语言混合编程的接口有两种实现方法:在C语言程序中嵌入汇编语言代码;让C语言程序从外部调用汇编语言代码。C语言程序中嵌入汇编语言代码单句形式模块形式汇编语言与C语言混合编程接口例3.1我们来看一个让C语言和汇编语言协作的例子:查找最大数。main(){unsignedchardata1=8,data2=10;unsignedcharmax;printf(”FindMaxDataUsingAsm:\n”);__asm{MOVAH,data1MOVAL,data2CMPAH,ALJBHEREMOVmax,AHJMPFINDHERE:MOVmax,ALEND:}printf(”Maxis%d\n”,max);}100汇编语言与C语言混合编程接口在C语言程序中嵌入汇编语言代码的优点是简单,无需考虑外部链接、命名、参数传递协议等问题高效,不存在过程调用的开销缺点是缺乏可移植性。101C语言程序从外部调用汇编语言代码例3.2在本例中,文件AddMain.cpp提供了用C++编写的主程序模块,文件addem.asm提供了用汇编语言编写的子程序模块。通过主程序调用函数addem(),实现了C++程序从外部调用汇编语言代码。102(1)8/16/32/64位值在AL/AX/EAX/EDX:EAX中返回;(2)更大的数据结构(结构值、数组等)存储在静态数据区内,EAX中返回指向该数据的指针。单核处理器平台的程序设计例3.3屏幕显示“Helloworld”103Stacksegmentstack db100dup(?)stackendsdata segment messagedb'Hello,world',0dh,0ah,'$'data endscode segment assumecs:code,ds:data,ss:stackstart: movax,data movds,ax movah,9 movdx,offsetmessage int21h;调用屏幕显示功能

movah,4ch int21h;调用返回操作系统功能codeends endstartDOS操作系统或Windows实模式下的程序源代码单核处理器平台的程序设计例3.3屏幕显示“Helloworld”104.386.modelflat,stdcallMessageBoxAPROTO,hWnd:DWORD,lpText:PTRBYTE,lpCaption:PTRBYTE,style:DWORD;声明操作系统MessageBoxA函数原型ExitProcessPROTO,exitCode:DWORD;声明操作系统ExitProcess函数原型.dataszCaptiondb'AMessageBox!',0;窗口标题栏内容szTextdb'Hello,World!',0;窗口中显示的内容.codestart:push0;窗口中显示“确定”按钮(MB_OK)

pushoffsetszCaption;窗口标题栏显示内容字符串指针

pushoffsetszText;窗口中显示内容字符串指针

push0;NULLcallMessageBoxA;显示窗口

push0;参数0表示程序正常结束

callExitProcess;结束当前进程endstartWindows保护模式下的程序源代码单核处理器平台的程序设计1.

查找从地址2000:0000H开始的16K内存单元中是否存在字符‘A’,并将字符‘A’的个数放到DX中。请在横线上填入适当的汇编语句,完成该程序段设计。 MOVAX,________ MOVDS,AX MOVSI,___________________________ MOVAL,‘A’MOVDX,0NEXT1:___________________JNENEXT2___________________NEXT2:INCSILOOPNEXT11052000H0MOVCX,4000HCMPAL,[SI]INCDX单核处理器平台的程序设计2.

下面程序段运行结束后,(AX)=__________,(CX)=__________。 MOVCX,5MOVAX,160NEXT1:SUBAX,CXLOOPNEXT1

3.

下面程序中(接口03F2H)=50H,当程序执行完时,ZF=________,CF=________,(BL)=_______(16进制表示)。MOVDX,03F2HINAL,DXTESTAL,52HJNZNEXT1JMPNEXT2NEXT1:SUBAL,52HNEXT2:MOVBL,AL

HLT106145或91H0FEH10单核处理器平台的程序设计例3.4整数数组求和107.386.MODELflat,stdcall.STACK4096ExitProcessPROTO,dwExitCode:DWORD.dataintarrayWORD100h,200h,300h,400h.codemainPROCmovedi,OFFSETintarray;数组首地址

movecx,LENGTHOFintarray;循环次数(数组元素个数)

movax,0;累加和初值L1:addax,[edi];累加

addedi,TYPEintarray;指针加,指向数组下一个元素

loopL1;ECX减1,循环,直到ECX=0INVOKEExitProcess,0;结束当前进程mainENDPENDmain单核处理器平台的程序设计例3.5字符串拷贝108.386.MODELflat,stdcall.STACK4096ExitProcessPROTO,dwExitCo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论