汇编语言程序设计第五章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

顺序程序设计
例.写出计算Y=A*B+C-18的程序,题中A,B, C是带符号的8位二进制数。
顺序程序设计
练习:试编制一程序,求出下列公式中的Z 值,并存放在RESULT单元中: Z=((X+Y)*8-X)/2 其中X,Y的值分别存放在VARX, VARY单元中。
循环程序设计
循环程序的结构 循环程序的设计方法
(b) 简单分支的两路分支
表达式计算结果是 情况1 Hale Waihona Puke Baidu况2 …… 情况n
语句 1
语句 2
语句 n
(c) 多路分支
简单分支程序的设计
通常是在执行了算术比较指令CMP,或者逻辑比较指令 TEST之后,根据Z,S,O,P,C等各种标志位的状态进行有 条件转移。如果条件成立则跳转到指定指令开始执行, 否则忽略转移指令继续顺序的执行后续的指令。 例、将BX寄存器的内容以二进制格式显示在屏幕上。 ;FILENAME:651.ASM .486 CODE SEGMENT USE16 ASSUME CS:CODE BEG:MOV BX,5678H MOV CX,16
MOV DX,OFFSET MESG1 CMP NUMBER,N1 JNC NEXT MOV DX,OFFSET MESG2 JMP DISP NEXT:CMP NUMBER,N2+1 JC DISP MOV DX,OFFSET MESG3 DISP:MOV AH,9 INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG
.486 DATA SEGMENT USE16 JUMP DB ? TAB DW P000 DW P001 …… DW P255 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX
MOV BL,JUMP MOV BH,0 ADD BX,BX MOV SI,OFFSET TAB JMP WORD PTR [BX+SI] P000: …… P001: …… …… P255: …… CODE ENDS END BEG
变址循环程序设计
变址循环:将数据有规律地存放在连续的内存 单元,使数据地址在循环过程中有规律的变化, 利用变址寄存器或基址寄存器,使之指向数据 元素。 例、计算C=A1*B1+A2*B2+A3*B3+A4*B4
分支程序设计
条件成立? Y Y 语句 1 条件成立? N 语句 2
语句
(a) 简单分支
复合分支程序的设计
练习:根据X的值给Y赋值,若X=0,则Y=0 若X<0,则Y=1;若X>0,则Y=-1
多分支程序的设计
作用:使程序能根据不同的条件转移到多个程序分支去。 方法:(1)用寄存器间接寻址的方式实现跳跃表法。 (2)用基址变址的方式实现跳跃表法。 (3)用变址寻址方式实现跳跃表法。
例、 设计一个256分支的段内转移程序,设:JUMP单元有一个数X, 若X=0,转移到标号为P000的程序段; 若X=1,转移到标号为P001的程序段; …… 若X=255,转移到标号为P255的程序段;
汇编源程序的书写结构形式2
堆栈段名 SEGMENT STACK 用变量定义预置的堆栈空间 堆栈段名 ENDS 数据段名 SEGMENT 用变量定义预置的数据空间 数据段名 ENDS 代码段名 SEGMENT 过程名 PROC F A R ASSUME 定义的寻址关系 START:PUSH DS SUB AX,AX PUSH AX 填充数据段 . . . RET 过程名 ENDP 代码段名 ENDS END START
(COM文件)
汇编源程序的书写结构形式1
堆栈段名 SEGMENT STACK 用变量定义预置的堆栈空间 堆栈段名 ENDS 数据段名 SEGMENT 用变量定义预置的数据空间 数据段名 ENDS 代码段名 SEGMENT ASSUME 定义的寻址关系 START:填充数据段 . . . MOV AH,4CH INT 21H 代码段名 ENDS END START
START: MOV AX,DATA MOV DS,AX MOV CX,N DEC CX LOOP1: MOV DX,CX MOV BX,0 LOOP2: MOV AX,BUF[BX] CMP AX,BUF[BX+2] JGE L XCHG AX,BUF[BX+2] MOV BUF[BX],AX
L:
复合分支程序设计
例、设NUMBER单元的数X以及数值N1,N2均为单 字节无符号数,请判断X的大小,并更加判断结果 分别显示:N1<=X<=N2,或X<N1,X>N2
.486 DATA SEGMENT USE16 MESG1 DB „N1<=X<=N2 $‟ MESG2 DB „X<N1 $‟ MESG3 DB „X>N2 $‟ NUMBER DB ? N1 EQU 22 N2 EQU 88 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX
CODE
ADD BX,2 DEC CX JNE LOOP2 MOV CX,DX LOOP LOOP1 MOV AH,4CH INT 21H ENDS END START
程序运行后,BUF区中的内容如下: 20,9,7,6,3,2,0,-4,-8,-9,-10 思考:若要对N个无符号数按由大到小的顺 序排列,要如何修改程序?
第五章 循环和分支程序设计
汇编程序编写步骤 汇编程序编写格式 循环程序设计 分支程序设计
子程序设计
字符串程序设计
编制一个汇编语言程序的步骤
(1)分析题意,确定算法 (2)根据算法,画出程序框图 (3)根据框图编写程序 (4)上机调试程序
EXE文件的编程要求
源程序可使用多逻辑段 在实模式下,每个逻辑段大小不超过64KB 适合编写大型程序
单重循环程序设计
练习1.计算:S=1+2+3+4+…+200
练习2.计算:S=1+2*3+3*4+4*5+…+N*(N+1) 直到N*(N+1)>200为止。
多重循环程序设计
【例】在以BUF为首址的字存储区中存放有N个有符 号数,现需将它们按大到小的顺序排列在BUF存储 区中,试编写其程序。 我们采用冒泡排序算法从第一个数开始依次对 相邻两个数进行比较,如次序对,则不交换两数 位置;如次序不对则使这两个数交换位置。可以 看出,第一遍需比较(N-1)次,此时,最小的数 已经放到了最后;第二遍比较只需考虑剩下的 (N-1)个数,即只需比较(N-2)次;第三遍只 需比较(N-3)次,……整个排序过程最多需(N1)遍。如下面的4个数即是采用冒泡排序比较的 例子。
CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX MOV AL,0 LEA BX,BUF MOV CX,COUNT LAST:CMP [BX],AL JC NEXT MOV AL,[BX] NEXT:INC BX LOOP LAST
字符串操作程序设计
例、用REP MOVSB指令把字符串S1从一个数据段传送 到辅助数据段的串S2中. DATA1 SEGMENT S1 DB „ABCDEFG‟ COUNT EQU $—OFFSET S1 DATA1 ENDS DATA2 SEGMENT S2 DB 27 DUP(?) DATA2 ENDS CODE SEGMENT
LAST:MOV DL,‟0‟ RCL BX,1 JNC NEXT MOV DL,‟1‟ NEXT:MOV AH,2 INT 21H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG
简单分支程序的设计
练习:试编程实现将BUF1和BUF2两个 字单元中的内容相加,若无溢出,将其和保 存到SUM单元中,若有溢出,在屏幕上显 示“Overflow!”。
源程序只允许使用一个逻辑段,即代码段,不允许设置 堆栈段; 数据可以集中设置在段的开始或者末尾; 程序的启动指令必须存放在偏移地址为100H的单元; 代码段长度小于64KB,适合于编写中小型程序。
例 显示10行HELLO
;FILENAME: 42.ASM .486 CODE SEGMENT ASSUME CS:CODE ORG 100H BEG: JMP START MESG DB „HELLO‟,0DH,0AH,‟$‟ START: MOV CX,10 LAST : MOV AH,9 MOV DX,OFFSET MESG INT 21H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG
循环程序的组成
循环初始化部分 循环体 循环参数修改部分 循环控制部分
循环程序的结构
在程序设计中,常见的循环结构有两种: 一种是先执行循环体,然后判断循环是否 继续进行; 另一种是先判断是否符合循环条件,符合 则执行循环体,否则退出循环。 两种循环结构如下图所示。
循环控制的方法
BEG:MOV AX,DATA MOV DS,AX MOV AL,0 LEA BX,BUF LAST:CMP BYTE PTR [BX],-1 JE DISP CMP [BX],AL JC NEXT MOV AL,[BX] NEXT:INC BX JMP LAST
DISP:MOV MAX+4,AL MOV AH,9 MOV DX,OFFSET MAX INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG
计数控制法 条件控制法 混合控制法
循环程序设计
单循环程序设计
多重循环程序设计
单重循环程序设计
【例】假设从BUF单元开始为一个ASCⅡ码字符 串,找出其中的最大数送屏幕显示. 解一: .486 DATA SEGMENT USE16 BUF DB „QWERTYUIOP123‟ COUNT EQU $-BUF MAX DB „MAX=“,?,0DH,0AH,‟$‟ DATA ENDS
MOV SS,AX MOV SP,100 MOV AX,DATA MOV DS,AX MOV CX,10 LAST: MOV AH,9 MOV DX,OFFSET MESG INT 21H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG
COM文件的编程要求
例 显示10行HELLO
(EXE文件)
;FILENAME: 41.ASM .486 DATA SEGMENT USE16 MESG DB „HELLO‟,0DH,0AH,‟$‟ DATA ENDS STACK_ SEGMENT DB 100 DUP(?) STACK_ ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK_SEGMENT BEG: MOV AX,STACK_SEGMENT
数 10 8 16 90 第一遍 10 16 90 32 第二遍 16 90 32 10 第三遍 90 32 16 10 程序流程图如图4.9所示。
32 8 8 8
程序如下: DATA SEGMENT BUF DW 3,-4,6,7,9,2,0,-8,-9,-10,20 N=($-BUF)/2 DATA ENDS STACK SEGNMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK
MOV MAX+4,AL MOV AH,9 MOV DX,OFFSET MAX INT 21H MOV AH,4CH INT 21H CODE ENDS END BEG
解二: .486 DATA SEGMENT USE16 BUF DB „QWERTYUIOP123‟ FLAG DB -1 MAX DB „MAX=“,?,0DH,0AH,‟$‟ DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA
相关文档
最新文档