第4章 8086汇编语言程序设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第4章8086汇编语言程序设计几个概念8086汇编语言的语句8086汇编中的伪指令8086汇编中的运算符汇编语言程序设计宏定义与宏调用汇编语言程序设计实例几个概念汇编语言汇编语言源程序汇编汇编程序4.18086汇编语言的语句汇编语言由指令性语句和指示性语句组成一、指令性语句格式[标号:]操作码[操作数1,][操作数2];[注释]二、指示性语句格式[标识符(名字)]指示符(伪指令)表达式三、有关属性存储器操作数的属性有三种:段值、段内偏移量和类型(NEAR,FAR,BYTE,WORD,DWORD)。4.28086汇编中的伪指令一、符号定义语句1、等值语句格式:符号名EQU表达式例:⑴PORTEQU1234⑵BUFFEQUPORT+58⑶MEMEQUDS:[BP+20H]⑷COUNTEQUCX⑸ABCEQUAAA2、等号语句格式:NUM=34……NUM=34+1二、变量定义语句格式:符号名DB/DW/DD表达式DQ定义八字节DT(BCD)十个字节1、定义一组数据例1:BUFFDW1234H,0ABCDH,8EHDW–79DH,7B6AH2、定义一串字符例2:STRDB‘Welcome!’3、定义保留存储单元例3:SUMDW?,?4、复制操作复制操作符DUP(Duplication)可预置重复的数值例4:ALL_ZERODB0,0,0,0,0用复制操作可改为:ALL_ZERODB5DUP(0)5、将已定义的地址存入内存单元例5:LITDDCYC…CYC:MOVAX,BX三、段定义语句1、段定义语句格式:段名SEGMENT[定位类型][组合类型][‘类别’]……段名ENDS只需要掌握段名SEGMENT……段名ENDS2、段假设语句ASSUME段寄存器名:段名[,…]3、ORG伪指令与地址计数器$ORG伪指令格式:ORG表达式例:ADW1,2,$+4,3,4,$+4若A偏移地址为0074H,第一个$+4=(0074H+4)+4=007CH,第二个$+4=(0074H+AH)+4=0082H例:DECCXJZ$+5;转向指令的当前地址+6处(2字节)MOVAX,2;3字节LAB:----;跳转到此处4、PUBLIC和EXTRN伪指令四、过程定义语句过程名PROCNEAR/FAR……RET过程名ENDP4.38086汇编中的运算符一、常用运算符1、算术运算符+(加)、-(减)、*(乘)、/(除)、MOD(求余)。2、逻辑运算符AND、OR、XOR、NOT3、关系运算符EQ(相等)、NE(不等、)LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。例:MOVDL,10HLT16例:ANDAX,555GT222二、常用的操作符4、分析操作符1)SEG操作符例:MOVAX,SEGBUFF2)OFFSET操作符例:MOVBX,OFFSETBUFF3)TYPE操作符对于变量有3种:1字节型;2字型;4双字型;对于标号有2种:-1NEAR(段内),-2FAR(段间)。例:BUFFDB20HMOVBX,OFFSETBUFFMOVBX,014)LENGTH操作符5)SIZE操作符SIZE=TYPE×LENGTH例:BUFFDW10DIP(?)MOVCX,LENGTHBUFMOVCX,10MOVCX,SIZEBUFMOVCX,205、综合运算符(合成操作符)1)PTR运算符格式:类型PTR表达式例:INCWORDPTR[BX]2)THIS操作符格式:THIS类型(或属性)例:FIRSTEQUTHISBYTESECONDDW100DUP(?)4.4汇编语言程序设计常用的汇编语言程序框架:STSEGSEGMENTSTACKDB64HDUP(?)STSEGENDS-------------------------------------------------------------------------------------DTSEGSEGMENT‘DATA’;定义数据段VAL1DB12H,8EH;定义变量……DTSEGENDS;数据段结束--------------------------------------------------------------------------------------CDSEGSEGMENT‘CODE’;定义代码段ASSUMEDS:DTSEG,CS:CDSEG,SS:STSEG;段属性说明START:MOVAX,DATA;初始化DSMOVDS,AX……MOVAX,4C00H;返回DOSINT21HCDSEGENDS;代码段结束ENDSTART;源程序结束例:将存放于10H的六个字节转存于偏移地址为28H处STSEGSEGMENTSTACK;pro2.3DB64DUP(?)STSEGENDSDTSEGSEGMENT'DATA'ORG10HDATA_INDB25H,4FH,85H,1FH,2BH,0C4HORG28HCOPYDB6DUP(?)DTSEGENDSCDSEGSEGMENT'CODE'ASSUMECS:CDSEG,DS:DTSEG,SS:STSEGMAINPROCFARMOVAX,DTSEGMOVDS,AXMOVSI,OFFSETDATA_IN;SIpointstodatatobecopiedMOVDI,OFFSETCOPY;DIpointstocopyofdataMOVCX,06H;loopcounter=6MOV_LOOP:MOVAL,[SI];movethenextbytefromDATAareatoALMOV[DI],AL;movethenextbytetoCOPYareaINCSI;incrementDATApointerINCDI;incrementCOPYpointerDECCX;decrementLOOPcounterJNZMOV_LOOP;jumpifloopcounternotzeroMOVAH,4CH;setuptoreturnINT21H;returntoDOSMAINENDPCDSEGENDSENDMAIN例:tian1pro3-2EX3-15pro3-6SOUND11PRO13-6-2一、汇编语言程序设计基本步骤分析问题-绘制流程图-编写程序-检查和调试二、汇编语言程序的基本结构1、顺序结构2、分支结构3、循环结构4、子程序Callproc1ret4.5宏定义与宏调用1、宏定义宏指令名MACRO形式参量表……ENDM2、宏调用宏指令名实元表例:MULTYMACROOPR1,OPR2,RESULT;宏定义PUSHAXMOVAL,OPR1MOVAH,OPR2IMULOPR2MOVRESULT,AXPOPAXENDM……DATASEGMENTXXDB12YYDB34ZZDW?……MULTYXX,YY,ZZ;宏调用,实参替代虚参……4.6汇编语言程序设计实例1、算术运算例题例1:在偏移首地址为ARRAY的内存储区,有100个字型数据,要求将数组的每个元素加1,试编写汇编语言程序完成该要求。DATASEGMENTARRAYDW100DUP(?);定义100个字型随机数DATAEDNSCODESEGMENTASSUMEDS:DATA,CS:CODE……LEABX,ARRAY;设数组首地址指针MOVCX,LENGTHARRAY;数组数据长AA1:INCWORDPTR[BX],1;指定为字型数加1ADDBX,2;移动地址指针LOOPAA1;循环操作……完整程序请参看教材例2:有两个无符号字节型数组,设数组元素个数相等,编程将数组中的对应元素相加,结果存入另一内存区。DATASEGMENTM1DB20DUP(?)M2DB20DUP(?)M3DW20DUP(0)DATAENDSCODESEGMENT…………LEASI,M1;设数组1的地址指针LEADI,M2;设数组2的地址指针LEABX,M3;设结果区的地址指针MOVCX,20AA1:MOVAL,[SI]ADDAL,[DI]MOV[BX],ALADCBYTEPTR[BX+1],0;存结果的进位INCSIINCDIADDBX,2LOOPAA1……2、逻辑处理题例1:将寄存器AL中高、低4位交换……MOVAL,0ABHMOVCL,4ROLAL,CL;移出位补充移空位4次……例2:将AX中的内容按相反顺序存入BX中……MOVAL,1234HMOVCX,16AA1:SHLAX,1;移出的位进到CFRCRBX,1;AX中移出的位进入BXLOOPAA1……3、代码转换例题例1:编程将以$结束的字符串中的小写字母改为大写字母。DATASEGMENTSTRDB‘heLLo,eveRyboBY!’,’$’DATAENDS……LEABX,STRA1:MOVAL,[BX]CMPAL,‘$’;是$符,则结束JEDONECMPAL,‘a’JBNEXT;低于,则为大写字母CMPAL,’z’JANEXT;高于,则不是字母SUBAL,20H;将小写字母改为大写MOV[BX],ALNEXT:INCBXJMPA1……例2:十六进制数到十进制数的转换。除10取余法……MOVAX,4B6CHMOVCX,0;统计除法次数MOVBX,10;A1:MOVDX,0;被除数扩展为32位DIVBXPUSHDX;将转换好的数存入堆栈INCCXORAX,AX;转换直到商为0JNZA1……4、表格处理题例1:编程序将0-9的数字转换成所要求的密码明码和密码的映射关系为:01234567892716908345DATASEGMENTTABLEDB2,7,1,6,9,0,8,3,4,5;密码表VAL1DB8,4,1,7,5;被加密码(明码)VAL2DB5DUP(?)DATAENDS…………MOVSI,OFFSETVAL1MOVDI,OFFSETVAL2MOVCX,5LEABX,TABLE;表格首地址指针A1:MOVAL,[SI];取明码XLAT;转换为密码MOV[DI],ALINCSIINCDILOOPA1……6、按数据大小排序题例1:编程序实现,从一串带符号字型数据中找出最大值。DATASEGMENTBLOCKDW762EH,6A8BH,-664AH,0B945H,-85DHCOUNTEQU($-BLOCK)/2DATAENDS……LEASI,BLOCKMOVCX,COUNTMOVAX,[SI];取第1个数DECCX;准备与下个数比较AA1:ADDSI,2CMPAX,[SI];与下个数比较JGAA2;前一个数大,则保留下次再比MOVAX,[SI];否则,取后一个数下次再比AA2:LOOPAA1……4.7DOS功能调用与子程序设计在程序中,数据的输入和输出及对输入/输出设备的管理工作是较为繁琐的。实际上无论用户程序还是DOS系统本身,都离不开输入/输出操作,为了方便用户,DOS系统将输入/输出管理程序编写成一系列子程序,不仅系统可以使用,用户也可以像调用子程序一样方便的使用它们。在系统的ROM中也有一组输入/输出管理程序可供用户使用,这组程序常称为ROMBIOS(ROMBasicI/OSystem)。INT21(DOS功能)INT10(BIOS视频)INT16(BIOS键盘)INT33(鼠标)调用过程为:⑴DOS功能调用号送AH寄存器;⑵如果需要,按要求给定输入参数;⑶写入中断指令INT21H。调用结束,按功能使用其输出参数。部分键盘扫描码与ASCII码1、单字符输入-1号功能:从键盘输入1个字符输入参数:无输出参数:AL=ASCII码2、单字符输出-2号功能:在屏幕上显示1个字符(ASCII码)输入参数:DL=ASCII码输出参数:无例:从键盘输入两个1位十进制数,求两数之和并在屏幕上显示结果。MOVAH,1;DOS调用输入第一个数INT21HMOVBL,AL;保存输入的第一个数MOVAH,1INT21HADDAL,BL;两个ASCII码相加AAA;调整加法结果为非压缩BCD数MOVDL,ALADDDL

1 / 55
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功