




免费预览已结束,剩余131页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第4章汇编语言程序设计,目录,主要内容:,4.1汇编语言和汇编程序4.2汇编语言程序规范4.3伪指令4.5宏指令4.6汇编语言程序设计,机器语言:二进制数形式的指令和数据。助记符:用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆。汇编语言:指令助记符、符号地址、标号、伪指令等语言元素的集合及这些元素使用的规则。汇编语言源程序:用汇编语言编写的程序。,4.1汇编语言和汇编程序,汇编程序,源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,汇编源程序需翻译成机器语言(变成可执行文件,机器才能执行)这个翻译过程叫汇编。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,汇编语言程序设计与执行过程,汇编语言源程序源文件.ASM汇编(编译)目标文件.OBJ链接可执行文件.EXE调试最终程序.EXE,MASM1.ASM,LINK1.OBJ,DEBUG1.exe,4.2汇编语言程序规范,分段结构语句的类型语句的构成与规范数据项与表达式,作业:4-24-3(用表格形式),1.分段结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:数据段存放数据、变量堆栈段堆栈区域代码段存放程序指令,示例,stackSEGMENTPARAstackDB100DUP(stack)stackENDSdataSEGMENTdataENDScodeSEGMENTASSUMECS:code,DS:data,SS:stackstart:MOVAX,dataMOVDS,AXMOVES,AXMOVAL,4CHINT21HcodeENDSENDstart,堆栈段,数据段,代码段,2.语句的类型,指令语句:由指令助记符构成,汇编后将产生相应的机器代码构成的目标程序,供CPU执行。伪指令语句:为汇编程序和链接程序提供一些必要控制信息的、由伪指令构成的管理性语句。宏指令语句:为程序简洁,将一组反复出现的指令集中定义为一条宏指令,汇编后还原为这组指令对应的目标代码。,3.语句的构成与规范,汇编语言程序的每个语句由4个域构成:标号、名字操作符操作数;注释标号名字域:标号指令的符号地址,用来代表指令在存储器中的地址。标号后应加上冒号。名字段、过程、变量的名字,用来代表它们在存储器中的地址。名字后不加冒号。,示例,语句的构成与规范,操作符域:指令、伪指令、宏指令助记符。操作数域:即指令的操作对象。可以有0个、1个或2个。操作数之间以逗号分隔。形式:寄存器、存储单元、常数或表达式。注释域:以分号开头,用来说明程序的功能、分段,以便阅读和理解。汇编时不予处理。,示例,汇编语言的一个实例:hello.asmdataSEGMENTHelloDBHello,world!,0DH,0AH,$dataENDSprogSEGMENTASSUMECS:prog,DS:datastart:MOVAX,dataMOVDS,AXLEADX,hello;取字符串首地址MOVAH,9INT21H;显示字符串MOVAH,4CHINT21H;退回DOSprogENDSENDstart,4.数据项与表达式,常量标号变量表达式,常量没有属性的纯数,二进制数:以B结尾,如01001101B。十进制数:如85,或以D结尾。十六进制数:以H结尾,第1个数字为A-F时,前面应加0,如0F160H,否则被误会是标识符。字符串:用单引号括起来的1个或多个字符,每个字符的ASCII码值构成。如256,汇编时被翻译成ASCII码323536H,而不是256。,标号:指令语句的名字也是其符号地址。标号有3个属性:段地址:即标号所在段的段地址;偏移量:标号所代表存储单元的段内偏移地址;类型:NEAR(段内引用)或FAR(段外引用)常作为转移指令的转移地址,标号,变量,变量:存于内存单元中的数据,可被程序改变变量名:是变量的符号地址变量也有3个属性:段地址:变量所在段的段地址偏移量:变量单元地址与段首址间的位移量。类型:有BYTE、WORD和DWORD三种,由定义变量的伪指令确定。变量与标号统称为存储器操作数。,标号和变量名的使用规则,组成:A-Za-z0-9?._$不能以数字开头,句号(.)只能作首字符长度小于31个字符不能与保留字(指令助记符、伪指令、预定义符号等)重名不能重复定义例:正确:LP1,AGAIN,NEXT,_GO,OK_1错误:4M,LOOP,AAA,#HELP,+ONE,表达式,表达式:由常数、寄存器名、标号、变量与一些运算符的组合而成。运算符有6类:算术运算符逻辑运算符关系运算符分析运算符综合运算符属性运算符,优先级别,算术运算符+、-、*、/、MOD、SHL、SHR,完成整数的算术运算,结果也是整数。注意:地址运算要求两个地址要在同一段内,只有加、减法运算才有实际意义。用于数字表达式:MOVAX,4*1024;汇编后的形式为:MOVAX,4096用于地址表达式:LEASI,TAB+3;若TAB的偏移地址为1000H,汇编后的形式为:LEASI,1003H,求余、左移、右移,例4-1一个程序片断:DATASEGMENTVRDB1,3,5,6DATAENDSCODESEGMENTMOVAH,VR+2;将VR+2单元内容5AHMOVAL,3*10-20;将表达式值10ALMOVBH,10MOD3;将表达式值1BHMOVBL,01010BSHL1;左移1次得14HBL,逻辑运算符AND、OR、XOR、NOT,逻辑运算符只能用于数值表达式中。例:MOVCL,36HAND0FH经汇编后:MOVCL,06H注意:不要把逻辑运算符与逻辑运算指令混淆:例:ANDAX,3FC0HAND0FF00H汇编后源操作数被翻译为:3F00H,所以上述指令与ANDAX,3F00H等价。,关系运算符EQ、NE、LT、GT、LE、GE,关系运算的结果是一个逻辑值:真或假关系为真,结果为全1关系为假,结果为全0例:MOVBX,PORTGT300H若PORT值小于300H,则汇编后为:MOVBX,0否则汇编后为:MOVBX,0FFFFH,分析运算符,取地址运算符SEG、OFFSET取值运算符TYPE、LENGTH、SIZE,SEG:取变量/标号的段地址OFFSET:取变量/标号的偏移地址例:VARDB12HMOVBX,OFFSETVAR;取变量VAR的偏移地址MOVAX,SEGVAR;取变量VAR的段地址;若VAR在当前使用数据段中,则:AX=DS,取地址运算符SEGOFFSET,取值运算符TYPE、LENGTH、SIZE,TYPE:取变量/标号的类型(1,2,4,-1,-2)LENGTH:取变量的长度(变量中元素的个数)SIZE:取变量在存储区的字节数(=TYPE*LENGTH)例如:V1DB2AH,3FHV2DW10DUP(1,?,2)V3DW12DUP(?)注意:LENGTH和SIZE对重复操作数DUP定义的数组逗号隔开的第一项有效,如V2;在如V1变量,对逗号隔开的第一项有效;都符合SIZE=TYPE*LENGTH。,DBBWDDNEARFAR,;LENGTH=1,SIZE=1;LENGTH=10,SIZE=20;LENGTH=12,SIZE=24,DATASEGMENTV1DB2AH,3FHV2DW2A3FH,3040HV3DD12345678H,12ABCDEFHV4DW20DUP(1,4,2DUP(?)DATAENDS,例:下面定义的数据段DATA,从40000H开始。,MOVAX,SEGV1MOVBX,SEGV2MOVCX,SEGV3同属一段,段基址相同。,MOVAX,OFFSETV1MOVBX,OFFSETV2MOVCX,OFFSETV3偏移地址分别为0,2,6。,MOVAX,TYPEV1MOVBX,TYPEV2MOVCX,TYPEV3类型值分别是1,2,4。,MOVAX,LENGTHV4MOVBX,SIZEV4长度和字节数分别是20,40。MOVAH,LENGTHV1MOVAL,SIZEV1MOVBH,LENGTHV2MOVBL,SIZEV2MOVCH,LENGTHV3MOVCL,SIZEV3只对第一项有效。,AH=1AL=1BH=1BL=2CH=1CL=4,属性运算符PTR,用来改变或建立地址操作数的新类型。格式:PTR类型BYTE,WORD,DWORD,NEAR,FARBYTE、WORD、DWORD描述数据存储单元(变量)地址NEAR、FAR描述转移、调用(标号)的目的地址,例:MOVBYTEPTRDI,0;字节类型MOVWORDPTRDI,0;字类型MOVDI,0B5H;类型不定PTR也可用来进行强制类型转换例:STR1DW2345H;STR1定义为字类型MOVAX,STR1;合法MOVAL,STR1;非法MOVAL,BYTEPTRSTR1;合法,与EQU配合,为汇编的下一个存储单元定义一个新的符号名,与下一个存储单元具有相同的地址。格式:THIS例:LABCEQUTHISBYTE;LABC为字节LABDDW4321H,3456H;LABD为字;LABC和LABD有相同的段首址和偏移地址MOVAL,LABC;AL=21HMOVAX,LABD;AX=4321H,指定新类型THIS,43H,56H,LABC,34H,21H,LABD,分析、综合运算符,分离运算符,算术运算符,关系运算符,逻辑运算符,段类型属性,4.3伪指令,数据定义伪指令符号定义伪指令标号定义伪指令段定义伪指令段寻址伪指令过程定义伪指令定位伪指令汇编结束,作业:4-4(存储示意图)4-5(存储示意图)4-74-11,1.数据定义及存储器分配伪指令,功能:为程序分配指定数目的存储单元。格式:变量名伪指令;注释数据项表为由逗号分隔的表达式组。常用的数据定义伪指令:DB字节(BYTE)变量,1个字节;DW字(WORD)变量,2个字节;DD双字(DWORD)变量,4个字节;DQ四字(QWORD)变量,8个字节;DT十字节(TBYTE)变量,10个字节。,例1字符,特殊操作数,例1:DATA_BDB10,5,10HDATA_WDW100H,-4DATA_DDD0FFFBH,DATA_B,DATA_W,DATA_D,10,5,10H,100H,-4,0FFFBH,汇编后的内存分配情况,字符串操作数定义:,字符串只能定义为字节DB或字DWDB定义如:STRDBHELLODW定义,串中只能有一个或两个字符例如:DWABC()如:DBAB;41H在低地址,42H在高地址DWAB;42H在低地址,41H在高地址当DW定义,字符串中有一个字符时例如:DWA;41H在低地址,高地址补0,操作数?:用来保留存储空间,但不置初值,为随机值。RSVDW?,?,?,?,?,?,?,?重复操作符DUP:变量名伪指令DUP(表达式)重复的数据可以使用重复操作符DUP,如上面RSV亦可写成:RSVDW8DUP(?)操作数$(也称程序计数器):其值为程序下一个分配的存储单元的偏移地址。,特殊操作数?DUP$,例:TABLEDB10DUP(?)BUFFERDWTABLE,$+3设TABLE的偏移地址为0080H,则汇编后:,2.符号定义伪指令EQU=,等值伪指令:EQU和等号伪指令:=格式:符号名EQU/=表达式表达式:常数、表达式、寄存器名、指令助记符注意:1.用”=”定义的符号可在任何时候进行重定义。2.用EQU定义的符号未清除前,不能重新定义。清除可用PURGE伪指令。3.二者均不占用存储空间,仅是给符号赋值。,例:FIVEEQU5COUNTEQUAXTENEQU10DIST=BYTEPTRSI+BPGOTO=JMPMOVAX,TENMOVCX,COUNTADDDIST,FIVEDIST=WORDPTRSI+BP+1ADDDIST,AXGOTOLABEL,定义,引用,3.标号定义伪指令LABEL,功能:用来定义变量或标号的新类型格式:变量(标号)名LABEL类型变量:BYTEWORDDWORD例如:VAR1LABELWORDVAR2DB20DUP(1)标号:NEARFAR例如:L1LABELFARL2:MOVAX,1000H,两变量具有相同的地址指针,两标号为同一指令的符号地址,THIS,4.段定义伪指令,定义一个段的基本格式:段名SEGMENT定位类型组合方式类别段名ENDS二者成对出现,段名应一致。段由SEGMENT开始,ENDS结束。对数据段和堆栈段中的语句一般是变量定义。对代码段则是指令语句。,1)定位类型,功能:说明如何确定逻辑段的边界。PAGE:逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应为00H。PARA(Paragraph):逻辑段从一个节(16个字节)的边界开始。段的起始地址应能被16整除,即段起始物理地址应为0H。默认类型BYTE:从字节边界开始,即从任何地址开始。WORD:从字边界开始,即段从偶地址开始。,2)组合类型,功能:说明不同模块中同名段的组合方式NONE:该段独立,与其他段无关。默认类型PUBLIC:所有同名同类型的段组合成一个逻辑段,公用一个段基址,运行时装入同一个物理段中。STACK:专用于说明堆栈段,同PUBLIC。COMMON:所有同名段同类型的段具有相同的段基址(后覆盖前),段长度取决于最长的COMMON段。AT:按绝对地址定位,数值表达式值(16位)就是段地址,不能用于代码段。MEMORY:该段位于被连接在一起的其他所有段之上。,3)类别,由编程者赋予该段的与段名不同的另外一种名字信息。功能:所有同类别段被安排在连续的存储区中。用单引号括起来的字符串。例:模块1中:seg1SEGMENTPARASTACKstackseg1ENDS模块2中:seg2SEGMENTPARASTACKstackseg2ENDS,5.段寻址伪指令,在代码段中用来设定各段名和段寄存器的关系格式:ASSUMECS:code,DS:data,ES:data语句中的code和data为段名。这个语句说明:1.CS将指向名字为code的代码段2.DS和ES将指向名字为data的数据段,注意:ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故需要以下语句:MOVAX,DATAMOVDS,AXMOVES,AX将段基址装入段寄存器。如果程序中用到堆栈段,则SS也需装入实际的初值。代码段基地址不需要程序员装入CS寄存器,而由OS(操作系统)负责装入。,堆栈段定义过程:STACKSEGMENTSTACKDW32DUP(?);段内留出32个字作为堆栈区TOSLABELWORD;TOS为字变量,偏移地址为0040HSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,STACKMOVSS,AX;堆栈段寄存器初始化MOVSP,OFFSETTOS;堆栈指针初始化,LABEL,6.过程定义伪指令,(1)定义过程(子程序)伪指令(2)近过程举例(3)同一模块远过程举例(4)连接伪指令:PUBLIC和EXTRN(5)不同模块远过程举例,(1)格式:过程名PROCNEAR/FARRET过程名ENDP(a)过程名:过程入口的符号地址。(b)PROC开始和ENDP结束,须成对出现。(c)过程的类型有2种:NEAR表示段内调用(默认类型)FAR表示段间调用(d)RET为过程返回主程序的出口语句。可放在中间或者结尾,但必须是最后执行的语句。(e)调用一个过程的格式为:CALL,几点说明:,DATASEGMENTAADW1234HBBDW5678HCCDW?DATAENDSMAINSEGMENTASSUMECS:MAIN,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,AAMOVBX,BB,(2)近过程举例:,CALLABCMOVAH,4CHINT21HABCPROCNEARMOVCX,BXADDCX,AXMOVCC,CXRETABCENDPMAINENDSENDSTART,DATASEGMENTAADW1234HBBDW5678HCCDW?DATAENDSMAINSEGMENTASSUMECS:MAIN,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,AAMOVBX,BBCALLFARPTRABC,(3)远过程(同一模块)举例:,MOVAH,4CHINT21HMAINENDSCODESEGMENTASSUMECS:CODEABCPROCFARMOVCX,BXADDCX,AXMOVCC,CXRETABCENDPCODEENDSENDSTART,(4)连接伪指令:PUBLIC和EXTRN,PUBLIC:模块前声明模块中变量、标号、符号常量和外部过程可供其他模块引用。没声明不能被其他模块引用例如:PUBLICAA,ABC;说明:此模块中定义的变量AA和子程序ABC可供其他模块使用。EXTRN:模块前给出此模块需要用到的变量、标号、符号常量和外部过程的属性。例如:EXTRNAA:WORD,ABC:FAR说明:此模块中要用到其他模块定义可公用的字变量AA,并需要调用子程序ABC。,EXTERN外部变量,公用符号伪指令,引用符号伪指令,EXTRNABC:FARDATASEGMENTCOMMONAADW0809HBBDW1234HDATAENDSMAINSEGMENTASSUMECS:MAIN,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,AAMOVCX,BBCALLABCMOVAH,4CHINT21HMAINENDSENDSTART,PUBLICABCDATASEGMENTCOMMONCCDW5678HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAABCPROCFARPUSHDSMOVAX,DATAMOVDS,AXMOVDX,CCPOPDSRETABCENDPCODEENDSENDABC,(5)远过程(不同模块)举例:,模块一,模块二,;,;,组合类型,组合类型,7.定位伪指令ORG,功能:指定某条语句或变量的偏移地址。格式为:ORG表达式的值作为下一条指令或变量的偏移地址。例:DATASEGMENTORG2VAR1DB2,3,4ORG$+3VAR2DW1234HDATAENDS,程序计数器$,功能:$的值为程序下一个所能分配的存储单元的偏移地址。例如:DATASEGMENTA1DB10H,20H,30HCEQU$-A1DATAENDS其中:$-A1的值为程序下一个所能分配的偏移地址03H减去A1的偏移地址00H,即$-A1=03H-00H=03H。,8.汇编结束,汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。格式:END启动标号或过程名启动标号:程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。告诉汇编程序源程序结束,并给出执行程序的入口地址,启动地址只有在主模块才有意义。,例子,举例,DATASEGMENTABDW1234HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,ABMOVBL,BYTEPTRABMOVAH,4CHINT21HCODEENDSENDSTART,例子,4.5宏指令,宏指定义宏调用举例宏调用与过程调用的区别取消宏指令,1.宏指令定义,功能:将一组重复使用的语句定义成一条宏指令格式:宏指令名MACRO形式参数表;宏体ENDM形式参数:在调用宏指令时用实在参数来代替。也可不设参数。程序中位置:放在汇编结束前的任何位置。,2.宏调用,例:两个数之和的宏定义和宏调用。宏定义:DADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AXENDM调用宏:DADDDATA1,DATA2,SUMDATA1,DATA2,SUM是实在参数,由它们替换定义中的X、Y、Z。,DATASEGMENTAADW1111HBBDW2222HCCDW?EEDW?DATAENDSDADDMACROX,Y,ZMOVAX,XADDAX,YMOVZ,AXENDM,3.举例:,MAINSEGMENTASSUMECS:MAIN,DS:DATASTART:MOVAX,DATAMOVDS,AXDADDAA,BB,CCMOVAX,CCDADDAA,CC,EEMOVBX,EEMOVAH,4CHINT21HMAINENDSENDSTART,4.宏调用与过程调用区别:,执行形式:宏命令伪指令由宏汇编程序在汇编过程中处理,而过程调用由CPU执行。汇编结果:宏命令伪指令汇编后被展开。执行速度:宏命令执行速度较快(因无调用转移)占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程可以节省代码占用的内存空间。,5.取消宏指令,宏指令定义后,在整个程序中有效。若宏指令与指令或伪指令名字相同,则宏指令优先,同名指令或伪指令失效。功能:取消宏指令,使指令或伪指令恢复。格式:PURGE,4.6汇编语言程序设计,4.5.1程序设计步骤4.5.2汇编语言上机过程4.5.3源程序的基本结构,4.5.1程序设计步骤,根据实际问题抽象出数学模型,确定算法画出程序框图(流程图)分配内存工作单元和寄存器根据框图编写源程序,存成.ASM文件对源程序汇编,生成.OBJ目标文件把.OBJ文件连接,生成.EXE执行文件运行、调试,12,绘制程序框图(流程图),(1)用方框表示工作框,框中标明要完成的功能,(2)用菱形框表示判断框,框中标明比较、判断和条件,绘制程序框图(流程图),(4)各框之间用直线连起来表示程序走向。,框中标明子程序名字(入口参数等),(3)用框表示调用子程序或过程。,开始,结束,4.5.2汇编语言上机过程,用EDIT,TXT等任何文本编辑器。源程序存为.ASM文件,用MASM宏汇编程序进行汇编。汇编后生成.OBJ目标文件。格式:MASM,用LINK进行连接,生成.EXE可执行文件格式:LINK;,用TD、DEBUG等调试程序进行调试。格式:DEBUG,4.5.3源程序的基本结构,基本结构介绍顺序结构与简单程序设计条件结构与分支程序设计循环结构与循环程序设计子程序结构与子程序设计,基本4-13分支4-18排序4-24循环4-25,1.基本结构介绍,(1)顺序结构(2)分支结构(条件选择)(3)循环结构,结构定理(1966年):任何程序都可以由3种基本结构程序构成结构化程序。每一个结构只有一个入口和一个出口,3种结构的任意组合和嵌套就构成了结构化的程序。,Boehm和Jacobi,鲍赫门和加柯皮,Bohm和Jacopini,(1)顺序结构,(2)分支结构(条件选择),IFTHEN结构IFTHENELSE结构CASE结构,IFTHEN结构,程序结构:TEST/CMP指令条件转移指令(Jx标号)处理体标号:其他指令,程序结构:TEST/CMP指令Jx标号1处理体P1JMP标号2标号1:处理体P2标号2:其他指令,IFTHENELSE结构,CASE结构,TEST/CMP指令(条件1)Jx标号1处理体P1JMP标号n+1标号1:TEST/CMP指令(条件2)Jx标号2处理体P2JMP标号n+1标号2:标号n-1:TEST/CMP指令(条件n)Jx标号n处理体PnJMP标号n+1标号n:处理体Pn1标号n+1:(公共出口),程序结构:,(3)循环结构,DOUNTIL结构DOWHILE结构,DOUNTIL结构,初始化,循环体,循环控制,继续循环?,Y,N,先执行,再判断条件。工作部分至少执行一次。,DOWHILE结构,初始化,循环体,循环控制,继续循环?,Y,N,先判断条件,再执行。工作部分有可能一次都不执行。,2.顺序结构与简单程序设计,顺序结构的程序,指令逐条依次被执行,指令指针IP内容为线性增加。顺序结构指令:传送类、运算类和移位类。介绍两个简单功能:表达式程序查表程序,表达式程序,例4-12编程计算:z=(x2-3y)/2设x,y为单字节正整数,结果z用2个字节来存放。程序段1、2,结束,开始,(X-3Y)/2Z,2,X*X,3*Y,源程序如下:DATASEGMENT;数据段XDB25;变量XYDB32;变量YZDW?;变量ZDATAENDS;数据段结束CODESEGMENT;代码段ASSUMECS:CODE,DS:DATA;段寻址EXPREPROCFAR;定义子程序START:PUSHDS;保护返回地址SUBAX,AXPUSHAXMOVAX,DATAMOVDS,AX;初始化DS,;子程序起始说明,MOVAH,0MOVAL,XMULAL;X*XMOVBH,0MOVBL,YMOVCX,BXADDBX,BXADDBX,CX;3*YSUBAX,BX;X*X-3*YSHRAX,1;除2MOVZ,AX;存结果RET;返回调用程序EXPREENDP;子程序结束CODEENDS;代码段结束ENDSTART;汇编结束,程序起始说明:,PUSHDS;保存返回代码段段首地址XORAX,AX;AX清零PUSHAX;保存返回偏移地址,当单独运行子程序时,以上三条指令保存返回地址,和RET配合使用,以保证程序正常退出。当执行RET时,便将PUSHAX入栈的0偏移地址和由PUSHDS入栈的(DS)分别弹回IP和CS中,而由(DS)所指向的正是程序段前缀PSP。程序开始执行时DS及ES都指向PSP,在PSP入口处存放着一条INT20H。INT20H:单独执行子程序时,执行RET时自动调用此中断,返回DOS。,主程序调用子程序中,程序段前缀PSP格式:,查表程序,功能:可以直接调用汇编语言不支持的平方、立方、方根、超越及三角函数等。解决输入与输出无一定算法关系的代码转换问题。关键:组织表格。方法:利用表格首址加索引值得到结果地址。通常索引就是被查询的数值。,例4-13利用查表求Y=X3,设X放在数据区XVAL单元,结果存入YVAL单元。立方表放在从TABLE开始的单元。解:立方表按03,13,23,63的顺序存放。设X3表的单元地址为TABLE+X。源程序如下:,DATASEGMENT;数据段TABLEDB0,1,8,27,64,125,216XVALDB6YVALDB?DATAENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AX,23,LEABX,TABLE;BX指向表首址MOVAH,0;被查数作索引值MOVAL,XVAL;6AL(AX)ADDBX,AX;移动指针到查表位置MOVAL,BX;查表MOVYVAL,AL;存结果MOVAH,4CHINT21H;返回DOSCODEENDS;代码段结束ENDSTART;汇编结束,23,TABLE+X,LEABX,TABLE;BX指向表首址MOVAH,0;被查数作索引值MOVAL,XVAL;6AL(AX)ADDBX,AX;移动指针到查表位置MOVAL,BX;查表MOVYVAL,AL;存结果可用查表转换指令XLAT,此程序段可简化为:LEABX,TABLE;BX指向表首址MOVAL,XVAL;被查数作索引值XLAT;查表转换MOVYVAL,AL;存结果,23,查表程序段,3.条件结构与分支程序设计,实现分支的要素:使用能影响状态标志的指令。使用条件转移类指令对状态位进行测试判断,确定如何转移,形成分支。分类:两路分支例4-14三路分支例4-15多路分支例4-16,两路分支,用一条条件转移语句就可实现两路分支:,例4-14比较两个数,选出其中大者存AL寄存器。MOVAL,BX;取前一个元素到ALINCBX;指向后一个元素CMPAL,BX;两数比较,设置CFJAEBIGER;前一个后一个,CF=0转EXCH:MOVAL,BX;否则,取后一个到ALBIGER:.,程序片段:,NEXT,三路分支,连续使用两条条件转移指令可实现三路分支:,例4-15编程计算下面函数,X取值范围:-128127。,Y-1,X(AL),X0?,X0?,Y0,Y1,Y,N,源程序12,N,Y,源程序如下:DATASEGMENT;数据段XDB-3;定义XYDB?DATAENDS;数据段结束CODESEGMENT;代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AX,12,MOVAL,X;XALCMPAL,0;X与0比较JGEBIGER;X0,转BIGERMOVAL,0FFH;X0,-1送ALMOVY,AL;-1送Y单元JMPNEXT;返回BIGER:JEEQUL;X=0,转EQULMOVAL,1;X0,1送ALMOVY,AL;1送Y单元JMPNEXT;返回EQUL:MOVY,AL;0送Y单元NEXT:MOVAH,4CHINT21H;结束程序,返回DOSCODEENDSENDSTART,12,MOVAL,X;XALCMPAL,0;X与0比较JGEBIGER;X0,转BIGERMOVAL,0FFH;X0,-1送ALJMPEQUL;存Y并结束BIGER:JEEQUL;X=0,存Y并结束MOVAL,1;X0,1送ALEQUL:MOVY,AL;存YNEXT:MOVAH,4CHINT21H;结束程序,返回DOSCODEENDSENDSTART,亦可:,多路分支,采用CASE结构,使用跳跃表法。将每个子程序的入口地址按顺序放在连续的单元内,构成跳跃表,也称地址表。,例4-16用跳跃表法编写一个多路分支程序。假设有10个例行程序,入口地址分别为R0,R1,R2,R9依次放在ADRTAB开始的地址表内,每个地址占两个字节,低字节在前,高字节在后。当键盘键入09中任一数字时,便可分支到相应的例行程序去执行。,程序框图,结束,开始,编号i(AL),求查表地址(AX)(BX)+2*I,(AX)=?,R0,R1,R9,i=0,i=1,i=9,DONE,(BX)ADRTAB,(BX)+2*i(AX),例行程序入口地址表,程序框图,源程序12,DATASEGMENT;数据段ADRTABDWR0,R1,R2,R3,R4,R5,R6,R7,R8,R9DATAENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AX,12,MOVAH,01INT21H;从键盘输入数字i的ASCII码ALMOVAH,0;去掉(AH)中的01ANDAL,0FH;AL中留后4位对应0-9ADDAL,AL;2*(AL)LEABX,ADRTAB;求表首地址ADDBX,AX;表首址偏移地址=数字i地址MOVAX,BX;将地址给AXJMPAX;转到分支中(AX内容对应Ri)R0:R1:R9:MOVAH,4CHINT21HCODEENDSENDSTART,;10个例行程序,12,MOVAH,01INT21H;从键盘输入数字i的ASCII码ALMOVAH,0;去掉(AH)中的01ANDAL,0FH;AL中留后4位对应0-9ADDAL,AL;2*(AL)LEABX,ADRTAB;求表首地址ADDBX,AX;表首址偏移地址=数字i地址JMPWORDPTRBX;转到分支中(对应Ri)R0:R1:R9:MOVAH,4CHINT21HCODEENDSENDSTART,;10个例行程序,12,亦可:,4.循环结构与循环程序设计,典型循环程序循环结构程序的组成循环结构程序的基本形式循环结构程序的举例,例4-17编程求S=i,并将S存入SUM单元。解:用循环结构完成,累加和计数到100,循环结束。程序框图如下:,开始,和清零:0AX设计数初值:100CX,结束,求和:(AX)(AX)+(CX),计数=0?,计数:(CX)(CX)-1,求和:SUM(AX),N,Y,源程序12,源程序如下:DATASEGMENT;数据段SUMDW?DATAENDS;数据段结束;CODESEGMENT;代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AX,12,MOVAX,0MOVCX,100AGAIN:ADDAX,CXDECCXJNEAGAINMOVSUM,AX;MOVAH,4CHINT21H;CODEENDSENDSTART,12,开始,和清零:0AX设计数初值:100CX,结束,求和:(AX)(AX)+(CX),计数=0?,计数:(CX)(CX)-1,求和:SUM(AX),N,Y,循环结构程序4部分组成,初始化部分:设置初态,包括循环工作部分和结束条件初态。如:地址指针、计数初值、变量初值。循环处理部分:循环结构的核心,需多次执行。循环控制部分:实现对循环的控制。控制条件有:用计数控制循环:循环次数已知。用LOOP指令用条件控制循环:最大循环次数已知,用条件使循环提前结束。用LOOPZ/LOOPE等指令。循环结束部分:结果存储或输出,可能在循环体中。,例如,开始,和清零:0AX设计数初值:100CX,结束,求和:(AX)(AX)+(CX),计数=0?,计数:(CX)(CX)-1,求和:SUM(AX),N,Y,初始化部分,循环处理部分,循环控制部分,循环结束部分,循环结构程序的基本形式,两种基本形式:“先执行,后判断”结构(DO_UNTIL)进入循环先执行一次循环体,再判断是否结束。“先判断,后执行”结构(DO_WHILE)进入循环先判断循环结束条件,再由判断结果决定是否执行循环体。也称“可零迭代循环”。,循环结构程序的举例,“先执行,后判断”结构(DO_UNTIL)例4-18“先判断,后执行”结构(DO_WHILE)例4-19,例4-18编程求10个字的和S,S=Xi,并将S存入SUM单元,设和S32767(即:S为字)。解:程序需设地址指针,并不断修改它。源程序如下:,i=0,9,DATASEGMENT;数据段BLOCKDW0028H,0139H,1005H,2133H,00A5HDW3010H,123CH,2AC5H,3300H,1122HCOUNTEQU($-BLOCK)/2;计算个数SUMDW?DATAENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AX,2,程序框图,开始,设指针BX、和AX清零设计数初值:10CX,结束,求和:(AX)(AX)+BX,计数=0?,计数:(CX)(CX)-1,求和:SUM(AX),N,Y,初始化部分,循环处理部分,循环控制部分,循环结束部分,例4-18编程求10个字的和S,S=Xi,并将S存入SUM单元,设和S32767(即:S为字)。程序框图:,i=0,9,指针:(BX)(BX)+2,MOVAX,0LEABX,BLOCKMOVCX,COUNTAGAIN:ADDAX,BXINCBXINCBXDECCXJNZAGAINMOVSUM,AXMOVAH,4CHINT21HCODEENDSENDSTART,开始,设指针BX、和AX清零设计数初值:10CX,结束,求和:(AX)(AX)+BX,计数=0?,计数:(CX)(CX)-1,求和:SUM(AX),N,Y,指针:(BX)(BX)+2,例4-19在内存的字单元X中有一个16位的二进制数。编写程序统计X单元中含1的个数,并存入RESULT单元。解:采用DO_WHILE结构。程序框图,DATASEGMENT;数据段XDW31A0HRESULTDW?DATAENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AX,2,开始,初始化:X(AX)计数初值:0(CX),结束,(AX)左移1位,计数:(CX)(CX)+1,Y,(AX)=0?,RUSULT(CX),(CF)=1?,N,Y,N,例4-19程序框图,MOVAX,XMOVCX,0AGAIN:ANDAX,AXJZEXITSHLAX,1JNCAGAININCCXNEXT:JMPAGAINEXIT:MOVRESULT,CXMOVAH,4CHINT21HCODEENDSENDSTART,开始,初始化:X(AX)计数初值:0(CX),结束,(AX)左移1位,计数:(CX)(CX)+1,Y,(AX)=0?,RUSULT(CX),(CF)=1?,N,Y,N,5.子程序结构与子程序设计,子程序概述子程序设计与调用实例子程序嵌套例:延时子程序,(1)子程序概述,子程序:定义PROC/ENDP;调用CALL;返回RET调用程序与子程序:主程序也称调用程序子程序嵌套:子程序也可调用下层子程序递归调用:子程序调用自己。子程序说明:子程序的调用方法说明。保护现场:对子程序中用到的寄存器进行保护。参数传递方法,子程序说明,作用:用户可根据说明调用子程序,不必读懂子程序格式:以注释形式写在程序的开头,每行以“;”开始内容:子程序目的:包括名称、功能和性能指标等子程序入口、出口参数所用寄存器和存储单元所调用的其他子程序调用实例(选用项),子程序说明实例,;子程序DTOB:将两位组合BCD数转换成二进制;执行时间:0.06ms;入口参数:AL=待转换的BCD数;出口参数:CL=转换得到的二进制数;所用寄存器:BX;调用方式:CALLDTOB,保护现场,若在子程序中需要用到主程序中正在使用的寄存器,(入口和出口参数用到的寄存器除外)需要进行保护和恢复操作:在子程序开始时,对这些寄存器进行入栈保护;在子程序返回前,将保护在堆栈中的寄存器值弹出堆栈。,参数传递方法,寄存器传送:用于传递参数不多的情况。堆栈传送:调用程序和子程序在同一堆栈中存放处理数据和结果。公用数据区传送:调用程序和子程序在同一公用数据区中存放处理数据和结果。参数表传送:调用前建立一个参数表。参数表多建立在内存或外设端口中。,(2)子程序设计与调用实例,例4-22设计一个求累加和的子程序,并进行调用。设累加和是对任意字数组进行的。解:采用公用数据区传送方法。设待求和数组为RAY,可包含任意个字;子程序求得的累加结果存入SUM及SUM+2两个字单元。源程序如下:,DATASEGMENTARYDW3456H,8932H,5763H,7462H,0ABCHCOUNTEQU($-ARY)/2SUMDW?,?DATAENDS,234,CODESEGMENT;代码段ASSUMECS:CODE,DS:DATAMAIN:MOVAX,DATA;主程序MOVDS,AXCALLFARPTRROUTADDMOVAH,4CHINT21HROUTADDPROCFAR;子程序PUSHAX;保护现场PUSHCXPUSHDXPUSHSILEASI,ARY;SI指向ARY首址MOVCX,COUNT;设计数初值XORAX,AX;清和XORDX,DX;DX存放进位,23,CACULS:ADDAX,SI;加JNCCOUPT;CF1转COUPTINCDX;CF=1,DX存进位COUPT:ADDSI,2;修改指针LOOPCACULS;循环至CX=0MOVSUM,AX;存和MOVSUM+2,DX;存进位POPSI;恢复现场POPDXPOPCXPOPAXRET;返回ROUTADDENDP;子程序结束CODEENDS;代码段结束ENDMAIN;汇编结束,23,连接伪指令:PUBLIC和EXTRN,PUBLIC:模块前声明模块中变量、标号、符号常量和外部过程可供其他模块引用。没声明不能被其他模块引用例如:PUBLICAA,ABC;说明:此模块中定义的变量AA和子程序ABC可供其他模块使用。EXTRN:模块前给出此模块需要用到的变量、标号、符号常量和外部过程的属性。例如:EXTRNAA:WORD,ABC:FAR说明:此模块中要用到其他模块定义可公用的字变量AA,并需要调用子程序ABC。,公用符号伪指令,引用符号伪指令,(3)子程序嵌套,子程序也可作为调用程序去调用另一个子程序,这称为子程序嵌套。嵌套的层次称为嵌套深度。堆栈允许,嵌套深度不受限制。,例4-23试使用子程序嵌套设计一个程序,功能是对被测试字中1的个数进行计数。,子程序嵌套:被测字被取入AX中。主程序调用子程序WCNT1S以计数AX中1的个数,WCNT1S又调用两次计数字节中1的个数子程序BCNT1S,结果在CX中。,12345,;模块1PUBLICTWORD,MASKS;可供外部使用的公用变量EXTRNWCNTIS:FAR;本程序用到的外部子程序STACKSEGMENTSTACKDW32DUP(?);段内留出32个字作为堆栈区STKELABELWORD;STKE为字变量,偏移地址为0040HSTACKENDSMAINDSEGMENTMASKSDB80H,40H,20H,10H,08H,04H,02H,01H;屏蔽字TWORDDW27A9H;被测试数NUMDW?MAINDENDS,12345,连接伪指令PUBLIC和EXTRN,MAINCSEGMENTASSUMECS:MAINC,DS:MAIND,SS:STACK,ES:MAINDMAIN:MOVAX,STACK;堆栈段寄存器初始化MOVSS,AXMOVSP,OFFSETSTKE;堆栈指针初始化MOVAX,MAIND;数据段寄存器初始化MOVDS,AXMOVES,AX;附加段寄存器初始化CALLFARPTRWCNT1S;调用子程序计算1的个数MOVNUM,AX;存1的个数M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 18204.3-2025公共场所卫生检验方法第3部分:空气微生物指标
- 中国即时配送行业市场深度调研分析及投资前景研究预测报告
- 公路环境保护培训课件
- 医保科培训课件
- 可行性研究报告范文案例
- 道桥专用防水卷材项目投资可行性研究分析报告(2024-2030版)
- 税务师网课价格
- 供应商考察报告范文怎么写
- 中国自行车头盔行业市场调查研究及投资前景预测报告
- 2025年 杭州市建德市资产经营投资有限公司招聘考试笔试试题附答案
- DB31/T 1096-2018医院日间手术管理规范
- DB32-T 5119-2025 锂离子电池工厂生产安全技术规范
- 中医诊所挂证医生合同6篇
- 2023年PA6T行业市场需求分析报告及未来五至十年行业预测报告
- YY/T 0064-2004医用诊断旋转阳极X射线管电、热及负载特性
- GB/T 14486-2008塑料模塑件尺寸公差
- 湖南常德2022生地会考试卷及答案
- 2023年济南综保控股集团有限公司招聘笔试题库及答案解析
- 禾川x3系列伺服说明书
- 细胞生物学(全套1047张课件)
- 架空乘人装置专项设计(一采区运输下山)
评论
0/150
提交评论