汇编语言程序设计.ppt_第1页
汇编语言程序设计.ppt_第2页
汇编语言程序设计.ppt_第3页
汇编语言程序设计.ppt_第4页
汇编语言程序设计.ppt_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机硬件技术基础,李丰 ,程序设计语言概述,程序设计语言是专门为计算机编程所配置的语言。它们按照形式与功能的不同可分为: 机器语言(Machine Language) 汇编语言(Assembler Language) 高级语言(High Level Language),机器语言,计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。 用机器语言编写的程序是计算机惟一能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译才能变换成机器语言程序,所以,机器语言程序被称为目标程序。 机器语言主要具有下列两个特点: 机器语言与机器密切相关 机器语言设计程序非常困难,但容易实现高性能,程序设计语言概述,汇编语言,为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。所以汇编语言是一种用符号书写的、基本操作与机器指令相对应的、并遵循一定语法规则的计算机语言。 用汇编语言编写的程序称为汇编源程序。 汇编语言是一种符号语言,比机器语言容易理解和掌握,也容易调试和维护。但是,汇编语言源程序要翻译成机器语言程序才可以由计算机执行。这个翻译的过程称为“汇编”,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序。,程序设计语言概述,高级语言,机器语言和汇编语言以外的程序设计语言统称高级语言。其特点是更加接近自然语言和惯用的数学表达形式,与计算机硬件结构无关,因而便于使用,便于交流和推广。 总之,高级语言编程效率高,但运行效率低。 高级语言可分成编译型和解释型高级语言,分别使用编译程序和解释程序将源程序翻译成机器语言程序,然后交计算机执行。,程序设计语言概述,汇编语言和高级语言的比较:,程序设计语言概述,1汇编程序 汇编是把汇编语言程序翻译成机器语言描述的目标程序的过程。 汇编程序是完成汇编任务的程序。 2连接程序 连接程序的主要功能是实现多个目标文件及库文件的连接,并完成浮动地位的重定位。 从汇编语言源程序到可执行程序的生成过程如图所示。,程序设计语言概述,汇编语言程序开发过程,程序设计语言概述,汇编语言程序基本结构,说明: 除代码段外,其余段可缺省; 各种段均可有多个,用汇编语言指令可指定段与段寄存器关系,数据段附加段(段寄存器不同); 各段无顺序要求; 通过END指明模块到此结束, 程序从“标号”处开始执行。,8086/8088汇编源程序,汇编语言程序举例:,DATA SEGMENT BUF1 DB 34H BUF2 DB 2AH SUM DB ? DATA ENDS SSEG SEGMENT STACK DB 512 DUP(0) SSEG ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA SS:SSEG START: MOV AX, DATA MOV DS, AX MOV AL, BUF1 ADD AL, BUF2 MOV SUM, AL MOV AH, 4CH INT 21H CODE ENDS END START,8086/8088汇编源程序,8086/8088汇编源程序,汇编程序在结构和语句格式上有以下几个特点: 汇编程序一般由若干段组成,每个段都有一个名字,以SEGMENT作为段的开始,以ENDS作为段的结束,前面都要冠以相同的名字。从段的性质上看,可分为代码段、堆栈段、数据段和附加段4种。数据段存放原始数据和运算结果,堆栈段用于存放堆栈数据,代码段存放实现CPU要执行的指令。 汇编程序每一行只有一条语句,且不能超过128个字符。整个源程序必须以END语句来结束,END后面的标号表示该程序执行时的起始地址。,8086/8088汇编源程序,汇编语言语句的类型 汇编语言的语句可分为两大类: 指令性语句 指令性语句是CPU要执行的语句,汇编程序将产生与它一一对应的机器目标代码 如 MOV DS,AX 指示性语句(又称为伪指令语句) 指示性语句是只起说明作用而不能执行的语句,它在汇编时只提供一些定义符号、分配存储单元等相关信息 如 DATA SEGMENT,汇编语言语句格式 指令性语句的格式 标号:前缀指令助记符操作数表;注释 标号方便转移指令寻找转移目标地址 前缀配合其他指令 如串操作指令中的REP 助记符即具体指令 操作数表是由逗号隔开的多个操作数 注释是说明文字,提高程序可读性 伪指令语句的格式 名字伪操作命令操作数表;注释,8086/8088汇编源程序,8086/8088汇编语言的数据项与表达式,(1)常数 数值常数:二/八/十/十六进制数分别以B/Q/D(或缺省结尾字符)/H结尾,如001B、35Q、98D或98、0A2H。 字符串常数:用单引号括起来的一个或多个字符,如A、AB;字符用ASCII码形式存储。 应用:作立即数、位移量、赋初值用。 (2)变量 组成:在除代码段外的段中定义,只由名字组成。 属性:段 属 性变量(定义时)所在段的起始地址; 偏移属性变量与所在段起始地址间字节数; 类型属性表明为它所保留的主存字节数, DB/DW/DD/DQ/DT对应1/2/4/8/10字节。,8086/8088汇编语言的数据项与表达式,(3)数学表达式 为常数、寄存器名、标号/变量与运算符的组合。 运算符有算术、逻辑、关系、数值返回、属性5种。,(4)数值返回运算符,8086/8088汇编语言的数据项与表达式,例: D_SEG SEGMENT NUM1 DB 10 DUP(10) ;数据定义 NUM2 DW 20 DUP(0, 4 DUP(2) NUM3 DB 10H, 5 DUP(?) NUM4 DB STRING D_SEG ENDS ;假设DS指向D_SEG段,MOV AX, SEG NUM1 ;等价于AX(DS) MOV BX, SEG NUM2 ;AX与BX值相同 MOV SI, OFFSET NUM1 ;NUM1相对于段的偏移量SI MOV DI, OFFSET NUM2 ;等价于LEA DI, NUM2,MOV AH, TYPE NUM2 ;2AH MOV BH, LENGTH NUM2 ;20BH(指最外层参数) MOV AL, LENGTH NUM3 ;1AL(指第一个参数) MOV CL, SIZE NUM2 ;20*2CL MOV CH, SIZE NUM4 ;1*1CH,8086/8088汇编语言的数据项与表达式,(5)属性运算符 PTR格式: PTR 表达式 PTR功能:用新类型取代表达式默认的数据类型 PTR说明: 表达式为MEM操作数或变量时,类型可为BYTE、WORD、DWORD,表达式为标号时,类型可为NEAR、FAR; 仅改变数据类型属性,且仅在本语句有效。,PTR示例: DATA1 DB 10H, 20H, 30H DATA2 DW 0123H MOV AX, WORD PTR DATA1 ;(AX)2010H MOV BL, BYTE PTR DATA2 ;(BL)23H MOV BYTE PTRSI, 60H ;字节传送 SUB WORD PTRBX, 36H ;字数据相减 JMP FAR PTR SUB_P1 ;段间直接转移 JMP WORD PTRBX ;段内间接转移,8086/8088汇编语言的数据项与表达式,(6)各运算符的优先级,8086/8088汇编语言的数据项与表达式,处理器选择伪指令 (8086无此指令) 数据定义伪指令 段定义伪指令 程序开始和结束伪指令 表达式赋值伪指令 其他伪指令(地址计数、对准等) 过程定义伪指令,8086/8088汇编语言的伪指令,1、处理器选择伪指令 格式 : .8086 选择8086指令系统 .286 选择80286指令系统 .286P 选择保护方式下的80286指令系统 .386 选择80386指令系统 .386P 选择保护方式下的80386指令系统 .486 选择80486指令系统 .486P 选择保护方式下的80486指令系统 .586 选择Pentium指令系统 .586P 选择保护方式下Pentium的指令系统,8086/8088汇编语言的伪指令,2、数据定义伪指令 (1)数据定义 格式:变量名 类型定义符 参数,参数 操作:为变量分配存储空间,并置初值到存储单元 说明: 变量类型数值变量和字符串变量; 类型定义符可为DB/DW/DD/DF/DQ/DT,表示每个参数占1/2/4/6/8/10字节存储空间,字符串变量只能用DB类型定义; 参数可为常数、表达式、?表达式、字符串、DUP表达式 字符串用单引号括起来,如ABCDE DUP表达式格式:n DUP(参数,参数), n表示重复次数。,8086/8088汇编语言的伪指令,例: X1 DB 40H ;为X1分配1个字节,初值40H X2 DW 10*10 ;为X2分配2个字节,初值100(0064H) X3 DB 10,20,30 ;为X3分配3个字节,初值为10,20,30 Y1 DB 20H,? ;为Y1分配2个字节,第2个字节无初值 S1 DB HEL ;S1占3个字节,值为ASCII码 S2 DB H, E, L ;S2与S1相同 S3 DW HE ;非字符串定义 VAR1 DW 2 DUP(2,4),1476H VAR2 DB 2 DUP(?,2 DUP(A,B) ),8086/8088汇编语言的伪指令,(2)数据别名定义 格式:变量或标号 LABEL 操作:给变量/标号重新定义别名和改变别名属性 说明:不分配新的存储空间。,示例1: BARRAY LABEL BYTE ARRAY DW 100 DUP(0) ADD AL,BARRAY49 ;第50个字节,字节相加 ADD AX,ARRAY98 ;第50个字,字相加,示例2: SUBPF LABEL FAR SUBP: SUB AX,AX JMP SUBP ;段内 FARPRO PROC FAR JMP SUBPF ;段间,8086/8088汇编语言的伪指令,3、段定义伪指令 (1)段定义伪指令 格式:段名 SEGMENT定位类型组合类型类别名 ;语句体 段名 ENDS 操作:定义逻辑段 说明:代码段的语句体为指令和伪指令,其它段为伪指令。,8086/8088汇编语言的伪指令,8086/8088汇编语言的伪指令,a.定位类型:指定当前段起始地址的性质 PARA 起始地址的低4位为0H,即16的倍数; PAGE 起始地址的低8位为00H,即256的倍数 BYTE 可从任意地址开始 WORD 当前段的起始地址为偶地址 默认项是PARA,b.组合类型:指明程序连接时,段的合并方法 PRIVATE 不与其他模块中任何段连接或重叠 PUBLIC 不同模块中PUBLIC类型的同名段连接在一起,形成一个单一的段(段长为) COMMON 不同模块中COMMON类型的同名段重叠在一起,共享相同的存储区(共享存储区长度为max) STACK 功能同PUBLIC,但新段为堆栈段(段长为) 默认项是PRIVATE,8086/8088汇编语言的伪指令,c.类别名:指明程序连接时,段间次序的确定方法 LINK程序将各模块相同类别名的各段依次序连续存放在内存中,但各段相互独立。 缺省项为空 段合并的优先级确定段间次序的优先级。,8086/8088汇编语言的伪指令,段定义伪指令示例: D_SEG SEGMENT DATA NUM1 DB 10 DUP(?) D_SEG ENDS S_SEG SEGMENT PARA STACK DW 100 DUP(?) S_SEG ENDS E_SEG SEGMENT PARA DATA STRING DB HELLO E_SEG ENDS ;连接(LINK)时,D_SEG段与E_SEG段是连续的,8086/8088汇编语言的伪指令,(2)指定段寄存器伪指令 格式:ASSUME 段寄存器:段名 ,段寄存器:段名 操作:明确段和段寄存器的关系 说明:代码段中必须至少有一个ASSUME语句,ASSUME可以出现在源程序中的任何地方; 对同一段寄存器重复指定时最后一个有效。,8086/8088汇编语言的伪指令,8086/8088汇编语言的伪指令,a.CS的指定 必须指定CS,最后一次指定必须在开始执行段中,且段名为开始执行段的段名。 CS=END指令中标号/过程名对应的段 IP=END指令中标号/过程名在段内的偏移地址,b.DS、ES的指定 对DS、ES的指定无效(文件加载后自动指向程序前缀),需要在程序中显式赋值(指定)。 程序前缀(PSP)用户程序与命令行间的接口,占256字节,思考:文件加载时,如何得到CS、SS值?,8086/8088汇编语言的伪指令,对DS、ES赋值(指定)示例: D_SEG SEGMENT ;数据段 X DW ?, 4000H, 100 DUP(?) D_SEG ENDS E_SEG SEGMENT ;附加段 STRING DB EXAMPLE E_SEG ENDS C_SEG SEGMENT PARA CODE ASSUME CS:C_SEG,DS:D_SEG,ES:E_SEG START: MOV AX, D_SEG MOV DS, AX ;数据段基址DS MOV AX, E_SEG MOV ES, AX ;附加段基址ES,8086/8088汇编语言的伪指令,c.SS的指定 自动指定当有组合类型为STACK的段时,SS自动指向该段; 此时用ASSUME指定SS时,SP=段长;否则SP=0000H 自动指定示例: S_SEG SEGMENT PARA STACK DW 100 DUP(?) S_SEG ENDS 思考:若有多个STACK属性的堆栈段,结果如何? 缺省指定当无组合类型为STACK的段时,无论是否用ASSUME设定,SS自动指向程序区开始(SP=0000H); 思考:若未定义堆栈时,使用堆栈的结果?,8086/8088汇编语言的伪指令,显式指定使用MOV指令,使SS及SP指向目的处。 用指令赋值示例: S_SEG SEGMENT DW 100 DUP(?) ST LABLE WORD S_SEG ENDS C_SEG SEGMENT PARA CODE ASSUME CS:C_SEG,SS:S_SEG,DS:NOTHING,ES:NOTHING START: MOV AX, S_SEG ;填入段基址 MOV SS, AX LEA SP, ST ;填入栈顶指针 C_SEG ENDS END START 思考:若有STACK属性的堆栈段,又用指令赋值后结果如何?,8086/8088汇编语言的伪指令,4、程序开始和结束伪指令 (1)模块命名伪指令 格式1:NAME 模块名 操作1:给源程序进行模块命名 说明1:若模块名缺省,则自动用程序名代替。,格式2:TITLE 标题名 操作2:给源程序设置标题(模块命名) 说明2:模块名为标题名的前6个字符。,示例: NAME MM1 或TITLE ABCDEFGH ;模块名为ABCDEF,8086/8088汇编语言的伪指令,(2)程序开始和结束伪指令 格式:END 地址标号 操作:表明该模块到此结束,和整个应用程序从地址标号处开始执行 说明:应用程序只能有一个主模块(地址标号不缺省); 汇编程序不处理源程序中END后的信息。 应用程序与源程序文件: 应用程序可有多个源程序文件; 每个源程序文件只能为一个模块(在NAME/TITLEEND间); 所有模块中只能有一个主模块(END后地址标号不缺省); 每个模块中可有多个段; 每个段的类型通过与段寄存器对应或段组合类型定性。,8086/8088汇编语言的伪指令,5、表达式赋值伪指令 格式:名字 EQU 表达式 名字 = 表达式 操作:为表达式取一个名字,供以后引用 说明: 表达式可为常数、变量/标号、指令助记符、字符串 同一源程序中,用EQU赋值的符号不能再次赋值,而用=赋值的符号名可重复赋值。 赋值语句不产生目标代码,也不占有存储单元(汇编程序扫描时,用表达式替代符号),目的是方便更新和提高可读性。,示例: CONST EQU 100*2 ;定义符号常数 ADDRS EQU BX+10 ;为地址表达式定义名字,8086/8088汇编语言的伪指令,6、地址计数器和对准伪指令 (1)地址计数器$ 功能:保存当前正在汇编的指令(或数据)的地址 说明:$为有效地址EA(16位); 可参加构成表达式。,示例1:ARRAY DW 1,2,$+4,3,$+5 示例2:BUFFER DB 1,2,3,4,5 COUNT EQU $-BUFFER ;COUNT的值为BUFFER的长度,8086/8088汇编语言的伪指令,(2)定位伪指令 格式:ORG 表达式 操作:将表达式的值送入汇编地址计数器(即命令汇编程序从表达式值位置生成目标代码) 说明:若需相对$移动,则表达式=$+偏移量。,示例: D_SEG SEGMENT PARA DATA ORG 10H X DB 20H, 30H ORG $+5 Y DB 40H, 50H D_SEG ENDS,8086/8088汇编语言的伪指令,7、过程定义伪指令 格式:过程名 PROC 类型 ;过程体语句 RET 过程名 ENDP 操作:定义过程,供调用 说明: 可用CALL或END启动过程,用过程体中RET结束过程调用; 类型有NEAR和FAR两种(缺省时为NEAR),分别表示可以进行段内和段间调用。,8086/8088汇编语言的伪指令,顺序结构程序设计,结构化程序结构: 顺序结构 顺序结构是一种最简单、最基本的程序结构。顺序程序只由算术运算和逻辑运算指令构成,程序是按指令顺序逐条执行的。 分支(多路分支)结构 先判断条件,根据判断结果转向不同的分支。要用到条件测试和转移指令。 循环结构 能按一定规律,多次重复执行的一串语句,这类程序叫循环程序,流程图符号表示 (1)起止框:表示程序的开始和结束。 (2)判断框 (3)处理框 (4)调用框 (5)指向线/流向线 (6)连接框,起止框,顺序结构程序设计,【例1】求两个字节数AA与BB之和,并将结果显示出来。 分析:两个字节数相加。该程序可采用顺序程序,配合调用屏幕显示的DOS功能即可。但显示结果先要转换成ASCII码。,顺序结构程序设计,DATA SEGMENT AA DB 20H BB DB 10H DATA ENDS STA SEGMENT STACK DB 100 DUP(?) STA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STA START: MOV AX,DATA ;将数据段地址送数据段寄存器 MOV DS,AX,源程序:,顺序结构程序设计,MOV AL,AA ;求AA+BB ADD AL,BB MOV BL,AL ;保存AL的计算结果 MOV CL,4 SHR AL,CL AND AL,0FH ;屏蔽高4位 ADD AL,30H ;计算高位数的ASCII值 MOV DL,AL ;DOS功能调用,显示高位数 MOV AH,02H INT 21H,顺序结构程序设计,MOV AL,BL ;计算结果送AL AND AL,0FH ;屏蔽高4位 ADD AL,30H ;计算低位数的ASCII值 MOV DL,AL ;显示低位数 MOV AH,02H INT 21H MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,顺序结构程序设计,顺序结构程序设计,【例2 】内存中自 TABLE 开始的 10 个单元连续存放着 0 到 9 的平方值(称为平方表)。从键盘输入一位十进制数X(0X9),查表求 X 的平方值,并把结果存入 Y 单元。,DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81 ;定义平方表 Y DB ? DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP (?) ;定义100个字节空间 STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;置数据段寄存器,顺序结构程序设计,源程序:,MOV BX,OFFSET TABLE MOV AH,1 INT 21H ;DOS功能调用的1号子功能是键盘输入 SUB AL,30H ;返回值为ASCII码,存于AL中 MOV AH,0 ADD BX,AX ;查表 MOV AL,BX MOV Y,AL ;平方数存Y单元 MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,顺序结构程序设计,顺序结构程序设计,【例3 】内存中自 TABLE 开始的 10 个单元连续存放着 0 到 9 的平方值(称为平方表)。从键盘输入一位十进制数X(0X9),查表求 X 的平方值,并把结果存入 Y 单元。(要求使用直接查表指令完成),DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81 ;定义平方表 Y DB ? DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP (?) ;定义100个字节空间 STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;置数据段寄存器,顺序结构程序设计,源程序:,MOV BX,OFFSET TABLE MOV AH, 1 INT 21H ;DOS功能调用的1号子功能是键盘输入 SUB AL, 30H ;返回值为ASCII码,存于AL中 XLAT ;AL(BX)+(AL) MOV Y,AL ;平方数存Y单元 MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,顺序结构程序设计,分支结构程序设计,【例1】编程实现比较三个有符号双字节数的大小,并将其中最大的数送入MAX单元。 分析:该程序要对内存中的三个数进行比较,并将其中最大的数送入MAX单元中。为此,采用分支结构程序。 流程图为:,分支结构程序设计,分支结构程序设计,源程序:,DATA SEGMENT aa DW 100H bb DW -5 cc DW 20 MAX DW ? DATA ENDS STA SEGMENT STACK DB 100 DUP (?) STA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STA,分支结构程序设计,START: MOV AX,DATA ;送数据段地址到数据段寄存器 MOV DS,AX MOV AX,aa CMP AX,bb ;比较a、b大小 JG L1 ;ab转L1 MOV AX,bb CMP AX,cc ;比较b、c大小 JG L2 ;bc转L2 L: MOV AX,cc ;b=c,c送AX JMP L2 ;无条件转移到L2 L1: CMP AX,cc ;比较a、c大小 JNG L ;a=c转L,送c,分支结构程序设计,L2: MOV MAX,AX ;最大值AX送MAX MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,分支结构程序设计,【例2】求Y,分支结构程序设计,DATA SEGMENT XX DB -11 ;存放X YY DB ? ;存放Y DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP (0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX ;设置DS,源程序:,分支结构程序设计,MOV AL,XX CMP AL,0 JGE BIGER ;X0 带符号数比较指令 MOV AL,-1 ;X0,-1送入YY单元 JMP EQUL BIGER: JE EQUL ;ZF=1转移 MOV AL,1 ;X 0,1送入YY单元 EQUL: MOV YY,AL ;X=0, 0送入YY单元 MOV AH,4CH INT 21H CODE ENDS END START,分支结构程序设计,【例3】设字节单元N1、N2中存放无符号数 (1)若两个均是偶数,则分别加1后送D1 、D2中 (2)若两个均是奇数,则直接送D1 、D2中 (3)若一奇一偶,则把奇数送D1,偶数送D2中 流程图如下:,分支结构程序设计,分支结构程序设计,MOV AL,N1 MOV AH,N2 TEST AL,01H JNE ENDO ;N1奇数转 TEST AH,01H JNE L1 ;N2奇数转 INC AL ;两偶数 INC AH JMP ENDO L1: XCHG AL,AH ;交换 ENDO: MOV D1, AL ;存放结果 MOV D2, AH,分支结构程序设计,源程序:,跳转表法实现多路分支原理: 跳转表是在某内存区域顺序排列的一组有规律的语句串的入口地址。 如是段内分支,每个地址占两个单元(IP的值) 如是段间分支,每个地址占4个单元(CS:IP的值),分支结构程序设计,功能:解决需要重复操作的问题,如统计数据个数、多个字符传送等。 循环程序结构: (1)置循环初值部分。 对循环工作部分涉及的寄存器或存储单元设初值;使地址指针指向一个数据区的起始位置;设置循环次数或置循环结束条件等。 (2)循环体部分 也称循环工作部分,是循环程序需重复执行的部分,是循环程序的主体。 (3)循环控制部分 修改循环计数器的值,测试循环结束条件,控制循环次数。 (4)循环结束处理部分 进行循环结束后的数据分析、结果存放等处理。,循环结构程序设计,循环结构程序设计,循环控制方式:计数法(减量/增量)、条件控制法 循环类型:运行循环体、判断与控制的先后次序 常规应用方法: 已知循环次数 增量法:CMP+Jx指令 减量法:LOOP指令(结束计数为0) CMP+Jx指令(结束计数不为0) 未知循环次数 条件控制法:CMP/TEST+Jx+JMP指令,循环结构程序设计,【例1】编程统计BUF字节数据区中0的个数。(减量计数法) 分析:该程序要将数据区中的数据依次与0比较,所以采用循环程序实现,将比较、统计部分作为循环工作部分。 源程序:,DATA SEGMENT BUF DB 1,7,0,-4,0,6,-7,9,0,4 COUNT EQU $-BUF ;数据个数赋给COUNT NUM DW ? DATA ENDS STA SEGMENT STACK DB 100 DUP (?) STA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,循环结构程序设计,START: MOV AX,DATA MOV DS,AX LEA BX,BUF ;数据区首地址送BX MOV CX,COUNT ;赋循环初值 MOV DX,0 ;统计值为0 LOOP1: MOV AL,BX ;取第1个数 CMP AL,0 ;测试是否为0 JNE L1 ;不为0转L1取下一个数 INC DX ;为0,DX加1,取下一个数 L1: INC BX LOOP LOOP1 NEXT: MOV NUM,DX ;结果送NUM MOV AH,4CH ;返回DOS INT 21H CODE ENDS END START,循环结构程序设计,【例2】将以S1为起始地址的26个字母依次传送到以S2为起始地址的连续单元中。(减量计数法) DATA SEGMENT S1 DB ABCDXYZ DATA ENDS ESTRA SEGMENT S2 DB 26 DUP(?) ESTRA ENDS MOV AX, DATA MOV DS, AX ;数据段基址D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论