《汇编语言程序设计4.6~6.8节》由会员分享,可在线阅读,更多相关《汇编语言程序设计4.6~6.8节(74页珍藏版)》请在金锄头文库上搜索。
1、4.6.1 顺序结构程序设计,顺序结构程序也称为简单程序,这种结构的程序是按顺序执行下来的,程序本身的逻辑很简单,只要能正确安排有关语句的顺序,即可解决问题。,4.6 汇编语言程序设计,在汇编语言程序中,主要有四种结构:顺序程序、分支程序、循环程序、子程序。,顺序程序 分支程序 循环程序 子程序图4-3 四种基本程序结构的示意图,例4-10 编程实现123*456MM DD ?MOV AX , 123MOV BX , 456MUL BXMOV M , AXMOV M+2 , DX,4.6.1 顺序结构程序设计,例4-11 从键盘上键入0至9中任一个自然数,求其立方值。 数据段定义如下:DATA
2、 SEGMENTINPUT DB PLEASE INPUT X(09):$TAB DW 0,1,8,27,64,125,216,343,512,729X DB ?XXX DW ?DATA ENDS,4.6.1 顺序结构程序设计,程序段如下:INT 21H ; 用9号功能显示字符串MOV AH,1INT 21H ; 从键盘输入一个字符ALAND AL,0FHMOV X,AL ; 将ASCII码转换成真值ADD AL,ALMOV BL,ALMOV BH,0 ; 计算在表中的偏移量送BXMOV AX,TABBX ; 查表获得立方值MOV XXX,AX ; 将立方值保存在XXX单元,4.6.1 顺序结
3、构程序设计,4.6.2 分支结构程序设计,N,分支1,Y,N,Y,分支2,条件,1.利用比较与条件转移实现分支,例4-13 求两个无符号数差的绝对值,结果存放在D1单元中。 DATA SEGMENTD1 DB ?D2 DB 0F5H,68H DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXLEA BX,D2MOV AL,BX ;取第1个数INC BX,4.6.2 分支结构程序设计,MOV CL,BX ;取第2个数CMP AL,CL ;两个数比较JAE BIGR ; 大于等于,则转BIGRSUB CL
4、,AL ;否则,第2个数减第1个数MOV D1,CL ;两数差的绝对值存D1单元JMP RST BIGR:SUB AL,CL ;第1个数减去第2个数MOV D1,AL RST: MOV AH,4CHINT 21H CODE ENDSEND START,4.6.2 分支结构程序设计,例4-14 设在A、B、C字型变量中存放着3个数,若3个数均不为0,则求出它们的和(不考虑溢出)存入D单元。 DATA SEGMENTA DW 108B DW 0C DW 45D DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAM
5、OV DS,AX,4.6.2 分支结构程序设计,MOV BH, 0 ;BH淸0MOV D, 0 ;变量D淸0CMP A, 0 ;判断变量A是否为0JNE NT1 ;A非0则转去判断变量BINC BH ;A为0则BH加1 NT1: CMP B, 0 ;判断变量B是否为0JNE NT2 ;B非0则转去判断变量CINC BH ;B为0则BH加1 NT2: CMP C, 0 ;判断变量C是否为0JNE NT3 ;C非0则转去判断寄存器 INC BH,4.6.2 分支结构程序设计,NT3: CMP BH,0 ;判断寄存器BH是否为0JNE EXIT ;BH非0则程序结束MOV AX, A ;BH为0则求
6、和并存入D单元ADD AX, BADD AX, CMOV D, AX EXIT:MOV AH, 4CHINT 21H CODE ENDSEND START,4.6.2 分支结构程序设计,2 利用跳转表实现分支,例4-15 某工厂有n+1种产品R0、R1、R2、.、Rn的加工程序,分别存放在PR0、PR1、PR2、. PRn为首地址的内存区域中。而这n+1个首地址的偏移量连续存放在以BASE为基地址的跳转表中。已知产品编号存放在NUM单元中,要求编写程序,能够根据产品编号转至相应的处理程序。 DATA SEGMENT BASE DW PR0,PR1,PR2,.,PRn ;定义跳转表 NUM DB
7、 4 DATA ENDS,4.6.2 分支结构程序设计,CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXXOR AX,AX ;清AXMOV AL,NUM ;取加工的产品编号iADD AX,AX ;2*i,获得偏移量MOV BX,OFFSET BASE ;获得跳转表首地址ADD BX,AX ;获得对应的单元地址JMP BX ;转入相应的加工子程序MOV AH,4CH ;程序结束INT 21H,4.6.2 分支结构程序设计,PRO PROC NEAR ;加工子程序. PR0 ENDP; PR1 PROC NEAR. PR1
8、 ENDP; . PRn PROC NEAR. PRn ENDP CODE ENDS END START,4.6.2 分支结构程序设计,PR,0,BASE,PR,0,PRn,PR,1,PR,2,PRn,.,4.6.2 分支结构程序设计,图4-5 例4-15的跳转表,4.6.3 循环结构程序设计,1. 循环程序结构可分为五个部分。 (1)初始化部分设置循环的初始值,是循环的准备部分。 (2)循环体部分这是循环程序的主体,用来完成主要的计算任务和操作。(3)循环修改部分修改循环工作部分的变量地址等,为下一次循环作准备。 (4)循环控制部分修改循环次数计数器并判断结束条件。 (5)结束部分循环结束后
9、,用于分析和存放结果。,4.6.3 循环结构程序设计,2 循环的控制方法,(1)计数控制用于循环次数已知的情况。通常采用CX寄存器为循环计数器。循环计数控制一般用LOOP指令实现。 (2)条件控制用于循环次数未知,但却已知一些循环或不循环的条件。 (3)逻辑尺控制这是汇编语言循环程序设计独有的方式。所谓逻辑尺,是指具有一定长度的一串二进制数。该方式按照逻辑尺的指示,决定对循环体中某一部分的执行或不执行。,4.6.3 循环结构程序设计,3. 循环程序设计举例,例4-16 编程计算Y=a1+a2+a100。(其中ai为16位二进制整数,设和值不大于16位二进制整数表数范围) DATA SEGMEN
10、TTAB DW a1,a2,.,a100Y DW ? DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX,4.6.3 循环结构程序设计,XOR AX,AX ; 初始化部分,累加和清0LEA BX,TAB ;BX指向加数首地址MOV CX,100 ;设置减计数初值 LP:ADD AX,BX ;循环体开始,累加INC BX ;修改部分,修改BX INC BXLOOP LP ;控制部分,CX减计数MOV Y,AX ;结束部分,存放结果MOV AH,4CHINT 21HCODE ENDSEND START,4
11、.6.3 循环结构程序设计,例4-17 写一个把字符串中的所有大写字母改写为小写字母的程序。设字符串以$结尾。 DATA SEGMENTSTRING DB I am A Student!,$ DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV SI,OFFSET STRING ;取串首地址 AGAIN: MOV AL, SI ;取一字符CMP AL, $ ;是否到字符串尾,4.6.3 循环结构程序设计,JE OK ;到字符串尾,跳出循环CMP AL, A ;否则,判断是否为大写字母JB NEXT
12、 ;否,转继续CMP AL, ZJA NEXT ;否,转继续 OR AL, 20H ;是大写字母,改为小写字母 NEXT: INC SI ;调整指针JMP AGAIN ;继续循环OK: MOV AH, 4CH ;结束INT 21HCODE ENDSEND START,4.6.3 循环结构程序设计,例4-18 设计一个程序判断无符号字型数组BUFFER的若干个元素中是否含有数字0,如有则把第一个0元素所在存储单元的偏移地址送字型变量ADDR,如没有则将该变量的值置为0FFFFH。 数据段定义如下: DATA SEGMENTBUFFER DW 23, 65, 89, COUNT EQU $-BUFFER ; 元素个数ADDDR DW ? DATA ENDS,4.6.3 循环结构程序设计,程序段如下:MOV BX,OFFSET BUFFER ;数组地址到BXMOV CX, COUNT ;置循环最大次数AGAIN: MOV AX, BX ;取一元素 CMP AX, 0 ;与0比较JZ YES ;相等则跳出循环ADD BX, 2 ;修改地址指针LOOP AGAIN ;循环控制MOV ADDR, 0FFFFH ;没找到JMP EXIT YES: MOV ADDR, BX ;找到 EXIT: ;结束,