资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第三章 汇编语言程序设计,汇编语言源程序格式,顺序、分支、循环程序设计,子程序设计,3.1,汇编语言的源程序格式,汇编语言源程序由语句序列构成。,源程序可以包含若干个代码段、数据段、,附加段或堆栈段。,段与段之间的顺序任意。,独立运行的程序必须包含一个代码段,并,指示程序执行的起始点,一个程序只有一,个起始点。,3.1 汇编语言的源程序格式,所有可执行性语句必须位于某一个代码段,内,说明语句性语句可根据需要位于任一,段内。,通常需要一个堆栈段。,汇编语句最多由四个域组成:,标号:操作符 操作数 ;注释,1.,标号,标号的定义:标号在标号域字段出现。,标号的引用:标号在操作数字段出现。,注意:,标号不能重复定义:一个标号在标号域字段,只能出现一次。,未定义标号不能引用。,保留字不能用作自定义标号使用。,4.,注释,注释是对指令功能的说明,目的是使自,己或他人在阅读分析程序时方便。,2.操作符,操作符可以是指令助记符,伪指令助记,符,宏指令符号。,3.操作数,操作数是操作符操作的对象,可以是数,据本身,也可以是标号、寄存器名或算术表达,式。,3.2 完整段定义格式,stack segment,;定义堆栈段,段名stack,db 1024 dup(0),;分配堆栈段的大小为1024字节,内容为0,stack ends,;堆栈段结束,data segment,;定义数据段,段名data,.,;数据定义,data ends,;数据段结束,code segment,;定义代码段,段名code,assume cs:code,ds:data,ss:stack,;确定各个逻辑段类型,start:mov ax,data,;程序起点,mov ds,ax,;设置DS指向数据段的段地址,.,;程序代码,mov ax,4c00h int 21h,;程序结束,返回DOS,.,;子程序等的代码,code ends,;代码段结束,end start,;汇编结束,程序起始点为start,3.3 顺序结构程序,例3.1,计算Y=5X+8,设X为无符号字节数据,且在ARGX单元存放。计算结果,存入,RLTY单元。,DSEGSEGMENT,ARGX DB15,RLTY DW0,DSEGENDS,CSEGSEGMENT,ASSUME CS:CSEG,DS:DSEG,CALCU:MOVAX,DSEG,MOVDS,AX,MOVAL,5,MULARGX ,ADDAX,8,MOVRLTY,AX,MOVAX,4C00H,INT21H,CSEGENDS,ENDCALCU,例3.,2 用查表的方法将HEX单元中低4位十六进,制数转换为对应的ASCII码,并显示出来。,1:;*EXAM 3.2*,2:SSEG SEGMENT,3:STK DB20H DUP(0),4:SSEG ENDS,5:DSEG SEGMENT,6:HATAB DB30H,31H,32H,33H,34H,7:DB35H,36H,37H,38H,39H,8:DB41H,42H,43H,44H,45H,46H,9:HEX DB0CH,11:DSEG ENDS,12:CSEG SEGMENT,13:ASSUMECS:CSEG,DS:DSEG,14:ASSUMEES:DSEG,SS:SSEG,15:HTOA:MOVAX,DSEG,16:MOVDS,AX,17:MOVAX,SSEG,18:MOVSS,AX,19:MOVSP,SIZE STK,;SP,栈顶地址1EH,HATAB DB 012345678,DB 9ABCDEF,20:MOVAL,HEX,21:LEABX,HATAB,22:AND AL,0FH,23:XLAT,;换码,将表中内容换到AL中,24:MOVDL,AL,;显示AL中内容,25:MOVAH,02,26:INT21H,27:MOVAX,4C00H,28:INT21H,29:CSEG ENDS,ENDHTOA,3.4 分支结构程序,(1)分支结构程序的引出,(2)例题,分支结构程序的引出,用计算机处理问题过程中,总是要求计算机能做出各种逻辑判断,并根据判断的结果,做相应的处理。,例如,火车站用计算机计算托运行李的托运费,当旅客行李重量小于或等于20kg时,收费0.2元/kg,当行李重量超过20kg时,20kg以内部分0.2元/kg,超出部分,收费0.3元/kg。这个处理过程,可归纳为下面数学表达式:,0.2*w (w20kg),0.2*20+0.3*(w-20)(w20kg),P=,例3.3,设内存中有三个互不相等的无符号字数,据,分别存放在ARG开始的字单元,编制,程序将其中最大值存入MAX单元。,A B C,大,大,1:;*EXAM3.3*,2:SSEGSEGMENT STACK,3:STK DB 20 DUP(0),4:SSEGENDS,5:DSEGSEGMENT,6:ARG DW 7138H,84A6H,29EH,7:MAX DW?,8:DSEGENDS,9:CSEGSEGMENT,10:ASSUME CS:CSEG,DS:DSEG,11:ASSUME SS:SSEG,12:FMAX:MOV AX,DSEG,13:MOV DS,AX,14:MOV AX,SSEG,15:MOV SS,AX,16:MOV SP,SIZE STK,17:LEA SI,ARG,18:MOV AX,,,SI,19:MOV BX,,,SI+2,20:CMP AX,,,BX,21:JAE FMAX1,22:MOV AX,BX,23:,FMAX1:,CMP AX,SI+4,24:JAE FMAX2,25:MOV AX,SI+4,26:,FMAX2:,MOV MAX,AX,27:MOVAH,4CH,28:INT 21H,29:CSEG ENDS,30:ENDFMAX,例3.4,计算,设X为单字节带符号整数,且存于ARGX单元,计算结果Y存入RLT单元。,X+10 (0X8),5X-2 (8X15),X (其它),Y=,X+10 (0X8),5X-2 (8X15),X (X=0,X15),-X (X0),Y=,1:;*EXAM3.4*,2:SSEG SEGMENT STACK,3:STK DB50 DUP(0),4:SSEG ENDS,5:DSEG SEGMENT,6:ARGX DB-5,7:RLT DB?,8:DSEG ENDS,9:CSEG SEGMENT,10:ASSUME CS:CSEG,DS:DSEG,11:ASSUME SS:SSEG,12:BEGIN:MOVAX,,,DSEG,13:MOVDS,,,AX,14:MOVAX,,,SSEG,15:MOVSS,,,AX,16:MOVSP,,,SIZE STK,17:MOVAL,,,ARGX,18:ANDAL,,,AL,;取标志符的值,19:JSABSL,;SF=1,X0,20:JZMOVE,;ZF=1,X=0,21:CMPAL,,,8,22:JLEONE,;0X=15,25:SALAL,,,1,;X2,26:SALAL,,,1,;X2,27:ADDAL,,,ARGX,;AL 5X,28:SUBAL,,,2,29:JMPMOVE,30:ONE:ADDAL,,,10,31:JMPMOVE,32:ABSL:NEGAL,;对X取负,33:MOVE:MOVRLT,,,AL,34:MOVAH,,,4CH,35:INT21H,36:CSEGENDS,37:ENDBEGIN,例3.5 内存由ADR单元开始存放两个带符号字数,据,编制程序,若两数同号将FLAG单元置0,否则置全1。,判断两数是否同号,即判断两个数的最高位,是否相同,若相同即为同号。判断的方法有两种:,第一种方法,:先取出一个数,判断符号是否为正,若,为正,再判断另一个数的符号是否为,正,也为正,则两数同号,否则为异号;,若第一个数的符号为负,判断另一,个数的符号是否为负,也为负,则两数,同号,否则为异号。程序如下:,1:;*EXAM3.5.1*,2:SSEG SEGMENTSTACK,3:STK DB20H DUP(0),4:SSEG ENDS,5:DSEG SEGMENT,6:ADR DW73A5H,924BH,7:FLAG DB?,8:DSEG ENDS,9:CSEG SEGMENT,10:ASSUMECS:CSEG,DS:DSEG,11:ASSUMESS:SSEG,12:START:MOVAX,DSEG,13:MOVDS,AX,14:MOVAX,SSEG,15:MOVSS,AX,16:MOVSP,SIZE STK,17:MOVAX,ADR,18:ANDAX,AX ;置标志,19:JNSPLUS ;正转,20:MOVAX,ADR+2,21:ANDAX,AX ;第二个数置标志,22:JSSAME ;同为负,23:UNSAME:MOVAL,0FFH;异号标志,24:JMPLOAD,25:PLUS:TESTADR+2,8000H;第二个数置标志,26:JSUNSAME ;异号,27:SAME:XORAL,AL ;同号标志,28:LOAD:MOVFLAG,AL ;存标志,29:MOVAH,4CH,30:INT21H,31:CSEGENDS,32:ENDSTART,1001 0010 0100 1011,1000 0000 0000 0000,0111 0011 1010 0101,1001 0010 0100 1011,1110 0001 1110 1110,第二种方法:,直接对两个数进行异或,再对异,或结果的最高位进行测试,即若,SF=0则表示两数同号,否则(SF=1),表示两数为异号。程序如下:,1:;*EXAM3.5.2*,2:SSEG SEGMENTSTACK,3:STK DB20 DUP(0),4:SSEG ENDS,5:DSEG SEGMENT,6:ADR DW73A5H,924BH,7:FLAGDB?,8:DSEG ENDS,9:CSEG SEGMENT,10:ASSUME CS:CSEG,DS:DSEG,11:ASSUME SS:SSEG,12:START:MOVAX,DSEG,13:MOVDS,AX,14:MOVAX,SSEG,15:MOVSS,AX,16:MOVSP,SIZE STK,17:MOV AX,ARG,18:XOR AX,ARG+2,;两数异或操作,19:MOV AL,0,;设置同号标志,20:JNS LOAD,;SF=0,同号,21:DEC AL,;SF=1,设置异号标志,22:,LOAD:,MOV FLAG,AL,;存标志,23:MOV AH,4CH,24:INT 21H,25:CSEGENDS,26:END START,例3.6 设ASC单元存放两个字符的ASCII码,编制程序检查其奇偶性,并将它们配制成,奇,校验存入原单元。,字符的ASCII码是用七位二进制表示的,当用一个字节单元(8位)保存一个字符的ASCII码时,字节单元的第7位空闲,不同的计算机存放ASCII码时,系统软件对该位有不同的定义:,1)第7 位总是0;,2)第7 位总是1;,3)做为奇偶校验位;(设结果中含偶数个1,呈奇性),4)第7 位为1,扩充128 种特殊字符或图形代码(在西文状态下);,5)做为汉字代码的标志位(在中文状态下)。,3.5 循环程序设计,1:;*EXAM 3.6*,2:SSEGSEGMENT,3:STKDB20 DUP(0),4:SSEGENDS,5:DSEGSEGMENT,6:ASCDBAC,7:DSEGENDS,8:CSEGSEGMENT,9:ASSUMECS:CSEG,DS:DSEG,10:ASSUMESS:SSEG,11:MKODD:MOVAX,DSEG,12:MOVDS,AX,13:MOVAX,SSEG,14:MOVSS,AX,15:MOVSP,LENGTH STK,16:MOVAX,WORD PTR ASC;取两字符,17:ANDAL,AL ;置奇偶标志,18:JPONEXT ;PF=0,呈奇性转,19:ORAL,80H ;配为奇性,20:,NEXT:,ANDAH,AH ;置奇偶标志,21:JPOLOAD ;PF=0,呈奇性转,22:ORAH,80H ;配为奇性,23:,LOAD:,MOVWORD PTR ASC,AX;,24:MOVAH,4CH,25:INT21H,26:CSEG ENDS,27:ENDMKODD,3.6 子程序设计,子程序定义过程名 PROC NEAR/FAR .;过程体过程名 ENDP,有关子程序的说明,子程序中最后应利用RET指令返回。,子程序中应保持堆栈的平衡。,子程序开始应保护所使用的寄存器内容,并在返回前恢复。,子程序应安排在代码段的主程序之外。,子程序允许嵌套和递归。,子程序可以有多个出口。,
展开阅读全文