您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 2015第四章8086汇编语言程序设计.
第四章8086汇编语言程序设计几个基本概念8086汇编语言的语句8086汇编中的伪指令8086汇编中的运算符汇编语言程序设计汇编语言程序设计实例几个基本概念汇编语言汇编语言源程序汇编汇编程序例编写汇编语言源程序,将两个字节二进制数相加.DATASEGMENT;定义数据段DATA1DB0F8H;被加数DATA2DB0C1H;加数DATAENDS;数据段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX;初始化DSMOVSI,0;置SI初值为0MOVAL,DATA2[SI];取加数ADDDATA1[SI],AL;与被加数相加MOVAH,4CHINT21H;返回DOSCODEENDS;代码段结束ENDSTART;源程序结束4.18086汇编语言的语句汇编语言由指令性语句和指示性语句组成指令性语句格式[标号:]助记符[操作数1,][操作数2];[注释]LER:MOVAL,DATA2[SI];取一个数属性标号有三种属性:段、偏移量和类型4.18086汇编语言的语句指示性语句格式[名字]伪指令[操作数1,][操作数2];[注释]DATA1DB0F8H,60H,3BH;被加数属性存储器操作数的属性有三种:段值、段内偏移量和类型。4.28086汇编中的伪指令4.2.1符号定义语句等值语句格式:符号名EQU表达式例:⑴PORTEQU1234⑵BUFFEQUPORT+58⑶MEMEQUDS:[BP+20H]⑷COUNTEQUCX⑸ABCEQUAAA等号语句格式:符号名EQU表达式例:NUM=34MOVCX,NUM……NUM=34+1与EQU伪指令基本相同,主要区别在于它可以对同一个名字重复定义。4.2.2变量定义语句格式:符号名DB/DW/DD[操作数1,][操作数2]…1、定义一组数据例1:BUFF1DW1234H,0ABCDH,8EHBUFF2DB-1DH,6AH…….MOVAX,BUFF1MOVBX,BUFF1+2MOVCL,BUFF22、定义一串字符例2:STRDB‘Welcome!’3、定义保留存储单元例3:SUMDW?,?4、复制操作复制操作符DUP可预置重复的数值例4:ALL_ZERODB0,0,0,0,0用复制操作可改为:ALL_ZERODB5DUP(0)5、将已定义的地址存入内存单元例5:LITDDCYC…CYC:MOVAX,BX4.2.3段定义语句1、段定义语句格式:段名SEGMENT[定位类型][组合类型][‘类别’]……段名ENDS只需要掌握段名SEGMENT……段名ENDS2、段假设语句ASSUME段寄存器名:段名[,…]3、ORG伪指令、地址计数器$ORG伪指令格式:ORG表达式4、END表示源代码结束格式为:END标号4.2.4过程定义语句过程名PROCNEAR/FAR……RET过程名ENDP……CALL过程名4.38086汇编中的运算符4.3.1常用运算符1、算术运算符+(加)、-(减)、*(乘)、/(除)、MOD(求余)2、逻辑运算符AND、OR、XOR、NOT3、关系运算符EQ(相等)、NE(不等、)LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。关系成立,全1关系不成立,全0例:MOVDL,10HLT16MOVDL,0例:ANDAX,555GT222ANDAX,0FFFFH4、分析操作符1)SEG例:BUFFDW1234HMOVAX,SEGBUFF2)OFFSET例:MOVBX,OFFSETBUFFMOVDX,BUFF3)TYPE对于变量有3种:1字节型;2字型;4双字型;对于标号有2种:-1NEAR(段内),-2FAR(段间)。例:BUFFDB20HMOVBX,TYPEBUFFMOVBX,014)LENGTH已用DUP说明的变量,则用LENGTH可得到这个变量的个数。否则得到15)SIZESIZE=TYPE×LENGTH例:BUFFDW10DUP(?)MOVCX,LENGTHBUFMOVCX,10MOVCX,SIZEBUFMOVCX,205、综合运算符(合成操作符)1)PTR运算符格式:类型PTR表达式例:INCWORDPTR[BX]wxdw1234hmoval,byteptrwxmovah,byteptrwx+12)THIS操作符格式:THIS类型(或属性)例:FIRSTEQUTHISBYTESECONDDW100DUP(?)4.4汇编语言程序设计常用的汇编语言程序框架:DATASEGMENT;定义数据段VAL1DB12H,8EH;定义变量……DATAENDS;数据段结束CODESEGMENT;定义代码段ASSUMEDS:DATA,CS:CODE;段属性说明START:MOVAX,DATA;初始化DSMOVDS,AX……MOVAX,4C00H;返回DOSINT21HCODEENDS;代码段结束ENDSTART;源程序结束特点程序分段语句由指令性和指示性语句组成两种程序框架框架一:DATASEGMENT;定义数据段VAL1DB12H,8EH;定义变量……DATAENDS;数据段结束CODESEGMENT;定义代码段ASSUMEDS:DATA,CS:CODE;段属性说明START:MOVAX,DATA;初始化DSMOVDS,AX……;填写代码MOVAX,4C00H;返回DOSINT21HCODEENDS;代码段结束ENDSTART;源程序结束框架二:DATASEGMENT;定义数据段VAL1DB12H,8EH;定义变量……DATAENDS;数据段结束CODESEGMENT;定义代码段MAINPROCFARASSUMEDS:DATA,CS:CODE;段属性说明START:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX……;填写代码RETMAINENDPCODEENDS;代码段结束ENDSTART;源程序结束4.4.1汇编语言程序设计基本步骤分析问题,建立模型,确定算法绘制流程图确定变量与工作单元,编写程序检查和调试4.4.2汇编语言程序的基本结构1、顺序结构例4-1DATASEGMENT;定义数据段BLOCKDW0ABCDH;定义变量BUFFDD?DATAENDS;数据段结束CODESEGMENT;定义代码段ASSUMEDS:DATA,CS:CODE;段属性说明START:MOVAX,DATA;初始化DSMOVDS,AX(相关代码)MOVAX,4C00H;返回DOSINT21HCODEENDS;代码段结束ENDSTART;源程序结束相关代码:MOVDX,BLOCKMOVAX,DXANDAX,0F0FHANDDX,0F0FHMOVCL,4SHRDX,CLLEABX,BUFFMOV[BX],ALMOV[BX+1],DLMOV[BX+2],AHLMOV[BX+3],DH2、分支结构例4-2实现100010xyxx实现符号函数程序的流程图≥MEMSDB8MEMDDB?……(一)MOVAL,MEMS;AL←MEMSCMPAL,0JGENEXT1;x≥0时转NEXT1MOVAL,-1;否则将−1送入ALJMPDONENEXT1:JENEXT2;为0时转NEXT2MOVAL,1;否则将1送入ALJMPDONENEXT2:MOVAL,0;将0送入ALDONE:MOVMEMD,AL(二)MOVAL,MEMSCMPAL,0MOVAL,-1JLDONEMOVAL,1JGDONEMOVAL,0DONE:MOVMEMD,AL3、循环结构(1)初始化部分:如设置地址指针、计数器、其他循环参数的起始值等。(2)工作部分:循环所要完成的具体操作。它可以是一个顺序程序、一个分支程序或另一个循环程序。(3)修改部分:如修改地址指针、其他循环参数等。(4)循环结束判断部分(5)结束处理部分:如存储结果等。可以没有这部分。循环控制方法1)循环次数已知,用计数控制循环。2)用条件控制循环无法确定循环次数时,可用某种条件来确定是否结束循环。程序要是寻找控制条件以及对控制条件的检测。例4-3:编程统计BUFF为首地址的缓冲区中负数的个数。BUFFDB67H,9EH,-6AH,0ABH,6DHMEMDB?XORDL,DL;DL←0LEABX,BUFF;BX←缓冲区首址MOVCX,5;CX←缓冲区长度NEXT:MOVAL,[BX];取一个数据到ALADDAL,0;使数据影响状态标志位JNSAA1;不为负,转AA1INCDL;为负DL+1AA1:INCBX;移动指针LOOP NEXT;循环控制MOVMEM,DL;保存统计结果例4-5:在BLOCK存储区有一字符串,统计“%”之前的字符个数BLOCKDB‘FHJLIO689%yyuo’COUNTEQU$-BLOCKMEMDB0MOVSI,OFFSETBLOCKMOVCX,COUNTLOOP1:MOVAL,[SI]CMPAL,‘%’JEDONEINCMEMINCSILOOPLOOP1DONE:MOVAH,4CH……4、子程序Callproc1ret实现方法主程序有调用指令call子程序有返回指令ret特点Call指令与ret缺一不可现场保护入口出口参数设置例4-6:编写AX*10AX子程序子程序编写1、子程序组成使用说明a、子程序功能b、使用寄存器情况c、入口出口参数程序体入口出口参数传递现场保护功能程序段2、现场保护和入口出口参数传递现场保护方案一:在子程序中保护方案二:在主程序中保护参数传递•寄存器传递•变量传递•堆栈传递;这是一个乘10子程序;使用寄存器AX;入口:AX,出口:AXmul10procpushbx;保护现场pushfaddax,ax;2axmovbx,ax;2axbxaddax,ax;4axaddax,ax;8axaddax,bx;10axpopf;恢复现场popbxretmul10endp功能程序段MOVAX,XXCALLMUL10MOVYY,AX4.6汇编语言程序设计与上机调试4.6.1程序设计实例4.6.2DOS功能调用与子程序设计微机系统为汇编用户提供了两个程序接口,一个是DOS系统功能调用,另一个是ROM中的BIOS。系统功能调用和BIOS由一系列的服务子程序构成,是通过软中断指令INTn调用和中断返回指令IRET返回的。便于程序设计人员使用系统的硬件,尤其是I/O的使用与管理。系统功能调用系统功能子程序可分为四个主要方面:(1)磁盘的读/写及控制管理。(2)内存管理。(3)基本输入/输出管理(键盘、打印机、显示器)。(4)其他管理(如时间、日期等)。系统已将所有子程序按顺序编号,称为调用号。使用时一般需要经过以下三个步骤:(1)子程序的入口参数送相应的寄存器。(2)子程序编号送AH。(3)发出中断请求:INT21H(系统功能调用指令)。键盘和显示器的DOS调用调用号功能入口参数出口参数1键入并显示一个字符键入字符的ASCII码在AL中2显示器显示一个字符DL中置输出字符的ASCII码5打印机打印一个字符DL中置输出字符的ASCII码8键盘输入一个字符键入字符的ASCII码在AL中9显示器显示一个字符串DS:DX置字符串首址,字符串以'$'结束10(0AH)键入并显示字符串DS:DX置字符串首址,第1单元置允许键入的字符数(含一个回车符)键入的实际字符数在第2单元中,键入的字符从第3单元开始存放11(0BH)检测有无键入有键入AL=FFH,无键入AL=01) 1号(键盘输入单字符)输入参数:无输出参数:AL=ASCII码扫描键盘,等待键入。有键按下,将相应字符的ASCII码值读入,若是Ctrl–Break,则退出程序执行;否则将键值送入AL寄存器,同时将这个字符显示在屏幕上。2) 2号(屏幕显示单字符)输入参数:DL=ASCII码输出参数:无显示器显示其ASCII码值放入DL中的字符。例4-21:键盘输入两个一位十进制数,求和并在屏幕显示。S
本文标题:2015第四章8086汇编语言程序设计.
链接地址:https://www.777doc.com/doc-2957211 .html