资源描述
上机过程的步骤,设计思想、 数据结构和算法,汇编语言源程序文件(*.asm),目标代码程序文件(*.obj),可执行程序文件(*.exe),可调试程序,编辑,汇编,连接,调试,源程序分段结构框架: DATA SEGMENT DATA ENDS STACK SEGMENT STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,START: CODE ENDS END START,第五章 基本结构程序设计,5.1 汇编语言程序设计概述 5.2 顺序结构程序设计 5.3 分支结构程序设计 5.4 循环结构程序设计,5.1 汇编语言程序设计概述,5.1.1 汇编语言程序设计的基本步骤,汇编语言程序设计一般有以下几个步骤: 1. 分析问题,归纳出数学模型 2. 确定算法 3绘制流程图 4. 分配存储空间和工作单元 5根据流程图编制程序 6. 静态检查 7调试程序,5.1.2 流程图的画法规定,1流程图的概念 流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。,2流程图符号表示 (1)开始框:表示程序的开始。,(3)判断框,(2)处理框(执行框),条件,N,Y,(4)结束框,结束,结构程序设计,程序的每个部分都由有限结构结合中的单元组成,并且只有单一的入口和单一的出口。,基本结构有: 顺序结构(线性结构) 选择结构(分支结构) 循环结构,三种结构可以任意组合和嵌套构成复杂的程序。,这三种结构可归纳为五种逻辑结构:,(3)多分支结构,Y,N,条件,条件,(4)DO_UNTIL循环结构,N,Y,(5)DO_WHILE循环结构,图程序的逻辑结构格式,5.2 顺序结构程序设计,特点:指令顺序执行,无分支、无循环、无转移。,例5-1将两个字节数据相加,并存放到一个结果单元中,START:MOV AX,DATA MOV DS,AX MOV AL,AD1 ADD AL,AD2 MOV SUM,AL MOV AH,4CH INT 21H ;返回DOS CODE ENDS END START,例5-2 两个32位数的乘法程序。源程序如下:,DATA SEGMENT NUM1 DD 12345678H NUM2 DD 5A4BEF06H RESU DD 2 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX,MOV EAX,NUM1 MUL NUM2 MOV REU,EAX ; 存放结果的低字部分 MOV REU+4,EDX ;存放结果的高字部分 MOV AH,4CH INT 21H CODE ENDS END START,例5-3 将一个字节压缩BCD码转换成两个ASCII码。 源程序如下:,DATA SEGMENT BCD_BUF DB 96H ASC_BUF DB 2 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX,MOV AL,BCD_BUF ;取BCD码 MOV BL, AL ;送BL暂存 MOV CL, 4 SHR AL, CL ;分离出高4位 ADD AL, 30H ;变成ASCII码 MOV ASC_BUF, AL AND BL, 0FH ;屏蔽高4位,保留低4位 ADD BL,30H MOV ASC_BUF,BL,注:在进行拆分前,应先保留原始数据,例5-4 利用直接查表法完成将键盘输入的一位10进制数(0-9)转换成对应的平方值,并存放在SQUBUF单元中。,DATA SEGMENT SQUTAB DB 0,1,4,9,16,25,36,49,64,81 SQUBUF DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX,MOV BX,OFFSET SQUTAB ;取平方表的首地址 MOV AH,1 ;键盘输入一个数,得到其 INT 21H ;ASCII码 SUB AL,30H ;由ASCII码对应的数 XLAT ;查表 MOV SQUBUF,AL ;存储结果 MOV AH,4CH INT 21H CODE ENDS END START,说明: DOS的1号功能调用 MOV AH,01H ;01号功能,从标准输入设备读一个字符 INT 21H ;AL=键入的ASCII码 DOS的2号功能调用 MOV AH,02H ;向标准输出设备(屏幕)输出一个字符 INT 21H ;DL=输出字符的ASCII码 注意XLAT的换码指令的操作,5.3 分支程序设计,5.3.1 转移指令,转移指令,无条件转移指令 有条件转移指令,1、无条件转移指令 功能是无条件转移到指定地址,执行从该地址开始的指令。根据转移时是否重置CS的内容,,无条件转移指令,段内转移 段间转移,段内转移(近转移):转移时只改变IP寄存器的内容,CS的值保持不变,条件转移和循环指令只能实现段内转移。 段间转移(远转移):是在不同代码段之间转移,不仅改变IP的值,也改变CS的值,软中断和中断返回总是段间转移。,(1)段内直接短转移 格式:JMP SHORT OPR 功能:IPIP+8位偏移量 其中OPR为一般标号,转移范围-128127,例: NEXT: MOV AX,CX JMP NEXT JMP OVER OVER: MOV AX,1 ,(2)段内直接近转移 格式 :JMP NEAR PTR OPR 功能:IPIP+16位的偏移量 其中OPR为一般标号,转移范围为-3276832767 地址差为065535,所以近转移可以到达实模式下当前代码段的任何位置。,(3)段内间接转移 格式:JMP WORD PTR OPR 功能:IP(EA) OPR是16位的通用寄存器或字存储器。,例: JMP CX ;CX寄存器的内容送IP JMP WORD PTR 1234 ;字存储单元 1234的内容送IP,DS:1234H,原IP=,新IP=5678H,转移指令,(4)段间直接转移 格式:JMP FAR PTR OPR 功能:IPOPR的偏移地址,CSOPR的段地址 其中OPR是一个标号,所代表的指令与JMP指令不在同一个代码段中,标号前的FAR PTR向汇编程序说明这是段间转移。,无条件段间直接转移指令机器指令格式如下:,远转移,10000,10001,10002,10003,10004,A3126,A3127,CODE1 SEGMENT JMP FAR PTR LAST ,CODE2 SEGMENT LAST: MOV AX,0 ,例如:,标号所代表的指令在另一个代码段中,(5)段间间接转移 格式:JMP DWORD PTR OPR 功能:IP(EA),CS(EA+2) 其中OPR是一个双字存储器,低字存放转移目标的偏移地址,高字存放转移目标的段地址。,例如:JMP DWORD PTR 1234 双字存储单元的低字节送IP 双字存储单元的高字节送CS,;JMP指令段内间接与段间直接转移示例,ADDT DW 120H,130H,140H MOV SI,120H JMP SI JMP ADDT JMP ADDT+2 JMP DWORD PTR ADDT JMP FAR PROGB,跳转至CS:120H执行,跳转至CS:120H执行,跳转至CS:130H执行,跳转至130H:120H执行,跳转至去执行PROGB, JO OPR ; OF=1转移 (结果溢出转移) JNO OPR ; OF=0转移 (结果不溢出转移) JP/JPE OPR; PF=1转移 (结果为偶转移) JNP/JPO OPR;PF=0转移 (结果为奇转移) JC OPR ; CF=1转移 (有进位或借位转移) JNC OPR ; CF=0转移 (无进位或借位转移),注:通常在使用条件指令前,总有用于条件判断的相关指令,例如:要测试寄存器AX的低四位是否全为0,如果全为0,则CX=0,否则CX=-1,MOV CX,-1 ;CX赋初值 TEST AX,0FH ;测试AX的低4位 JNZ NZERO ;不全为0转NZERO MOV CX,0 ;全为0,置CX=0 NZERO: ,例5-6 AX和BX的值相等时输出“=”,不相等时输出“#”。,AXBX?,输出#,CMP AX,BX JZ NEXT1 MOV DL,# MOV AH,2 INT 21H JMP NEXT2 NEXT1:MOV DL,= MOV AH,2 INT 21H,NEXT2:MOV AH,4CH INT 21H,2号调用,显示一个字符,指令系统提供了两组指令,分别用于无符号数和有符号数的比较。,无符号数比较,用A代表大于,用B代表小于,用E代表等于 有符号数比较,用G代表大于,用L代表小于,用E代表等于,例 5-7 X为无符号数,X小于、等于、大于100时,分别显示输出“”。,MOV AL,X CMP AL,100 JA NEXT1 JZ NEXT2 MOV DL, JMP EXIT,NEXT1:MOV DL, JMP EXIT NEXT2:MOV DL,= EXIT: MOV AH,2 INT 21H,(3)两个有符号数的比较(X,Y), JL/JNGE OPR X=Y转移 JLE/JNG OPR XY转移,例5-8 求A字节单元中数据的绝对值,结果存放在B字节单元中。,MOV AL,A CMP AL,0 ;和0比较 JGE NEXT ;大于等于转NEX NEG AL ; 小于0求绝对值 NEXT:MOV B,AL MOV AH,4CH INT 21H,例:编写一程序段,计算以下公式: 1 X0 Y= 0 X=0 -1 X0,程序段如下:,CMP X,0 ;X0? JGE BIGER ;若X0转BIGER MOV Y,-1 ;若X0,Y-1 JMP NEXT BIGER:JZ EQUL ;X=0转EQUL,否则 MOV Y,1 JMP NEXT EQUL: MOV Y,0 NEXT: ,(4)CX的值为零转移 JCXZ OPR CX=0时转移 (5)ECX的值为零转移 JECXZ OPR ECX=0时转移,data segment ary db 17,5,40,0,67,12,34,78,32,10 max db ? data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax,
展开阅读全文