2、sage>MPYEQUMUL'利用MPY替代MUL指令注意EQU伪操作中的表达式名是不允许重复定义的,而=伪操作则允许重复定义。上述两个伪操作和数据定义DB/DW/DD等不同之处,主要体现在:EQU和=不分配内存空间,仅仅定义了数据,编译时用定义的数据替换标识符数据定义伪指令DB/DW/DD分配相应的内存空间通用数据传输指令传送指令MOV数据交换指令XCHG地址偏移量加载LEAMOV指令MOVtarget,sourcereg,regmem,regreg,memmem,immedreg,immed存储器操作数之间不能相互传值两个操作数的类型
3、须一致段寄存器和立即数之间不能相互传值CS不能作为目标寄存器使用合法指令举例寄存器传送MOVEDX,ECXMOVES,AXMOVBYTEFLD,AHMOV[DI],BX立即数传送MOVCX,40HMOVBYTEFLD,25HMOVWORDFLD[BX],16H直接存储器传送MOVCH,BYTEFLDMOVCX,WORDFLD[BX]段寄存器传送MOVAX,DSMOVWORDFLD,DS非法MOV指令MOVDL,WORD_VALMOVDX,BYTE_VAL注:PTR的使用MOVDL,WORDPTRWORD_VALMOVDX,BYTEPTPB
4、YTE_VALMOVBYTE_VAL1,BYTE_VAL2'存储器之间不能之间传送MOVES,23'立即数到段寄存器不能直接传送MOVES,DS‘段寄存器间不能传送MOVCS,23交换数据指令XCHGXCHGtarget,sourcereg,regreg,memmem,regMOV和XCHG不能执行存储器之间的数据传送交换数据操作的有效方法不需临时的空间排序经常需要此操作ItworksonlywiththegeneralregistersAX,BX,CX,DXBP,SI,DI,SPSEG格式:SEG变量名或者标号例如MOVAX,SEGK1
5、MOVAX,SEGDATAXOFFSET和LEA指令OFFSET操作符取偏移量MOVBX,OFFSETDATA1LEA利用偏移量初始化寄存器BX,SI,DI等,为的是指向存储器的一个地址举例DATA1DB25DUP(?)DATA2DB?……LEABX,DATA1'装入偏移地址MOVDATA2,[BX]'传送DATA1的第一个字节数据等效的指令LEABX,DATA1‘装入偏移地址MOVBX,DATA1LDS和LESLDSREG,SRC执行的操作:(REG)(SRC)(DS)(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄
6、存器及DS寄存器中.该指令常指定SI寄存器.LESREG,SRC执行的操作:(REG)(SRC)(ES)(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.地址偏移BDB4Fh,20h,3ChWDW2048,-100,0MOVBX,W+2MOVB+1,AHMOVAH,B+5MOVDX,W-3汇编器计算地址的偏移注意:汇编的时刻计算地址MOVAX,B-1不是从B的数值中减去1TYPE运算符例如V1DB‘ABCD’V2DW1234H,5678HV3DDV2……MOVAL,TYPEV1;0
7、1HMOVBL,TYPEV2;02HMOVCL,TYPEV3;04HLENGTH和SIZELENGTH返回数组变量元素的个数SIZE返回数组元素的字节大小Size=length*typeORG和$ORGn定位常数值为n的偏移地址$当前偏移地址例:ORG$+8可以表示跳过8个字节的存储区例题例如:BUFDW1,2,$+1,3如果BUF的偏址为10H,问内存情况如何?例如:BUFDB1,2,3,4ABCEQU$-OFFSETBUF问ABC等于什么?PTR强制修改操作数的类型例如:MOV[BX],AX对MOV[BX],4错改为:MOVWORDP
8、TR[BX],4MOVBYTEPTR[BX],4简单的算术运算ADDdest,sourceSUBdest,sourceINCdestDECdest操作数的类型一定要一致对标志寄存器起作用源操作