第2章_编写简单的汇编程序(可编辑)_第1页
第2章_编写简单的汇编程序(可编辑)_第2页
第2章_编写简单的汇编程序(可编辑)_第3页
第2章_编写简单的汇编程序(可编辑)_第4页
第2章_编写简单的汇编程序(可编辑)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

第2章_编写简单的汇编程序主要内容21常量、变量、标号、表达式22常量和变量的定义23数据寻址方式24基本指令25源程序的基本格式26汇编语言程序的上机调试21常量、变量、标号、表达式指令和伪指令常量变量标号和表达式硬指令和伪指令硬指令使CPU产生动作、并在程序执行时才处理的语句,即处理器指令。伪指令(DIRECTIVE)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,也称指示性语句。例如,数据说明、变量定义等等伪指令与具体的处理器类型无关,但与汇编程序的版本有关常量常量是在程序运行期间固定不变的数。用途用作指令的立即数、寻址方式的偏移量以及变量定义时的初始化值。各进制数二进制常数以基数说明符BB结尾。十进制常数以字母DD结尾。汇编语言源程序中默认为十进制数,可省略D。八进制常数以字母OO结尾。十六进制常数以字母HH结尾。对于以字母AF起头的十六进制数,必须在前边加一个数字0,以便与标识符区别开。在DEBUG中默认为十六进制数,可省略H。常量如何改变数的默认进制RADIX伪指令格式RADIXN其中,N为默认进制的基数。例如RADIX16实数由整数、小数和指数3部分组成,通常以十进制数形式表示字符串用单引号括起来的一个或多个字符。变量变量占固定长度的存储单元,在程序运行期间其值可变。变量名符号地址,是变量所占一组存储单元的起始地址。变量的值存储单元中的数据变量的三种属性段属性SEG是16位无符号数,表示变量所在段的段首地址。偏移属性OFFSET是16位无符号数,表示从段首址单元到变量存储单元位置之间的位移量。段属性和偏移属性就确定了一个变量的物理位置。类型属性TYPE表示变量占用的内存存储单元的字节数,即确定了变量中数据的取值范围,但不能确定变量的操作。变量类型可以为字节、字、双字、四字或10字节。标号标号指令所占据一组存储单元的符号地址标识,存储单元中的数据是指令的操作码和操作数。用途在分支结构和子程序设计中,用标号表明程序执行流程将要转移的位置表示标识符指令例如,定义和使用标号的代码如下CMPAX,BXJNENEXT;AX不等于BX时,转移到NEXT标号指向的语句继续执行NEXTMOVAX,0标号的三种属性段属性SEG16位无符号数,标识指令代码段的段首地址。偏移属性OFFSET16位无符号数,表示从段首址到标号位置之间的位移量,是指令的偏移地址。段属性和偏移属性确定了标号所标识的指令的物理地址。类型属性TYPE按照转移指令和转移到的位置是否在同一段内,标号的类型分为NEAR和FAR两种。NEAR类型将产生一个2字节的偏移地址,称为短指针或近指针;FAR类型则将产生一个包括段地址和偏移地址的4字节转移地址,称为长指针或远指针。运算符和表达式表达式由寄存器名、常量、标号、变量和运算符按语法规则组合而成。在汇编期间计算表达式的值,并存于目标代码中。运算符运算符和表达式运算符算术运算符、和MOD用途数值操作数,汇编后得到数值运算结果。、运算也可用于地址操作数,但只能符合下面两种规则同一段内两个内储单元地址相减,得到两个内存单元之间相差的字数;一个内存器单元地址可以加或减一个常量,产生其邻近单元的地址。移位运算符对常数进行逻辑右移和左移运算,汇编后得到一个新的常数。格式表达式移位运算符移动的位数例如,MOVAX,01001001BSHR4;等效于MOVAX,00000100BSHLAX,00000101BSHR2;等效于SHLAX,00000001B关系运算符双目运算符,用于比较两个表达式的大小。说明表达式中的操作数必须是常数或同一段内的变量。对于常数按无符号数比较,对于变量则比较它们的偏移量。比较结果若为真,则关系表达式的值为1;如果为假,则关系表达式的值为0。例如,MOVAX,0FAHNE00001110B;等效于MOVAX,1运算符和表达式运算符逻辑运算符实现按位相与、相或、异或、求反的逻辑运算例如用逻辑运算符进行运算。MOVAL,34HAND0FH;04HALMOVBL,05HOR30H;35HBLMOVCX,NOT00FFH;0FF00HCXMOVDX,789AHXOR000FH;7895HDX提示逻辑运算符只用于数值表达式中,对地址进行逻辑运算无意义。分离运算符单目运算符,用于提取数据的高位和低位字节或字。HIGH取字数据的高位字节LOW取字数据的低位字节HIGHWORD取双字数据的高位字LOWWORD取双字数据的低位字。运算符和表达式运算符的优先级22常量和变量的定义常量的定义变量的定义变量的属性运算常量的定义符号常数是用一个标示识符来表示一个常数或常数型表达式。优点提高程序的可读性和通用性符号定义伪指令等价EQU伪指令(符号定义伪指令)符号名EQU表达式例1REQU6;符号代表一个常数DEQU2R;符号代表一个数值表达式提示EQU伪指令还可表示存储单元、指令的助记符、指令、寄存器等例2CALLDOSEQUINT21;符号代表一条指令NUMEQUCX;符号代表一个寄存器OPREQUADD;符号代表一个助记符ZZEQUESSI4;符号代表一个内存单元等号伪指令()EQU伪指令和等号伪指令的区别EQU不允许重复定义,允许重复定义解除符号定义伪指令PURGE符号1,符号2,符号常数实例符号定义DOSWRITECHAREQU2CARRIAGERETURN13CALLDOSEQU符号应用(左边程序段等价右侧的符号形式)MOVAH,2MOVAH,DOSWRITECHARMOVDL,13MOVDL,CARRIAGERETURNINT21HCALLDOS变量定义变量定义(DEFINE)伪指令为变量申请固定长度的存储空间,同时可进行初始化。变量的类型由数据定义伪指令确定,初值由表达式给定。格式变量名助记符初值表例如ADB1,2,3,6/3DUP伪操作符格式重复次数DUP初值1,初值2,初值N提示DUP操作符可以嵌套定义例使用DUP操作符定义一维数组和二维数组,定义时进行初始化。答一维数组和二维数组的定义如下BUFLDB10DUPBUF2DB100DUP0BUF3DB3DUP1,2,3,4,5BUF4DB3DUP5DUP变量定义伪指令助记符变量定义伪指令根据申请的主存空间单位分类DB定义字节伪指令DW定义字伪指令DD定义双字伪指令DQ和DT地址表达式只适用DW和DD两个伪指令助记符定义字节单元伪指令DBDB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值初值表中每个数据一定是字节量BYTE,存放一个8位数据可以是0255的无符号数可以是128127带符号数也可以是字符串常数定义字单元伪指令DWDW伪指令用于分配一个或多个字单元,并可以将它们初始化初值表中每个数据一定是字(WORD),一个字单元可用于存放任何16位数据一个段地址一个偏移地址两个字符065535之间的无符号整数3276832767之间的带符号整数定义双字单元伪指令DDDD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值初值表中每个数据是一个32位的双字(DOUBLEWORD)可以是有符号或无符号的32位整数也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针例如VARDDDD0,12345678HFARPOINTDD00400078HADDRDWVARDD;为VARDD的偏移地址ADDRDDDVARDD;为VARDD的偏移地址和段地址DQ与DT伪指令DQ伪指令可定义4个字的变量,常存放实型数,格式为变量名DQ例如,FLOATDQ2545E2DT伪指令可定义10个字节的变量。常用于存放一个10字节的BCD码十进制数,也可以存放实型数,格式为变量名DT例如TEN_BYTEDT45496E6例数据定义综合应用MODELSMALLSTACKDATABVARDB16WVARDWBVARDVARDD429496722321QVARDB1,2,3,4,5ABCDBA,B,CMSGDBHELLO,13,10,BBUFDB12DUPMONTHDBUFDD25DUPCALLDOSEQUCODESTARTUPMOVBL,BVARMOVAX,WORDPTRDVAR0MOVDX,WORDPTRDVAR2取双字到DXAXMOVDX,OFFSETMSGMOVAH,09HCALLDOSEXIT0END属性运算分析运算符得到变量或标号的某一属性段、偏移、类型合成运算符和伪指令也称为属性修改运算符,用于修改变量和标号的类型。属性及其应用SEG运算符OFFET运算符TYPE运算符LENGTH运算符SIZE运算符实例DATEARRAYDB45,45HCODEMOVAX,SEGARRAYMOVDS,AXMOVBX,OFFSETARRAY等价于LEABX,ARRAYMOVAX,ES2000H修改属性的运算符和伪指令合成运算符PTR运算符THIS运算符属性修改伪指令例属性修改设B1和A1、B2和A2表示相同内存单元的不同类型,找出错误B1LABELWORDA1DB3DUP12H,1N1EQUA1A2DB4DUP2,3DUP1,4B2EQUTHISWORDN2EQUA2A1例属性及其应用1/2MODELSMALLSTACKDATAV_BYTEEQUTHISBYTEV_WORDDW3332H,3735HTARGETDW5DUP20HCRLFDB0DH,0AH,FLAGDB0N_POINTDWOFFSETS_LABEL取得标号S_LABEL的偏移地址CODESTARTUPMOVAL,BYTEPTRV_WORDDECALMOVV_BYTE,ALN_LABELCMPFLAG,1JZS_LABELFLAG单元为1转移INCFLAGJMPSHORTN_LABEL进行短转移例属性及其应用2/2S_LABELCMPFLAG,2JZNEXTFLAG单元为2转移INCFLAGJMPN_POINT段内的存储器间接寻址,转移到S_LABEL标号处NEXTMOVAX,TYPEV_WORD汇编结果为MOVAX,2MOVCX,LENGTHTARGET汇编结果为MOVCX,5MOVSI,OFFSETTARGETW_AGAINMOVSI,AX对字单元操作INCSISI指针加2INCSILOOPW_AGAIN循环MOVCX,SIZETARGET汇编结果为MOVCX,0AHMOVAL,MOVDI,OFFSETTARGETB_AGAINMOVDI,AL对字节单元操作INCDIDI指针加1LOOPB_AGAIN循环MOVDX,OFFSETV_WORD显示结果1357MOVAH,9INT21HEXIT0END23数据寻址方式立即寻址寄存器寻址变量的寻址1直接寻址2寄存器间接寻址一维数组的寻址1寄存器相对寻址2基址加变址寻址3比例变址寻址4基址比例变址寻址二维数组的寻址1相对基址加变址寻址2相对基址比例变址寻址跨段问题立即寻址立即寻址方式中,指令操作码和操作数都在存储器代码段中,紧跟在指令操作码的后面。汇编格式NN为立即操作数,是用8位或16位二进制补码表示的有符号数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中图形表示注意立即寻址方式只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初值【例】MOVAX,1024HMOVBL,41HMOVAL,AMOVDX,ABMOVEAX,123400FEH寄存器寻址寄存器寻址方式的操作数放在指令指明的寄存器中。汇编格式R其中R表示寄存器名。图形表示R指令操作数【例】下列程序执行后,(AX),(BX)MOVAX,1234H;目的操作数地址,为寄存器寻址方式MOVBX,5678H;目的操作数地址,为寄存器寻址方式ADDAX,BX;源地址和目的地址皆为寄存器寻址方式图形表示执行1234HAX5678HBX(AX)(BX)AX执行后(AX)68ACH,(BX)5678H有效地址若数据在主存中,则操作数的格式需指明数据在主存位置的存储器地址有效地址(EA)操作数所存放单元的偏移地址。EA的组成EA基址变址比例因子位移量位移量8/16/32位地址基址存于基址寄存器BX、BP中,指向数据段中一组数据的首址变址存于变址寄存器SI、DI中,指向数据段中某一数据的首址比例因子变址比例因子变址(比例因子为1、2、4、8)寻址方式中默认段寄存器选择若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。1直接寻址【例】【例】寄存器和存储器内容为(AX)1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)3000H,(32000H)1245H。执行指令MOVAX,BUF执行后(AX)图形表示执行(32000H)AX执行后(AX)1245H2寄存器间接寻址寄存器间接寻址方式中,操作数放在存储器中,寄存器的内容为操作数的偏移地址EA。汇编格式R功能操作数存放在存储器,寄存器R存放操作数的偏移地址EA。执行指令MOVAX,BP执行后AX,BP,SS,(20030H)图形表示如下应用通常用于访问存储器中的数据表例在2000H开始的十个单元中依次放入从1开始的10个自然数。MOVBX,2000HMOVCX,10MOVAL,1LMOVBX,ALINCALLOOPL1寄存器相对寻址寄存器相对寻址方式操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中。汇编格式XR(X表示位移量,是8位或16位二进制补码表示的有符号数)功能操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。图形表示如下【例】设执行前(AX)0040H,(BX)0030H,(DS)2000H,(20036H)0050H执行指令ADD6BX,AX执行后(AX),(BX),(DS),(20036H)图形表示如下应用用于表达一维数组中的数据例在2000H开始的十个单元中依次放入从1开始的10个自然数。MOVCX,10MOVBX,1LMOV2000HBX,BLINCBXLOOPL2基址加变址寻址基址加变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容2项之和,操作数在存储器中。汇编格式BRIR功能操作数存放在存储器,BR的内容加IR的内容是操作数的偏移地址EA。图形表示【例】设执行前(BX)0040H,(DI)0030H,(AX)0040H,(DS)2000H,(20070H)0050H执行指令ADDBXDI,AX执行后(AX),(BX),(DS),(20070H)图形表示如下1相对基址加变址寻址操作数偏移地址EA计算方法如下【例】设执行前(BX)0040H,(DI)0030H,(AX)0040H,(DS)2000H,(20076H)0050H执行指令ADD6BXDI,AX执行后(AX),(BX),(DS),(20076H)图形表示如下3比例变址寻址(386以上的机型)比例变址寻址方式中,操作数的偏移地址EA是指令中32位变址寄存器内容比例因子位移量,操作数在存储器中。汇编格式XR32D功能操作数存放在存储器,R的内容乘以D加位移量X是操作数的偏移地址EA。图形表示【例】设执行前(EBX)00000010H,(AX)0040H,(DS)2000H,(20048H)0050H执行指令ADD8EBX4,EAX执行后(AX),(BX),(DS),(20048H)4基址比例变址寻址基址比例变址寻址方式中,操作数的偏移地址EA是指令中32位变址寄存器内容比例因子32位基址寄存器内容,操作数在存储器中。汇编格式BRIRD功能操作数存放在存储器,IR的内容乘以D加BR的内容是操作数的偏移地址EA。图形表示【例】设执行前(ESI)00000010H,(AX)0040H,EBX8,(DS)2000H,(20048H)0050H执行指令ADDEBXESI4,AX执行后(AX),(BX),(DS),(20048H)2相对基址比例变址寻址相对基址比例变址寻址方式中,操作数的偏移地址EA是指令中32位变址寄存器内容比例因子32位基址寄存器内容位移量,操作数在存储器中。汇编格式BRIRD位移量功能操作数存放在存储器,IR的内容乘以D加BR的内容加位移量是操作数的偏移地址EA。图形表示【例】设执行前(ESI)00000010H,(AX)0040H,EBX8,(DS)2000H,(20050H)0050H,SA8执行指令ADDSAEBXESI4,AX执行后(AX),(BX),(DS),(20050H)跨段问题按前述规定若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。汇编格式段寄存器名操作数地址。功能段寄存器名指明操作数属哪个段。【例】跨段前缀示例。MOVAX,DSBPMOVCX,SSSI该例中,DS,SS均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为PA1(DS)左移4位BPPA2(SS)左移4位SI小结表示某一内存单元直接寻址数值或变量名或变量名或变量名数值寄存器间接寻址寄存器表示一维数组的某个单元以字节为单位寄存器相对寻址X寄存器或寄存器X基址变址寻址基址寄存器变址寄存器或基址寄存器变址寄存器以字、双字等为单位比例变址寻址X寄存器比例因子基址比例变址寻址基址寄存器变址寄存器比例因子表示二维数组的某个单元以字节为单位相对基址变址寻址X基址寄存器变址寄存器或基址寄存器变址寄存器X或X基址寄存器变址寄存器以字、双字等为单位相对基址比例变址寻址X基址寄存器变址寄存器比例因子24基本指令通用数据传送指令地址传送指令简单算术运算指令通用数据传送指令传送指令MOV数据交换指令XCHG查表转换指令XLAT传送指令MOV语句格式MOVOPD,OPS功能将源操作数传送入目的地址,源地址内容不变即OPSOPD下图描述了MOV指令在传送数据时允许传送的路径及类型。传送指令MOV【例】存储器与寄存器间数据传送。MOVAX,BUFMOVBH,BYTEPTRDIMOVDI,ES3SIMOVBP,3BXSIMOVBUFA,DLMOVBP,AXMOVDSBP,DLMOVBUF,DSMOVES,BUF数据交换指令XCHG语句格式XCHGOPD,OPS功能将源地址与目的地址中的内容互换。即OPDOPS,OPSOPD。【例】寄存器与存储器之间数据交换。MOVAX,5678H;(AX)5678HMOVBX,0FFFFH;(BX)0FFFFHXCHGAX,BX;(AX)0FFFFH,BX5678H查表转换指令XLA语句格式XLATOPS或XLAT功能将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即(BXAL)AL。例利用查表的方式求任一数的平方SQRDB0,1,4,9,16,25,36,49,64,81地址传送指令传送偏移地址指令LEA传送偏移地址及数据段首址指令LDS传送偏移地址及附加数据段指令LES传送偏移地址指令LEA语句格式LEAREG16,MEM功能将MEM的偏移地址送入指定寄存器。即OFFSETMEMOPD。【例】主存偏移地址的获取。MOVBX,0100H;(BX)0100HMOVSI,0410H;(SI)0410HLEABX,1434BXSI;(BX)1944H传送偏移地址及数据段首址指令LDS语句格式LDSREG16,MEM功能将MEM的2个相继字单元的内容送入指定寄存器和DS寄存器。即MEM16REG16,MEM2DS。【例】LDSBX,10H传送偏移地址及附加数据段指令LES语句格式LESREG16,MEM功能将MEM的2个相继字单元的内容送入指定寄存器和ES寄存器。即MEM16REG16,MEM2DS【例】LESBX,10H算术运算类指令加法运算减法运算乘法运算除法运算综合练习加法运算加1指令INC加指令ADD带进位加指令ADC交换并相加加1指令INC语句格式INCOPD影响的标志AF、ZF、SF、PF、OF,不影响CF功能将目的操作数加1,结果送目的地址。即(OPD)1OPD。INC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。提示加1指令可用于对计数器和地址指针进行调整,而不是用于算术运算,所以不影响CF。例如INCBX;即(BX)1BX。INCBYTEPTRSI加指令ADD语句格式ADDOPD,OPS影响的标志AF、ZF、SF、PF、OF、CF功能将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。即OPDOPSOPD。源操作数可是立即数、寄存器、存储器;目的操作数可是寄存器、存储器3带进位加指令ADC语句格式ADCOPD,OPS影响的标志AF、ZF、SF、PF、OF、CF功能将目的操作数加源操作数再加低位进位,结果送目的地址。即(OPD)(OPS)CFOPD。源操作数可是立即数、寄存器、存储器;目的操作数可是寄存器、存储器ADC指令主要与ADD配合,实现多精度加法运算【例】无符号双字加法运算。MOVAX,4654H;(AX)4654HADDAX,0F0F0H;(AX)3744H,CF1MOVDX,0434H;(DX)0434HADCDX,0F0F0H;(DX)0F525H,CF04交换并相加指令XADD语句格式XADDOPD,OPS影响的标志AF、ZF、SF、PF、OF、CF功能将目的操作数加源操作数结果送临时存储单元,目的操作数送源地址,存储单元的内容送目的地址。即(OPD)(OPS)TEMP(OPD)OPS,(TEMP)OPD。源操作数和目的操作数可是寄存器、存储器加法指令减法运算减1指令DEC减指令SUB带借位减指令SBB求补指令NEG比较指令CMP减1指令DEC语句格式DECOPD影响的标志AF、ZF、SF、PF、OF,不影响CF功能将目的操作数减1,结果送目的地址。即(OPD)1OPD。DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。减1指令DEC一般用于对计数器和地址指针的调整。例如DECCX;即(CX)1CX。DECBYTEPTRBXDI减指令SUB语句格式SUBOPD,OPS影响的标志AF、ZF、SF、PF、OF、CFOF1被减数与减数符号相反,差与减数符号相同。表示有符号数溢出。功能目的操作数减源操作数,结果存于目的地址,源地址内容不变。即(OPD)(OPS)OPD源操作数可是立即数、寄存器、存储器;目的操作数可是寄存器、存储器【例】减法运算。MOVAX,5678H;(AX)5678HSUBAX,1434H;(AX)4244H带借位减指令SBB语句格式SBBOPD,OPS功能目的操作数减源操作数再减低位借位CF,结果送目的地址。即OPDOPSCFOPD影响的标志AF、ZF、SF、PF、OF、CF源操作数可是立即数、寄存器、存储器;目的操作数可是寄存器、存储器SBB指令主要与SUB配合,实现多精度减法运算求补指令NEG语句格式NEGOPD功能将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。即0FFFFHOPD1OPD。影响的标志AF、ZF、SF、PF、OF、CF【例】求补运算。MOVAX,2NEGALSUBAL,9DHNEGAXDECALNEGAX【例】将DXAX的内容求补CODESEGMENTASSUMEDSCODE,SSCODE,CSCODEBEGINMOVAX,0FFECHMOVDX,A988HMOVAX,4C00HINT21HCODEENDSENDBEGIN比较指令CMP语句格式CMPOPD,OPS功能目的操作数减源操作数,结果只影响标志位,不送入目的地址。即(OPD)(OPS)。对于无符号数,当CF1时,则OPDOPS对于有符号数,当OF、SF相同时,则OPDOPS当OF、SF不同时,则OPDOPS【例】比较AL的内容数值大小。CMPAL,50;(AL)50JBBELOW;(AL)50,转到BELOW处执行SUBAL,50;(AL)50,(AL)50ALINCAH;(AH)1AHBELOW减法指令乘法运算无符号数乘法指令MUL有符号乘指令IMUL只影响CF和OF无符号数乘法指令MUL语句格式MULOPS功能字节乘法(AL)(OPS8)AX字乘法(AX)(OPS16)DX,AX双字乘法EAXOPS32EDX,EAX标志CF、OF用于判断乘积是字节、字、双字CFOF0积的高一半全为0CFOF1积的高一半不全为0【例】无符号数0A3H与11H相乘。MOVAL,0A3H;(AL)0A3HMOVBL,11H;(BL)11HMULBL;(AX)0AD3H有符号乘指令IMUL1语句格式IMULOPS功能字节乘法(AL)(OPS)AX字乘法(AX)(OPS)DX,AXIMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。标志CF、OF用于判断乘积是字节、字、双字CFOF0积的高一半是低一半的符号扩展CFOF1积的高一半不是低一半的符号扩展注意因为结果的长度是因数长度的2倍,所以即使OF1结果也正确【例】有符号数0B4H与11H相乘。MOVAL,0B4H;(AL)B4HMOVBL,11H;(BL)11HIMULBL;(AX)0FAF4H有符号乘指令IMUL2语句格式IMULREG,SRC功能字乘法(REG16)(SRC16)REG16双字乘法REG32SRC32REG32注意源操作数可是8、16、32位立即数。语句格式IMULREG,SRC,IM功能字乘法IM(SRC16)REG16双字乘法IMSRC32REG32注意源操作数可是8、16、32位立即数。标志CF、OF注意OF1结果溢出,不正确除法运算无符号除指令DIV符号扩展指令和有符号除指令IDIV无符号除指令DIV语句格式DIVOPS功能字节除法(AX)/(OPS)AL(商)、AH(余数)字除法(DX、AX)/(OPS)AX(商)、DX(余数)【例447】写出实现无符号数0400H/0B4H运算的程序段。MOVAX,0400H;(AX)0400HMOVBL,0B4H;(BL)0B4HDIVBL;商(AL)05H,余数(AH)7CH符号扩展指令CBW字节转换成字。即符号扩展ALAXCWD字转换成双字。即符号扩展AXDX,AXCWDE字转换成双字,即符号扩展AXEAXCDQ双字转换成4字。即符号扩展EAXEDX,EAX有符号除指令IDIV语句格式IDIVOPS功能字节除法AX/OPSAL(商)、AH(余数)字除法DX,AX/OPSAX(商)、DX(余数)【例448】写出实现有符号数0400H/0B4H运算的程序段。MOVAX,0400H;(AX)0400HCWDMOVBX,0B4H;(BX)0B4HIDIVBX;(DX,AX)/(BX)除法指令DIV和IDIV虽然对标志的影响未定义,但可产生溢出除法错中断当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断除法错中断对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出对IDIV指令,除数为0,或者在字节除时商不在128127范围内,或者在字除时商不在3276832767范围内,则发生除法溢出习题设X、Y、Z、V均为16位带符号数,分别存放在X、Y、Z、V存储单元中,阅读如下程序段,得出它的运算公式,并说明运算结果存于何处24源程序的基本格式指令的格式行格式段格式程序设计CPU的指令格式L双操作数指令的格式大多数数据传送类指令、算术运算类指令、位操作类指令及串操作类指令,其双操作数指令有相同的语句格式和操作规定。格式标号操作符OPD,OPS;注释L单操作数指令的格式算术运算和位操作类指令的部分是单操作数指令,它们有相同的语句格式和操作规定。格式标号操作符OPD;注释指令由操作码和操作数两部分组成指令的操作码和操作数指令中的操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分用一个唯一的助记符表示(指令功能的英文缩写)对应着机器指令的一个二进制编码指令中的操作数指令执行的参与者,即各种操作的对象可以是一个具体的数值可以是存放数据的寄存器或指明数据在主存位置的存储器地址段定义伪指令定义段的目的汇编时确定标号和变量的偏移地址,并将有关信息通过目标模块传给连接程序,以便连接时把不同的段和模块连在一起生成可执行程序。简单的段定义格式段名SEGMENT语句序列段名ENDS程序设计指定段寄存器伪指令ORG伪指令源程序结束伪指令汇编语言和PCDOS的接口DOS支持的EXE程序和COM程序一个完整程序示例指定段寄存器伪指令ASSUME段寄存器段名,段寄存器名段名,通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系功能在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CSIP和SSSP在程序开始先根据需要进行DS、SS、ES的段基址填装,否则无法正确对数据进行寻址操作。CS在程序加载后由系统自动填装。SS也可以不用用户填装,在程序加载后由系统自动填装SS、SP,但段定义格式必须写全,其格式如下STACKSEGMENTPARASTACKSTACKORG伪指令汇编结束伪指令格式END标号源程序的最后必须有一条END语句指示汇编程序MASM到此结束汇编过程可选的标号用于指定程序开始执行点,连接程序将据此设置CSIP值汇编语言和PCDOS的接口PCDOS对内存的分配程序中如何实现接口PCDOS环境下8086/8088源程序的基本框架EXE程序利用程序开发工具,通常将生成EXE结构的可执行程序(扩展名为EXE的文件)它可以有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段,程序长度可以超过64KB,执行起始处可以任意指定DOS装入EXE文件的过程如下当DOS装入或执行一个程序时,DOS确定当时主存最低的可用地址作为该程序的装入起始点。此点以下的区域称为程序段。在程序段内偏移00HFFH的256B(100H)空间中,DOS为该程序建立一个程序段前缀控制块PSP,存放环境参数、命令行参数缓冲区等程序运行时可利用的信息。DOS利用文件头对数据进行重定位,在偏移100H处才装入程序本身。程序装在成功,DOS将控制权交给该程序,执行CS和IP指向的第一条指令。EXE程序的内存映象图COM程序COM程序是一种将代码、数据和堆栈段合一的结构紧凑的程序,所有代码、数据都在一个逻辑段内,不超过64KBCOM文件存储在磁盘上是主存的完全影象,不包含重新定位的加载信息,与EXE文件相比其加载速度更快,占用的磁盘空间也少尽管DOS也为COM程序建立程序段前缀PSP,但由于两种文件结构不同,所以加载到主存后各段设置并不完全一样COM程序的内存映象图COM程序格式完整段定义格式例题CODESEGMENTPUBLICASSUMECSCODE,DSCODEORG100HSTARTJMPBEGINSTRINGDBPRESSANYKEYTOCONTINUE数据安排在此BEGINMOVAX,CODEMOVDS,AXMOVDX,OFFSETSTRINGMOVAH,9显示信息INT21HMOVAH,01H等待按键INT21HMOVAH,02H响铃MOVDL,07HINT21HMOVAX,4C00H程序结束点,返回DOSINT21HCODEENDSENDSTART汇编结束汇编语言的程序格式完整的汇编语言源程序由段组成一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内通常,程序还需要一个堆栈段完整段定义格式MASM5X支持STACKSEGMENTSTACKDW512DUPTOPLABELWORDSTACKENDSDATASEGMENT在数据段定义数据DATAENDSCODESEGMENTCODEASSUMECSCODE,DSDATA,SSSTACKORG100HSTARTMOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXLEASP,TOP在代码段填入指令序列MOVAX,4C00HINT21H子程序代码CODEENDSENDSTART26汇编程序的上机调试汇编语言程序的过程DEBUG调试汇编语言程序的开发过程使用DEBUG调试用A、U命令建立、查看程序用G命令执行程序用D、E命令查看、修改内存中的数据用R命令查看、修改寄存器中的数据用N、W命令存盘用N、L命令再装入程序用A、U命令建立、查看程序格式1A功能从CSIP起编写汇编源程序格式2A偏移地址功能自【偏移地址】起编写汇编源程序用G命令执行程序格式1G功能完整连续地执行程序断点,最多允许设置10个格式2G偏移地址功能执行从CSIP到【偏移地址】的程序段格式3G偏移地址1偏移地址2功能执行从【偏移地址1】到【偏移地址2】的程序段用D、E命令查看、修改内存中的数据显示内存的内容格式1D功能显示DS0内存的值格式2D偏移地址1偏移地址2功能显示从【偏移地址1】到【偏移地址2】范围的内存值例如显示上例代码在内存中的存储情况D100106修改内存的内容格式1E偏移地址功能从【偏移地址】开始修改内存的内容。输入要改的内容后按空格;按空格保留原单元的内容;按回车键完成修改。格式2E偏移地址1字符串功能从【偏移地址】开始用字符串内容去填写例如E142STRING从142地址开始写入字符串STRING例如修改上例代码数据,显示字母AE101/改成41用R命令查看、修改寄存器中的数据格式1R功能显示当前所有寄存器的值格式2R功能修改指定寄存器的值格式3RF功能修改标志寄存器的值直接输入要修改的标志寄存器的值即可例如修改CX寄存器RCX例如RFNVUPEIPINZNAPONCDIPECY用N、W命令存盘定义文件名格式N文件名文件名功能为读写磁盘文件定义文件名。写磁盘命令格式W地址盘号相对扇区扇区数功能将指定内存中的数据写入指定盘区或盘文件。例如将02E0地址开始的存储区中的数据写到A盘上相对扇区30H开始的8个扇区中W02E00308例如将上例程序存入DTESTEXE中NDTESTEXERBXRCX/定义BXCX08为要写的字节数W100或W用N、L命令再装入程序读盘命令格式L地址盘号相对扇区扇区数功能为读写磁盘文件定义文件名。例如将DTESTEXE文件调入内存NDTESTEXEL例如从B盘相对扇区10H开始,读64H个连续扇区的数据,存入400H100H的存储区域L40010011064返回返回ORG伪指令用来修改。格式ORG表达式例240DATASEGMENTORG100HVALUELDW47A5H,8ORG40HVALUE2DBSTRINGCOUNTEQUVALUE2DATAENDSCODESEGMENTAT1000HASSUMECSCODE,DSDATAORG200HSTARTMOVAX,DATAMOVDS,AXMOVCX,COUNT;程序的其他代码CODEENDSENDSTART起始地址当通过键盘键入的源程序经汇编和链接生成可执行的程序文件并将执行该程序时,PCDOS按以下步骤操作1、为该程序建立一个长度为256字节的程序前缀区PSP,以便存放将要执行程序的有关信息,并为程序和PCDOS提供一个接口。接口实现通过INT20H软中断指令。2、把要执行的程序装入内存,并为其定位。内存分配如图所示。紧接在PSP之后的内存区域依次存放代码段、数据段和堆栈段。3、设置段寄存器的值,使DS、ES指向PSP的段基址,IP被设置为代码段中第一条指令的偏移地址;SP被设置成栈底地址。为保证程序执行完后能正确返回PCDOS,有2种方法。方法1步1、将用户程序的主程序定义成一个FAR过程,最后一条指令为RET步2、在主程序开始部分用以下3条指令将PSP中的INT20H指令的段基址及偏移地址压入堆栈PUSHDSMOVAX,0PUSHAX主程序执行完毕,返回时,存在栈内的两个字弹出给IP和CS,转去执行INT20H指令,回到PCDOS状态DATASEGMENTDATAENDSSTACKSEGMENTSTACKENDSCODESEGMENTMAENPROCFARASSUMECSCODE,DSDATA,SSSTACKMAINPUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXRETMAENENDP续PROCAPROCNEARPROCAENDPCODEENDSENDMAIN设置数据段预置数据设置堆栈段与PCDOS接口设置段寄存器值过程其它过程汇编连接生成的EXE文件加载到内存后的结构INT20H程序段前缀区程序区DS256B与DOS接口的方法2使用编号为4CH的功能调用返回DOSDATASEGMENTDATAENDSCODESEGMENTMAENPROCFARASSUMECSCODE,DSDATAMAINMOVAX,DATAMOVDS,AXMOVAX,4C00HINT21HMAENENDPCODEENDSENDMAIN注可以不定义堆栈段,由操作系统为程序分配堆栈段注意1、DSES指向PSP,所以在程序中要根据实际的数据段和堆栈段改变DS和ES2、若程序没有堆栈段,则SSPSP,SP100H,即堆栈段占用PSP中部分区域在程序开发时,需要满足一定要求并采用相应参数才能正确生成COM结构的程序1、程序的逻辑段只有一个即代码段,程序必须从100H处开始执行2、数据安排在代码段,但不能同可执行代码冲突,一般安排在程序的后部3、堆栈区设在物理段的尾部,通常为FFFFFH。CODESEGMENTPUBLICASSUMECSCODE,DSCODEORG100HSTARTJMPBEGIN在此定义数据BEGINMOVAX,CODEMOVDS,AX填入指令序列MOVAX,4C00HINT21H子程序代码CODEENDSENDSTART汇编语言源程序文件ASM汇编程序MASM或ASM目标代码文件列表文件交叉索引文件OBJLSTCRF输入翻译输出返回编辑文本编辑器,如EDIT源程序文件名ASM汇编汇编程序,如MLEXE目标模块文件名OBJ连接连接程序,如LINKEXE可执行文件文件名EXE调试调试程序,如DEBUGEXE运行应用程序错误错误错误错误MASM源文件名LINK目标文件名可执行文件名格式1U功能自CSIP起反汇编格式2U偏移地址1偏移地址2功能自【偏移地址1】到【偏移地址2】的内容起反汇编例如在屏幕上显示一个笑脸AMOVDL,1MOVAH,2INT21INT20U100108例如执行上例G或G100106返回本节首页返回本节返回本节DS0010BXDS返回本节返回本节首页返回返回本节例求在NUM和NUM1单元字节数据的和MOVAL,NUMADDAL,NUM1例累加ARRAY数组中第3、5、7个数组元素。设数组元素为字数据MOVBX,OFFSETARRAYADDBX,22MOVAX,BXADDBX,22ADDAX,BXADDBX,22ADDAX,BX返回本节若采用基址变址寻址方式应如何写代码若采用寄存器相对寻址方式呢返回本节例MOVBL,12MOVDL,2XADDBL,DL;BL14,DL12返回本节返回返回本节返回本节例双字减法MOVAX,4652H;AX4652HSUBAX,0F0F0H;AX5562H,CF1MOVDX,0234H;DX0234HSBBDX,0F0F0H;DX1143H,CF1返回本节返回本节NEGAXNEGDXNOTAXNOTDXADDAX,1ADCDX,0INCAX返回本节DXAXAX16位AXAL8位结果被乘数操作数尺寸返回返回本节返回本节EDXEAXEDXEAX32位DXAXDXAX16位AHALAX8位余数商被除数操作数尺寸注意除运算指令不影响标志位。若商超出AL/AX/EAX的范围,则产生除法错误异常,这时商和余数都无意义。返回返回本节返回本节返回本节XYZV65F3020024E00500MOVAX,XIMULYMOVCX,AXMOVBX,DXMOVAX,ZCWDADDCX,AXADCBX,DXSUBCX,540SBBBX,0MOVAX,VCWDSUBAX,CXSBBDX,BXIDIVX结果DXAX(V(XYZ540)X返回返回本节返回返回本节注意1、立即寻址不能用于单操作数指令2、在双操作数指令中,立即寻址方式只能用于源操作数,不能用于目的操作数。3、在双操作数指令中,用立即寻址表示的源操作数的长度应与目的操作数的长度一致。返回本节返回本节格式含有变量的地址。段寄存器名EA功能指令下一字单元的内容是操作数的偏移地址EA。图形表示2000H30000H32000H1245H返回本节12H300020013000000045H300020003000FFFFBUF例MOVBL,NUMMOVAX,1000HMOV1000H,AEASISI作间址寄存器。DIDI作间址寄存器。BXBX作间址寄存器。BPBP作间址寄存器。偏移地址EA计算方法如下偏移地址寄存器段寄存器对于386以上的处理器,允许使用除ESP以外的所有扩展寄存器寄存器和存储器内容分别为(AX)0,(BP)0030H,(SS)2000H,(20030H)1234H【例】12H200000312000000034H200000302000FFFFMOVDI,XYMOVBX,BH返回本节偏移地址EA计算方法如下对于386以上的处理器,允许使用除ESP以外的所有扩展寄存器例如MOVBL,DI100MOVARRAYSI,CL返回本节操作数偏移地址EA计算方法如下对于386以上的处理器,允许使用除ESP以外的所有扩展寄存器BXDIDS004000302000200700090返回本节用途表达一维数组中的数据基址加变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量三项之和,操作数在存储器中。汇编格式XBRIR功能操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。图形表示返回本节BXDIDS00400030620000076200760090例如MOVBXDI100H,BLMOVARRAYBPDI,AXMOVARRAYBXSI,AL应用表达二维数组中的数据对于386以上的处理器,允许使用除ESP以外的所有

温馨提示

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

评论

0/150

提交评论