汇编程序功能伪操作汇编语言程序格式汇编语言程序的上机过程第4章汇编语言程序格式1.程序运行步骤及生成的文件myfile.asm编辑程序汇编程序连接程序myfile.crfotherfiles.objmyfile.lstmyfile.objmyfile.mapmyfile.exe建立,运行汇编语言程序CEDITMYFILE.ASMCMASMMYFILE.ASMMicrosoft(R)MacroAssemblerVersion5.10Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.Objectfilename[MYFILE.OBJ]:Sourcelisting[NUL.LST]:MYFILE.LSTCross-reference[NUL.CRF]:47962+413345Bytessymbolspacefree0WarningErrors0SevereErrorsCLINKMYFILE.OBJMicrosoft(R)OverlayLinkerVersion3.64Copyright(C)MicrosoftCorp1983-1988.Allrightsreserved.RunFile[MYFILE.EXE]:ListFile[NUL.MAP]:Libraries[.LIB]:LINK:warningL4021:nostacksegmentCMYFILE2.汇编程序功能汇编程序的主要功能:•检查源程序,给出出错信息。•产生目标文件(.obj)和列表文件(.lst)。•展开宏指令。3.伪操作(伪指令)伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。•处理器选择伪操作•段定义伪操作•程序开始和结束伪操作•数据定义及存储器分配伪操作•表达式赋值伪操作•地址计数器与对准伪操作•基数控制伪操作Directives.8086选择8086指令系统.286选择80286指令系统.286P选择保护模式下的80286指令系统.386选择80386指令系统.386P选择保护模式下的80386指令系统.486选择80486指令系统.486P选择保护模式下的80486指令系统.586选择Pentium指令系统.586P选择保护模式下的Pentium指令系统◆处理器选择伪操作:◆段定义伪操作:完整的段定义格式datasegment;定义数据段…dataends;----------------------------------------extrasegment;定义附加段…extraends;----------------------------------------codesegment;定义代码段assumecs:code,ds:data,es:extrastart:movax,datamovds,ax;段地址段寄存器…codeendsendstartPSPDSESSSCSEXE程序的内存映象图装入模块文件头……codesegmentmainprocfarassume……start:pushdsmovax,0pushax……retmainendpcodeendsendstart……codesegmentmainprocfarassume……start:…………movax,4c00hint21hmainendpcodeendsendstart段名SEGMENT[定位类型][组合类型][使用类型][‘类别’]…………;语句序列段名ENDS(1)定位类型align_typePARABYTEWORDDWORDPAGE(2)组合类型combine_typePRIVATEPUBLICCOMMONSTACKATexp(3)使用类型use_typeUSE16USE32(4)类别‘class’存储模式与简化段定义伪操作(1)MODEL伪操作.MODEL存储模式[,语言类型][,操作系统类型][,堆栈选项]存储模式:tinysmallmediumcompactlargehugeflat.modelsmall.stack100H.data…….code.startup…….exit0end(2)简化的段定义伪操作.code[name].data.data?.fardata[name].fardata?[name].const.stack[size].modelsmall.data…….code.startup…….exit0end.modelsmall.data…….codestart:movax,@datamovds,ax……movax,4c00hint21hendstart.modelsmall.const…….data…….codestart:movax,DGROUPmovds,ax……movax,4c00hint21hendstart段组定义伪操作dseg1segmentwordpublic‘data’……dseg1endsdseg2segmentwordpublic‘data’……dseg2endsdatagroupgroupdseg1,dseg2csegsegmentparapublic‘code’assumecs:cseg,ds:datagroupstart:movax,datagroupmovds,ax……movax,4c00hint21hcsegendsendstartdata1segmentwordconst1dw100data1endsdata2segmentwordvar1dw?data2endsdatagroupgroupdata1,data2codesegmentassumecs:code,ds:datagroupmovax,datagroupmovds,axmovax,const1movvar1,ax…movax,4c00hint21hcodeendsendstartTITLEtextNAMEmodule_nameEND[label].STARTUP.EXIT[return_value]◆程序开始和结束伪操作:◆数据定义及存储器分配伪操作:[变量]助记符操作数[,操作数,…][;注释]助记符:DBDWDDDFDQDTDATA_BYTEDB10,4,10H,?DATA_WORDDW100,100H,-5,?-0AH04H10H-64H00H00H01HFBHFFH-DATA_BYTEDATA_WORD例:ARRAYDB‘HELLO’DB‘AB’DW‘AB’48H45H4CH4CH4FH41H42H42H41HARRAYPAR1DW100,200PAR2DW300,400ADDR_TABLEDWPAR1,PAR2VARDB100DUP(?)DB2DUP(0,2DUP(1,2),3)OPER1DB?,?OPER2DW?,?……MOVOPER1,0;字节指令MOVOPER2,0;字指令OPER1DB1,2OPER2DW1234H,5678H……MOVAX,OPER1+1×MOVAL,OPER2×类型不匹配MOVAX,WORDPTROPER1+1MOVAL,BYTEPTROPER2(AX)=3402H(AL)=34HBYTE_ARRAYLABELBYTEWORD_ARRAYDW50DUP(?)tosLABELWORDLABEL伪操作:nameLABELtypeBYTE_ARRAYWORD_ARRAYtos50字0064H◆表达式赋值伪操作:表达式名EQU表达式ALPHAEQU9BETAEQUALPHA+18BBEQU[BP+8]“=”伪操作(允许重复定义)……EMP=7……EMP=EMP+1……◆地址计数器与对准伪操作:地址计数器$:保存当前正在汇编的指令的地址ORG$+8;跳过8个字节的存储区JNE$+6;转向地址是JNE的首址+6JMP$+2;转向下一条指令$用在伪操作的参数字段:表示地址计数器的当前值ARRAYDW1,2,$+4,3,4,$+400H01H00H02H00H7CH00H03H00H04H00H82HARRAY007E00780074ORG伪操作:SEG1SEGMENTORG10VAR1DW1234HORG20VAR2DW5678HORG$+8VAR3DW1357HSEG1ENDSBUFFERLABELBYTEORG$+8BUFFERDB8DUP(?)ORG100HSTART:……BDW2DUP(?)ALIGNboundaryALIGN4ALIGN2;EVENEVEN;使下一地址从偶地址开始ADB‘morning’EVEN◆基数控制伪操作:.RADIX表达式;规定无标记数的基数MOVBX,0FFHMOVBX,178.RADIX16MOVBX,0FFMOVBX,178D3.汇编语言程序格式标号指令寄存器说明程序或语句变量伪指令标号的功能宏指令变量常数表达式源程序的每条语句可表示为:[名字]操作操作数[;注释]标号/变量:段值、偏移量、类型三种属性表达式:数字表达式地址表达式表达式操作符:(1)算术操作符:、、、、ModVIDEO_BUFDB25*80*2DUP(?)ARRAYDW1,2,3,4,5,6,7ARYENDDW?MOVCX,(ARYEND-ARRAY)/2ADDAX,BLOCK+2;符号地址常数有意义;时意义不明确MOVAX,BX+1;MOVAX,[BX+1];寄存器间接寻址OPR1EQU25;00011001BOPR2EQU7;00000111BANDAX,OPR1ANDOPR2(2)逻辑和移位操作符:AND、OR、XOR、NOT、SHL、SHR;ANDAX,1INAL,PORT_VAL;61HOUTPORT_VALAND0FEH,AL;60HMOVAX,0FFFFHSHL2;MOVAX,0FFFCH(3)关系操作符:EQ、NE、LT、LE、GT、GE计算结果为逻辑值:真0FFFFH假0000HX:…………Y:……若128(真)汇编结果:MOVFID,-1若128(假)汇编结果:MOVFID,0MOVFID,(OFFSETY-OFFSETX)LE128(4)数值回送操作符:OFFSET、SEG、TYPE、LENGTH、SIZESIZE变量功能:LENGTH*TYPEOFFSET/SEG变量/标号功能:回送变量或标号的偏址/段址TYPE变量/标号/常数DBDWDDDFDQDTNEARFAR常数1246810-1-20LENGTH变量功能:回送由DUP定义的变量的单元数,其它情况回送1ARRAYDW100DUP(?)TABLEDB‘ABCD’ADDSI,TYPEARRAY;ADDSI,2ADDSI,TYPETABLE;ADDSI,1MOVCX,LENGTHARRAY;MOVCX,100MOVCX,LENGTHTABLE;MOVCX,1MOVCX,SIZEARRAY;MOVCX,200MOVCX,SIZETABLE;MOVCX,1(5)属性操作符:PTR、段操作符、SHORT、THIS、HIGH、LOW、HIGHWORD、LOWWORDHIGH和LOWCONSEQU1234HMOVAH,HIGHCONSMOVAL,LOWCONS类型PTR表达式MOVWORDPTR[BX],5段操作符MOVES:[BX],ALSHORT标号JMPSHORTNEXTTHIS类型TAEQUTHISBYTETDDW1234HNEXTEQUTHISFARMOVAX,24.汇编语言程序的上机过程.modeltiny.codeorg100hbegin:jmpmain;************************num1dw1199Hnum2dw1166Hsumdw?;************************mainprocnearmovax,num1addax,num2movsum,axmovax,4c00hint21hmainendpend