汇编语言程序设计I.ppt

上传人:tian****1990 文档编号:12721473 上传时间:2020-05-19 格式:PPT 页数:65 大小:722KB
返回 下载 相关 举报
汇编语言程序设计I.ppt_第1页
第1页 / 共65页
汇编语言程序设计I.ppt_第2页
第2页 / 共65页
汇编语言程序设计I.ppt_第3页
第3页 / 共65页
点击查看更多>>
资源描述
第五章汇编语言程序设计,5.1程序设计概述5.2汇编,链接和运行程序5.3模块化的程序设计5.4汇编语言程序设计的基本方法,内容与要求:,掌握汇编语言的基本语法、语句、操作数的寻址方式与汇编表示、常量与数值表达式,标号、变量与地址表达式。2.掌握顺序、分支、循环程序设计的基本方法和一般技巧。3.掌握子程序与堆栈技术。4.了解宏汇编和宏指令的应用。,1机器语言(MachineLanguage)机器语言是一种用二进制表示指令和数据,能被机器直接识别的计算机语言。它的缺点是不直观,不易理解和记忆,因此编写、阅读和修改机器语言程序都比较繁琐。但机器语言程序是计算机惟一能够直接理解和执行的程序,具有执行速度快、占用内存少等特点。,5.1程序设计概述,2高级语言(HighLevelLanguage)如果说机器语言是面向机器的,那么高级语言(如BASIC,FORTRAN等)则是“面向过程”的语言。利用这些语言编程,程序员可以完全不考虑机器的结构特点,不必了解和熟记机器的指令系统,仅使用一些接近人们书写习惯的英语和数学表达式形式的语句去编制程序。这样编写的程序与问题本身的数学模型之间有着良好的对应关系,可在各种机器上通用(不同机器之间仅做少量修改)。但是,这种用高级语言编写的源程序并不能在机器上直接执行,需要被翻译成对应的目标程序(即机器语言程序),机器才能运行。把具有这种翻译作用的程序称为解释程序或编译程序,见图5.1。,由于高级语言程序是在未考虑机器的结构特点的条件下编写的,因而它就不能充分利用某种具体CPU所具有的某些特性,而通过编译或解释程序生成的目标程序往往比较冗长,占有较多的内存空间,执行时间也比较长,这就限制了它在某些场合下的运用。例如,实时的数据采集、检测和在线的实时控制等,往往要求程序的目标代码尽可能少占内存并有尽可能快的执行速度,在这些场合下,使用高级语言编写的程序常常不能满足要求。,3汇编语言(AssemblyLanguage)汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用标号或符号代表地址、常量或变量。助记符一般都是英文字的缩写,以方便人们书写、阅读和检查。实际上,用汇编语言编写的汇编语言源程序就是机器语言程序的符号表示,汇编语言源程序与其经过汇编所产生的目标代码程序之间有明显的一一对应关系,故也称汇编语言为符号语言。,用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等)直接对位、字节、字寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式,编制出高质量的程序,这样的程序不但占用内存空间少,而且执行速度快。当然,由于源程序和所要解决的问题的数学模型之间的关系不够直观,使得汇编语言程序设计需要较多的软件开发时间,也增加了程序设计过程中出错的可能性。用汇编语言编写的源程序也需要翻译成目标程序才能被机器执行。这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序,见图5.2。,图5.2汇编程序的功能示意图,5.2汇编,链接和运行程序,5.3模块化的程序设计,举例:,;Createashellformodularprogrammingusingthecompletesegmentdefinition.;onefilewillcontainthemainmodule:EXTRNSUBPROG1:FAREXTRNSUBPROG2:FARPUBLIC.;declaredataheretobeshared;-STSEGSEGMENTPARASTACKSTACKDW64DUP(?)STSEGENDS;-DTSEGSEGMENTPARADATA;definedatahereDTSEGENDS;-,CODSEG_ASEGMENTPARACODEMAINPROCFARASSUMECS:CODSEG_A,DS:DTSEG,SS:STSEGMOVAX,DTSEGMOVDS,AX.CALLSUBPROG1;callsubprogCALLSUBPROG2;callsubprog.MOVAH,4CHINT21HMAINENDPCODSEG_AENDSENDMAIN,;-andinanotherfile:SUBPROG1PROGRAM-EXTRN.;declaredatathatisdefinedexternallyPUBLICSUBPROG1;declareproceduresthatarecalledexternallyCODSG_BSEGMENTPARACODESUBPROG1PROCFARASSUMECS:CODSG_B;theinstructionsthatperformtheworkofthe;subroutinegohereRETSUBPROG1ENDSCODSG_BENDSEND,注意:1.EXTRN在调用其他模块的过程中,必须用伪指令EXTRN告诉汇编程序EXTRN后的过程或变量不在此模块中。2.PUBLIC在说明变量或过程的模块中,必须用伪指令PUBLIC告诉链接程序此变量或过程能被其他模块所访问。3.CALL4.RET5.C:LINKPROGRAM1.OBJ+PROGRAM2.OBJ+PROGRAMn.OBJ,5.4汇编语言程序设计的基本方法5.4.1程序设计步骤1.问题的定义2.算法及表示方法3.选择适当的指令4.编写程序5.4.2结构化程序设计1.顺序结构2.分支结构3.循环结构4.子程序设计,程序设计概述:写任何程序最成功的方式是先人工的解决问题:1、找出算法。用结构IFTHENELSE,CASE,REPEATUNTIL,WHILEDO,FORDO写算法,然后再将该算法翻译成一种合适的程序设计语言结构化的程序设计!2、建立算法使用的数据结构。,5.4.1程序设计步骤1.问题的定义仔细思考程序所要解决的问题,即用自然语言描述“做什么?以及程序做这些工作时的时序”如:1.从传感器读取温度值。2.加上调整因子。3.将结果存储在存储单元里。2.算法及表示方法用来表示程序设计问题的操作序列成为算法,即“怎样做?”。表示方法:1)流程图2)伪指令,3.选择适当的指令(按功能),一、数据传送类指令二、算术运算指令三、位操作指令四、串操作指令五、程序转移指令六、处理机控制指令,4.编写程序(从算法到程序)将算法转换成汇编语言(1)建立算法使用的数据结构1)数据在哪儿?(存放在存储器还是在寄存器中?)2)数据类型是什么?(字节、字或双字?)3)数据结构是什么?(单个数据、一维、二维数组?)4)数据为无符号数还是符号数?(2)在代码段开始处写出变量、段寄存器、外围设备等所需要的初始化指令。初始化表:数据段寄存器DS堆栈段寄存器SS,附加段寄存器ES堆栈段指针SP8255A可编程并行端口8259A优先级中断控制器8254可编程计数器8251可编程串行端口初始化数据变量设置中断允许标志(3)选择实现算法中每一主要动作所需要的指令,并决定数据在这些指令中的存放形式。(4)按照主要指令的要求,用MOV指令或其他的指令把数据送到正确的位置。,例题:1.定义问题:已知某日的最高温度和最低温度,要求计算这一天的平均温度。2.算法设计:最高温度加最低温度将和除以2得到平均温度3.数据结构:DATASEGMENTHI_TEMPDB92H;实际值可能是从传感器读取的数值LO_TEMPDB52HAV_TEMPDB?DATAENDS4.初始化表:MOVAX,DATAMOVDS,AX,5.选择指令:选择算法中每一主要动作所需的指令(按功能选择指令),并决定数据在这些指令中的存放形式,最后则按照指令的要求,用MOV或其他的指令把数据传送的正确的位置。ADDdest,source;查指令表并阅读细节ADCdest,source;dest=dest+source+CFDIVsource;DIV02immedmodenotallowed!6.编写程序:DATASEGMENTHI_TEMPDB92HLO_TEMPDB52HAV_TEMPDB?DATAENDS,CODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVAL,HI_TEMPADDAL,LO_TEMPMOVAH,00HADCAH,00HMOVBL,02DIVBLMOVAV_TEMP,ALMOV4CHINT21HMAINENDPCODEENDSENDMAIN,5.4.2结构化程序设计1.顺序结构ReadtemperaturefromsensorAddcorrectionfactorof+7Storecorrectedvalueinmemory,例题:1.定义问题:将ASCII码47转换成压缩BCD码。2.算法设计:转换第一个ASCII码到非压缩BCD数。转换第二个ASCII码到非压缩BCD数。将第一个BCD数的低半字节左移四位。在一个字节中组合两个BCD数。3.数据结构:DATASEGMENTVAL_ASCDB47VAL_BCDDB?DATAENDS,4.初始化表:MOVAX,DATAMOVDS,AX5.选择指令:1)用AND指令完成屏蔽操作。ANDdest,sourceASCII400110100屏蔽00001111结果000001002)用循环位移指令左移四位。ROLdest,CL3)用OR指令组装字节ORdest,sourceORAL,BL,6.编写程序:KeyASCIIUnpackedBCDPackedBCD434000001007370000011101000111(47H);-ORG0010HVAL_ASCDB47VAL_BCDDB?;-MOVAX,WORDPTRVAL_ASCANDAX,0F0FHXCHGAH,ALMOVCL,4ROLAH,CLORAL,AHMOVVAL_BCD,AL;-,2.分支结构(IF-THEN-ELSE),问题定义:有一台控制印刷线路板制造机器的8086微机。其作用是检查温度传感器,然后按照从传感器读到的温度值打开绿灯或黄灯。如果温度低于300C,则打开黄灯以告诉操作员溶液的温度不够。如果温度高于或等于300C,则打开绿灯。算法设计:输入温度值IF温度300CTHEN打开黄灯ELSE打开绿灯读传感器,3.数据结构:AL(INAL,DX)4.初始化表:MOVDX,0FFFEH;pointDXtoportcontrolMOVAL,99H;registerandloadcontrolwordOUTDX,AL;toinitializeports5.选择指令:INCMPJccOUT6.编写程序:,;PORTS:UseFFF8H-temperatureinput;FFFAH-lampcontroloutput(yellow=bit0,green=bit1)CODESEGMENTASSUMECS:CODE;initialize8086portFFFAHasoutputport,FFF8Hasinput.MOVDX,0FFFEH;pointDXtoportcontrolMOVAL,99H;registerandloadcontrolwordOUTDX,AL;toinitializeportsMOVDX,0FFF8HINAL,DXCMPAL,30JBYELLOW;iftemp30thenlightyellow;lampJMPGREEN;elselightgreenlamp,YELLOW:MOVAL,01H;loadcodetolightyellowlampMOVDX,0FFFAH;pointDXatoutputportOUTDX,AL;sendcodetolightyellowlampJMPEXIT;gotonextmainlineinstructionGREEN:MOVAL,02HMOVDX,0FFFAHOUTDX,ALEXIT:MOVDX,0FFFCH;nextmainlineinstructionINAL,DX;readphsensorCODEENDSEND,输入温度值IF温度=300CTHEN打开绿灯ELSE打开黄灯读传感器,CMPAL,30JAEGREENJMPYELLOWGREEN:MOVAL,02HMOVDX,0FFFAHOUTDX,ALJMPEXITYELLOW:MOVAL,01HMOVDX,0FFFAHOUTDX,ALEXIT:MOVDX,0FFFCHINAL,DXCODEENDSEND,2.多重IF-THEN-ELSE结构:IFconditionTHENstatement(s)1ELSEIFconditionTHENstatement(s)2ELSEstatement(s)3,问题定义:有一台控制印刷线路板制造机器的8086微机。其作用是检查温度传感器,然后按照从传感器读到的温度值打开绿灯、黄灯或红灯。如果温度低于300C,则打开黄灯以告诉操作员溶液的温度不够。如果温度高于或等于300C但低于400C,则打开绿灯,否则,打开红灯。算法设计:输入温度值IF温度=100thenJAEHEATER_OFF;turnheateroff,MOVAL,01H;elseloadcodeforheateronMOVDX,0FFFAH;pointDXtooutputportOUTDX,AL;turnheateronJMPTEMP_IN;WHILEtemp100read;tempagainHEATER_OFF:MOVAL,00H;loadcodeforheateroffMOVDX,0FFFAH;pointDXtooutputportOUTDX,AL;turnheateroffCODEENDSEND(a)加热器控制程序清单,算法设计(b)输入温度值WHILE温度100DO打开加热器关闭加热器,TEMP_IN:MOVDX,0FFF8HINAL,DXCMPAL,100JBHEATER_ONJMPHEATER_OFFHEATER_ON:MOVAL,01HMOVDX,0FFFAHOUTDX,ALJMPTEMP_INHEATER_OFF:MOVAL,00HMOVDX,0FFFAHOUTDX,ALCODEENDSEND,3.循环结构:REPEATUNTILREPEAT动作UNTIL某些条件实现REPEATGetdatasamplefromsensorAddcorrectionof+7StoreresultinamemorylocationWait1hourUNTIL24samplestaken,例1:1)问题定义:许多与微机接口的系统的工作是首先在并行信号线上输出数据,然后再输出以单独信号用以指示有效数据在并行线上。这个数据准备信号通常被称为选通。一个ASC编码计算机键盘就是一种选通数据系统的例子。下图说明了这种键盘的并行数据线和选通线是怎样与微机端口连接的。当在键盘上敲入某个键时,键盘中的电路将检测敲入的键,然后将该键的ASC码发送到连接端口FFF8H的8位数据线上。当经过一段时间数据已驻留在这些数据线上后,键盘中的电路发出一个压键选通信号,以指示8位数据线上的数据已经有效。选通信号可以是有效高信号或有效低信号。对于本例假设一个有效ASC码已在并行数据线上时,选通信号趋向于高。,2)算法设计REPEAT读键盘选通信号UNTIL选通信号=1从键盘读ASCII码,3)数据结构AL(INAL,DX)4)初始化表MOVDX,0FFFAH;pointDXatstrobeport5)选择指令INJccIN6)编写程序,;usesFFFAH-StrobesignalinputonLSB;FFF8H-ASCIIdatainputportCODESEGMENTASSUMECS:CODEMOVDX,0FFFAH;pointDXatstrobeportLOOK:INAL,DX;readkeyboardstrobeANDAL,01;maskextrabitsandsetflagsJZLOOK;ifstrobeislowthenkeeplookingMOVDX,0FFF8H;elsepointDXatdataportINAL,DX;readinASCIIcodeCODEENDSEND,例2:1)问题定义要求把通货膨胀因子03H加入到具有8个元素价格数组的每个价格中,而其中每一个价格是以压缩式BCD(每个字节中有两个BCD数)形式存放在一个字节存储单元中,价格的范围在1到99分之间。,2)算法设计:REPEAT从数组中得到一价格加入通货膨胀因子结果调整为正确的BCD数将结果放回数组中UNTIL所有价格均已处理,ARRAYSSEGMENTCOSTDB20H,28H,15H,26H,19H,27H,16H,29HPRICEDB36H,55H,27H,42H,38H,41H,29H,39HARRAYSENDS4)初始化表MOVAX,ARRAYSMOVDS,AX,3)数据结构,5)选择指令:MOVADDDAAJcc6)编写程序:,ARRAYSSEGMENTCOSTDB20H,28H,15H,26H,19H,27H,16H,29HPRICEDB36H,55H,27H,42H,38H,41H,29H,39HARRAYSENDSCODESEGMENTASSUMECS:CODE,DS:ARRAYSSTART:MOVAX,ARRAYSMOVDS,AXLEABX,PRICESMOVCX,0008H,DO_NEXT:MOVAL,BXADDAL,03HDAAMOVBX,ALINCBXDECCXJNZDO_NEXTCODEENDSENDSTART,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!