第3章 汇编语言程序设计 - Shandong University_第1页
第3章 汇编语言程序设计 - Shandong University_第2页
第3章 汇编语言程序设计 - Shandong University_第3页
第3章 汇编语言程序设计 - Shandong University_第4页
第3章 汇编语言程序设计 - Shandong University_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

1、第第4 4章章教学重点教学重点汇编语言源程序格式与开发汇编语言源程序格式与开发常量、变量和标号常量、变量和标号汇编语言程序设计方法汇编语言程序设计方法顺序程序设计顺序程序设计分支程序设计分支程序设计循环程序设计循环程序设计子程序设计子程序设计1、汇编语言简介汇编语言简介汇编语言是一种以处理器指令系统为基础的低级汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数采用标识符号表示指令操作数利用汇编语言编写程序的主要优点是可以直接、利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,因而

2、容易创建代码序列有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序短小、运行快速的可执行程序在有些应用领域,汇编语言的作用是不容置疑和在有些应用领域,汇编语言的作用是不容置疑和无可替代的无可替代的汇编程序设计的过程是与其他高级语言程序设计汇编程序设计的过程是与其他高级语言程序设计大致相同大致相同一、源程序的构成及特点一、源程序的构成及特点例:例: 1 data segment 2 sum db ? 3 data ends 4 code segment 5 assume cs:code,ds:data 6 begin: mov ax,data 7 mov ds,ax 8 mov

3、 sum,0 9 cycle: cmp sum,9 10 jna done 11 mov al,sum 12 out port,al 13 hlt 14 done:in al,port 15 add sum,al 16 jmp cyclk 17 code ends 18 end begin特点:特点:完整的汇编语言源程序由若干段组成,必须包含完整的汇编语言源程序由若干段组成,必须包含至少一个至少一个代码段,代码段,其他可有数据段、附加段或堆其他可有数据段、附加段或堆栈段,段与段之间的顺序可随意排列。栈段,段与段之间的顺序可随意排列。但一般数但一般数据段要放在代码段之前。据段要放在代码段之前。每

4、段以段定义语句每段以段定义语句segment开始,以开始,以ends结结束。束。每个代码段至少有一条设定代码段段基址的语句每个代码段至少有一条设定代码段段基址的语句assume ,其指明各段的段基址分别存于那个段,其指明各段的段基址分别存于那个段寄存器。寄存器。通常一条语句占一行。通常一条语句占一行。整个程序用整个程序用end结束,否则错误。结束,否则错误。 源程序由语句序列构成汇编语言(汇编语言(assembly language)用用助记符表示的指令以及使用它们编写程序的规则助记符表示的指令以及使用它们编写程序的规则。汇编(汇编(assembly)将汇编语言书写的将汇编语言书写的程序翻译成

5、机器语言程序的过程。程序翻译成机器语言程序的过程。汇编程序(汇编程序(assembler)将汇编语言将汇编语言书写的程序翻译成机器语言程序的软件。书写的程序翻译成机器语言程序的软件。不要与汇编语言程序这个说法混淆,后者不要与汇编语言程序这个说法混淆,后者表示用汇编语言书写的程序,或称汇编语表示用汇编语言书写的程序,或称汇编语言源程序。言源程序。汇汇 编编汇编过程汇编过程 asm86,masm86(宏汇编)(宏汇编)汇编语言的指令和机器语言的指令之间有汇编语言的指令和机器语言的指令之间有一一对应的关系。一一对应的关系。汇编程序的任务汇编程序的任务 汇编程序的任务是把汇编语言源程序模块转换为汇编程

6、序的任务是把汇编语言源程序模块转换为二进制的目标模块。二进制的目标模块。汇编程序把源文件转换为目标文件的过程需要对汇编程序把源文件转换为目标文件的过程需要对源文件进行两遍扫视。源文件进行两遍扫视。 汇编程序的输入是源文件(汇编程序的输入是源文件(asm),而主要输出),而主要输出是是obj文件和文件和lst文件。文件。第一遍扫视要确定源程序每一行的偏移地址,扫第一遍扫视要确定源程序每一行的偏移地址,扫视后应提供一张符号表(或称标识符表),它把源程视后应提供一张符号表(或称标识符表),它把源程序所定义符号的偏移地址记录下来。第二遍扫视则产序所定义符号的偏移地址记录下来。第二遍扫视则产生所要求的生

7、所要求的obj、lst和和cref文件。文件。汇编程序在两遍扫视的过程中用到的主要工具有汇编程序在两遍扫视的过程中用到的主要工具有:1 地址计数器(地址计数器(location counter)汇编的第一遍扫视过程中,地址计数器的值汇编的第一遍扫视过程中,地址计数器的值可以用来确定每条指令的第一个字的偏移地址及可以用来确定每条指令的第一个字的偏移地址及数据段中变量名的值,这样就可以建立一张符号数据段中变量名的值,这样就可以建立一张符号表。表。2 符号表符号表汇编程序对源程序第一遍扫视的过程中建立了符汇编程序对源程序第一遍扫视的过程中建立了符号表,它把用户所定义的符号赋予当前地址计数器的号表,它

8、把用户所定义的符号赋予当前地址计数器的值。值。3 机器指令表机器指令表它是一张固定的表格,给出所有指令的助记符及它是一张固定的表格,给出所有指令的助记符及其对应的机器指令代码信息。其对应的机器指令代码信息。4 伪操作表伪操作表给出所有伪操作名及有关信息。给出所有伪操作名及有关信息。汇编程序在第一遍扫视后建立了符号表,在第二遍扫汇编程序在第一遍扫视后建立了符号表,在第二遍扫视的过程中,根据符号表、机器指令表和伪操作表把视的过程中,根据符号表、机器指令表和伪操作表把汇编语言指令翻译成机器语言指令,完成汇编任务。汇编语言指令翻译成机器语言指令,完成汇编任务。二、汇编语言的语句格式二、汇编语言的语句格

9、式指令指令(执行执行)性语句性语句指令性语句用于表达指令性语句用于表达处理器命令处理器命令(也称硬指令也称硬指令),汇编后产生指令,汇编后产生指令代码。规定代码。规定cpu进行具体操作。进行具体操作。标号标号: 指令助记符指令助记符 操作数操作数,操作数操作数 ;注释注释指示指示(说明说明)性语句性语句指示性语句即伪指令,指示性语句即伪指令,不产生操作码不产生操作码,仅在汇编时起作用仅在汇编时起作用,指示源程指示源程序如何汇编、变量怎样定义、过程怎么设序如何汇编、变量怎样定义、过程怎么设置等置等名字名字 伪指令助记符伪指令助记符 参数参数,参数参数, ;注释注释三、三、asm86的标记的标记1

10、、标号、名字与标识符、标号、名字与标识符标号标号是反映硬指令位置(逻辑地址)和属性的标是反映硬指令位置(逻辑地址)和属性的标识符,后跟一个冒号分隔识符,后跟一个冒号分隔名字名字是反映伪指令位置(逻辑地址)和属性的标是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格没有冒号识符,后跟空格没有冒号标识符标识符(identifier)必须以字母开头;可以由字)必须以字母开头;可以由字母、数字、下划线组成,默认情况下,不区别字母、数字、下划线组成,默认情况下,不区别字母大小写;一般最多由母大小写;一般最多由31个字符,再长忽略不计。个字符,再长忽略不计。一个源程序中,每个标识符的定义是唯一的,还一个

11、源程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的不能是汇编语言采用的保留字。保留字。(masm,由字母数字和特殊字符由字母数字和特殊字符?. _ $组成)组成)例例 标号、名字和标识符标号、名字和标识符data segmentsum db ?data endscode segment assume cs:code,ds:databegin: mov ax,data mov ds,ax 例、判断下列标识符是否符合要求例、判断下列标识符是否符合要求 m、pt3、m2n、wmu、86ase、 fgr#、f¥、¥、”hg”、aaa、loop、 bdh1、kl l、3xd、g65、h7s32、

12、保留字、保留字保留字(保留字(reserved word)是汇编语言中有特定意)是汇编语言中有特定意义的字符(也称为关键字),主要有:义的字符(也称为关键字),主要有:指令助记符指令助记符例如:例如:mov、add伪指令助记符伪指令助记符例如:例如:db、dw操作符操作符例如:例如:offset、ptr寄存器名寄存器名例如:例如:ax、cs其他的保留字其他的保留字关系运算符等关系运算符等 例如:例如:abs、byte、dup、common、le、low、seg、eq。 汇编语言大小写不敏感3、界符(定义符)界符(定义符)除字母、数字以外的除字母、数字以外的8086允许使用的符号,允许使用的符号

13、,可以做分隔符及表示一定的意义。可以做分隔符及表示一定的意义。 如:如:+、-、*、/、=、,、;、:等等。、,、;、:等等。4、常数指令中出现的固定值、立即数、地址、常数指令中出现的固定值、立即数、地址等等 范围范围 065535可以有二进制(可以有二进制(b)、十进制、八进制()、十进制、八进制(q)、)、十六进制(十六进制(h)和字符串常数。)和字符串常数。 十进制十进制由由0 9数字组成,以字母数字组成,以字母d(d)结)结尾(缺省情况可以省略)尾(缺省情况可以省略)100,255d十六进制十六进制由由0 9、a f数字组成,以字母数字组成,以字母h(h)结尾,以字母开头的常数需要)结

14、尾,以字母开头的常数需要加一个前导加一个前导064h,0ffh0b800h二进制二进制由由0和和1两个数字组成,以字母两个数字组成,以字母b(b)结尾结尾01100100b字符串常量是用单引号或双引号括起来的字符串常量是用单引号或双引号括起来的单个字符或多个字符单个字符或多个字符其其数值是每个字符对应的数值是每个字符对应的ascii码值码值例如:例如:d(等于(等于64h)ab(等于(等于4142h)hello, assembly !5、注释、注释语句中由分号语句中由分号“;”开始的部分为注释内容,开始的部分为注释内容,用以增加源程序的可读性用以增加源程序的可读性汇编程序在翻译源程序时将跳过该

15、部分,不汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理,对它们做任何处理, 只在打印源程序时照原只在打印源程序时照原样打印。样打印。变变 量量变量变量代表存放在某些存储单元的数据,这些数据在程序运代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以修改。行期间随时可以修改。为了便于对变量的访问,它常常以变量名的形式出现为了便于对变量的访问,它常常以变量名的形式出现在程序中,它可以认为是存放数据存储单元的符号地在程序中,它可以认为是存放数据存储单元的符号地址。址。 (1)变量的定义与预置:定义变量就是给变量分配存储变量的定义与预置:定义变量就是给变量分配存储单元且对这个存储单元赋

16、于一个符号名单元且对这个存储单元赋于一个符号名(变量名变量名),同,同时将这些存储单元预置初值。时将这些存储单元预置初值。 定义变量是用数据定义伪指令定义变量是用数据定义伪指令db,dw,dd等。例等。例如:如:变变 量量段属性段属性(seg):表示变量存放在哪一个逻辑段中:表示变量存放在哪一个逻辑段中(即变即变量所在段的段基值);量所在段的段基值);偏移量属性偏移量属性(offset):表示变量在逻辑段中离段起始:表示变量在逻辑段中离段起始点的字节数;点的字节数;类型属性类型属性(type):表示变量占用存储单元的字节数。:表示变量占用存储单元的字节数。变变 量量(2)数据定义伪指令:这种伪

17、指令主要为数数据定义伪指令:这种伪指令主要为数据项分配存储单元并预置初值。据项分配存储单元并预置初值。四、表达式四、表达式数值表达式一般是指由数值表达式一般是指由运算符运算符连接的各种常量所连接的各种常量所构成的表达式构成的表达式汇编程序在汇编过程中计算表达式,最终得到一汇编程序在汇编过程中计算表达式,最终得到一个确定的数值,所以也是常量个确定的数值,所以也是常量表达式的数值在程序运行前的汇编阶段计算,所表达式的数值在程序运行前的汇编阶段计算,所以组成表达式的各部分必须在汇编时就能确定以组成表达式的各部分必须在汇编时就能确定汇编语言支持多种运算符汇编语言支持多种运算符我们经常使用的是加减乘除(

18、我们经常使用的是加减乘除( * / )例如:例如:mov ax,3*4+5;等价于:;等价于:mov ax,171、操作数、操作数 可能是一个数据或是一个内存单元的地址可能是一个数据或是一个内存单元的地址 常用标号表示常用标号表示 如:如:port表示端口地址表示端口地址 存储器单元地址也常用标号表示存储器单元地址也常用标号表示 如:如: start:mov ax, data1 ;start表示本条指令所在的地址表示本条指令所在的地址 data1表示数据地址表示数据地址 其为物理地址包含段基址和偏移量其为物理地址包含段基址和偏移量2、运算符、运算符 用运算符对一个或多个操作数进行运算,形成表用

19、运算符对一个或多个操作数进行运算,形成表达式。达式。算术运算符算术运算符+、-、*、/、mod(取余)(取余) 如:如:5+2-3*2 (=1) 19mod7 (=5) 对地址运算只能用对地址运算只能用+、-,其余无意义,其余无意义 如:如:start+2、sum-5 等等 应用举例:应用举例:p139逻辑运算符逻辑运算符 and、or、not、xor 逻辑运算按位进行,操作数必须是数据,结果也逻辑运算按位进行,操作数必须是数据,结果也是数据是数据 如:如:77h and 84h (=04h) not 80h (=7fh) 注意:注意:上述逻辑运算符与上述逻辑运算符与8086指令形式相同,但指

20、令形式相同,但有本质区别,指令在执行时由有本质区别,指令在执行时由cpu完成,逻辑运完成,逻辑运算符在汇编时完成算符在汇编时完成如:如: and al,86h and port 设设port=foh 则汇编后本指令为:则汇编后本指令为: and al,80h关系运算符关系运算符 6种种 相等相等 eq 不等不等 ne 小于小于 lt 大于大于 gt 小于等于小于等于 le 大于等于大于等于 ge 关系运算符的操作数是关系运算符的操作数是2个数据,或同一段个数据,或同一段中中2个存储单元的地址,汇编的结果:个存储单元的地址,汇编的结果: 关系成立值为关系成立值为 ffffh 不成立值为不成立值为

21、0 例:例:mov bx, port lt 50h 当当port50时,上条指令相当于时,上条指令相当于 mov bx,0例:例:mov bx,(,( port lt 5)and20) or( port gt 5)and30) 如:如: port lt 5 成立成立 则为则为mov bx,20h port gt 5 成立成立 则为则为mov bx,30h分析运算符和综合(合成)运算符分析运算符和综合(合成)运算符 将存储单元的地址分解为段基址、偏移量将存储单元的地址分解为段基址、偏移量或者定义类型等。或者定义类型等。 5个分析运算符个分析运算符lseg:取内存单元的段基址:取内存单元的段基址

22、如如 mov ax,seg data mov ds,axloffset 取内存单元的偏移量取内存单元的偏移量 如:如: mov bx,offset dat1l type 运算符返回一个数值表示存储单元运算符返回一个数值表示存储单元的类型的类型 规定:字节规定:字节1 字字2 双字双字4 如:如:mov al,type dat1 ;若;若dat1已定义为字节已定义为字节 则则al=1llength 长度长度 计算一个已定义的存储区中存储单元的数目计算一个已定义的存储区中存储单元的数目 注意:不是字节数,而是按照定义时的类型注意:不是字节数,而是按照定义时的类型为基本单位计算为基本单位计算 如:如

23、:kam dw 100 dup(?)(?) 则:则:length kam (=100) 应用应用 mov cx, length buffl size 尺寸尺寸 计算一个已定义的存储区的字节数计算一个已定义的存储区的字节数 size=length*type 如上例中如上例中 size kam (=200) 另有另有2个综合运算符个综合运算符lptr 用它规定存储单元的类型,要与用它规定存储单元的类型,要与byte、word、dword联合使用联合使用例:例: mov byte ptr 2100h,0 not word ptr si另外:另外:ptr 也可以改变一个已经规定了类型也可以改变一个已经

24、规定了类型的存储单元的类型,但不另分配存储器。的存储单元的类型,但不另分配存储器。例:例:data段中段中 xyz dw 10 dup(?)(?) 然后用然后用 pp equ byte ptr xyz qq equ byte ptr xyz+1 kk equ dword ptr xyz+2则:则:xyz、xyz+1单元为字节单元为字节 xyz+2xyz +5单元为双字单元为双字 其余单元为字单元。其余单元为字单元。lthis 与与ptr相似用来改变存储区的类型。相似用来改变存储区的类型。 不开辟新单元,与不开辟新单元,与equ联用联用 例:例:xyz-2 equ this byte xyz-1

25、 equ this byte xyz dw ? 则:则: xyz-1=xyz xyz-2=xyz+1 使用使用xyz-1、xyz-2时为字节单元时为字节单元 使用使用xyz时为字单元。时为字单元。 相当于:相当于: xyz dw? xyz-1 equ byte ptr xyz xyz-2 equ byte ptr xyz+1 this 常将常将equ this右边的类型或距离赋右边的类型或距离赋给左边的变量或标号。给左边的变量或标号。五、伪指令五、伪指令1、标号赋值伪指令、标号赋值伪指令 equ 给标号定义数值或其他标号给标号定义数值或其他标号 形式:形式: 标号标号 equ 表达式(数据或地

26、址)表达式(数据或地址) 标号标号 equ 旧标号(已赋值)旧标号(已赋值) 如:如:bold equ 212 new equ port+2 count equ cx cdb1 equ ade 用用equ定义过的标号未解除前不能重新定义,不用定义过的标号未解除前不能重新定义,不用的标号可以解除。的标号可以解除。 解除语句:解除语句:purge 形式:形式:purge 标号标号1,标号,标号2,.标号标号n2、定义存储单元的伪指令、定义存储单元的伪指令 规定存储单元的内容、长度及类型,最常用的是规定存储单元的内容、长度及类型,最常用的是db、dw 例:例: cr db 0dh buff dw 3

27、211h do2 db ? thig dw 10 dup(?) st db how are you ? table db 00,01,03,02,06,04,05,07 db 0fh,0eh,0ch,0dh,09,0bh,0ah,08 alph db 5 dup(1,2,4dup(3),2dup(1,0) 定义时可以用表达式定义时可以用表达式 如:如:in-port db port out-port db por+1l dd 定义双字定义双字 dq 定义定义4个字个字 dt 定义定义10个字个字3、定义单元类型的伪指令、定义单元类型的伪指令 byte、word、dword常用在指令中常用在指令

28、中 如:如:mov byte ptr di,0 inc word ptr bx+si jmp dword ptr 2000h4、段定义伪指令、段定义伪指令 segment、ends、assume、org 在运行程序时,每条语句、所用数据等都在某一在运行程序时,每条语句、所用数据等都在某一段中,因此因该给段起名字,规定段的起始地址,段中,因此因该给段起名字,规定段的起始地址,说明于其它段的关系等,要用段定义为指令。说明于其它段的关系等,要用段定义为指令。一般用法:段名一般用法:段名 segment ;段起始段起始 段名段名 ends ;段结束段结束 另外另外: segment后可写后可写定位类型

29、定位类型联系类型联系类型分类名分类名 定位类型可用低定位类型可用低4位为位为0、紧接起始、偶地址起始等、紧接起始、偶地址起始等 联系类型可规定各段不连接、同名连接等联系类型可规定各段不连接、同名连接等分类名用单引号引起,在连接时起作用。分类名用单引号引起,在连接时起作用。l 段设定语句段设定语句 每个代码段中至少一条段设定语句,每个代码段中至少一条段设定语句,用来设定段寄存器的内容用来设定段寄存器的内容 一般形式:一般形式: assume cs:code,ds:data, ss:stack,es:data 除除cs外,外,ds、ss、es还需用还需用mov指令完成传送。指令完成传送。 另外形式

30、:另外形式:assume nothing 表示删除原设定过的段寄存器的内容。表示删除原设定过的段寄存器的内容。lorg 规定目标程序存放的偏移地址规定目标程序存放的偏移地址 形式:形式:org 200h例:例: data segment m1 db2,3,4,5 ; m1偏移地址为偏移地址为0 data ends 比较:比较:data segment org 2000h m1 db2,3,4,5; m1偏移地址为偏移地址为2000h data ends 5、过程定义语句过程定义语句 proc、endp、near、far 定义过程:标号定义过程:标号 proc . . 标号标号 endpnear

31、 表示段内调用形式如下表示段内调用形式如下: 标号标号 proc near (可省略可省略)far 表示段间调用形式如下表示段间调用形式如下: 标号标号 proc far 6、源程序结束伪指令、源程序结束伪指令 end 告诉汇编源程序到此结束,必须有告诉汇编源程序到此结束,必须有end指指 令,否则汇编出现错误。令,否则汇编出现错误。 形式:形式:end 表达式(标号)表达式(标号) 表达式的作用是将第一条指令的地址自动装表达式的作用是将第一条指令的地址自动装入入cs和和ip。 例例 :多字节相加:多字节相加 data segment first db 11h,22h,33h,44h seco

32、nd db 55h,66h,77h,88h sum db 20 dup(?) data ends stack segment sta db 20 dup(?) top equ length sta stack endscode segment assume cs:code,ds:data,ss:stackstart: mov ax, data mov ds,ax mov ax, stack mov ss,ax mov ax, top mov sp,ax mov si, offset first mov di, offset sum mov bx, offset second mov cx, 0

33、4 cld clc aditi: call aaa1 loop aditi . . . aaa1 proc near lodsb adc al, bx daa stosb inc bx ret aaa1 endp code ends end start2 程序设计的基本方法及实例程序设计的基本方法及实例一、程序设计基本步骤一、程序设计基本步骤 分析问题,明确要求。分析问题,明确要求。建立数学模型。建立数学模型。确定算法。确定算法。画程序流程图。画程序流程图。编写程序。编写程序。上机调试。上机调试。1、算法、算法(algorithm) 算法是对特定问题求解步骤的一种描述,是指令算法是对特定问题求

34、解步骤的一种描述,是指令的有限序列。每一条指令表示一个或多个操作。的有限序列。每一条指令表示一个或多个操作。(1)有穷性。有穷性。一个算法必须在有穷步之后结束,即必须在有限一个算法必须在有穷步之后结束,即必须在有限时间内完成。时间内完成。(2)确定性。确定性。算法的每一步必须有确切的定义。算法的执行对算法的每一步必须有确切的定义。算法的执行对应着的相同的输人仅有惟一的一条路径。应着的相同的输人仅有惟一的一条路径。(3)可行性。可行性。算法中的每一步都可以通过已经实现的基本运算算法中的每一步都可以通过已经实现的基本运算的有限次执行得以实现。的有限次执行得以实现。(4)输入。输入。一个算法具有零个

35、或多个输人,这些输人取自特定一个算法具有零个或多个输人,这些输人取自特定的数据对象集合。的数据对象集合。(5)输出。输出。一个算法具有一个或多个输出,这些输出同输人之一个算法具有一个或多个输出,这些输出同输人之间存在某种特定的关系。间存在某种特定的关系。一个一个好的算法好的算法通常要考虑以下的通常要考虑以下的要求要求:(1)正确。正确。算法的执行结果应当满足预先规定算法的执行结果应当满足预先规定的功能和性能要求。的功能和性能要求。(2)可读。可读。一个算法应当思路清晰、层次分明、一个算法应当思路清晰、层次分明、简单明了、易读易懂。简单明了、易读易懂。(3)健壮。健壮。当输入不合法数据时,能作正

36、当处当输入不合法数据时,能作正当处理,不至引起严重后果。理,不至引起严重后果。(4)高效。高效。有效使用存储空间和有较高的时间有效使用存储空间和有较高的时间效率。效率。2、程序流程图、程序流程图程序流程图是通过使用各种形状的框,用程序流程图是通过使用各种形状的框,用来表示各种不同的操作,框内文字由人们来表示各种不同的操作,框内文字由人们根据操作的需要指定,应当是明确而无根据操作的需要指定,应当是明确而无“歧义性歧义性”的。带箭头的流程线,用来表的。带箭头的流程线,用来表示操作的顺序,即指向下一步的操作,用示操作的顺序,即指向下一步的操作,用流程图表示算法形象直观、流向清楚。流程图表示算法形象直

37、观、流向清楚。程序流程图潜在的缺点:允许流程线向任程序流程图潜在的缺点:允许流程线向任意方向转移,这可能出现意方向转移,这可能出现“乱麻式乱麻式”流程,流程,有时使人难以看懂其来龙去脉(可用有时使人难以看懂其来龙去脉(可用n-s结结构化流程图)。构化流程图)。3、基本程序结构、基本程序结构顺序结构顺序结构 也就是顺序执行结构,它是最基也就是顺序执行结构,它是最基本、最常用的结构。所谓顺序执行,就是本、最常用的结构。所谓顺序执行,就是按照程序语句行的自然顺序,一条语句按按照程序语句行的自然顺序,一条语句按一条语句地执行程序。一条语句地执行程序。选择结构选择结构 包括简单选择和多分支选择结构,包括

38、简单选择和多分支选择结构,这种结构可以根据设定的条件,控制语句这种结构可以根据设定的条件,控制语句流程,有选择地执行不同的语句序列。流程,有选择地执行不同的语句序列。重复结构重复结构 是用于在某些程序中,常常需要是用于在某些程序中,常常需要重复使用某一段相同的或类似的程序段,重复使用某一段相同的或类似的程序段,利用重复结构可简化大量的程序行。利用重复结构可简化大量的程序行。二、顺序结构程序设计及实例二、顺序结构程序设计及实例没有分支、循环等转移指令的程序,会按没有分支、循环等转移指令的程序,会按指令书写的前后顺利依次执行,这就是顺指令书写的前后顺利依次执行,这就是顺序程序序程序顺序结构是最基本

39、的程序结构顺序结构是最基本的程序结构完全采用顺序结构编写的程序并不多见完全采用顺序结构编写的程序并不多见例例1、将内存单元、将内存单元dat1中的组合中的组合bcd码变换成两个码变换成两个非组合非组合bcd码,存于其后面的两个单元。码,存于其后面的两个单元。 data segment dat1 db 76h,2dup(?)(?) data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov si,offset dat1 mov al,si and al,0fh mov si+1,al mov al,s

40、i and al, 0f0h mov cl,4 ror al,cl mov si+2,al hltcode ends end start 问题一:如要将问题一:如要将2个非组合个非组合bcd码变为组合码变为组合bcd码怎么办?码怎么办?问题二:如要将问题二:如要将1个组合个组合bcd码变为码变为2个个asc码码怎么办?怎么办?问题三:如要将问题三:如要将2个个asc码变为组合码变为组合bcd码怎码怎么办?么办?例例2、从键盘中键入、从键盘中键入09中的任意自然数中的任意自然数x,求其立,求其立方值。利用查表法,构建方值。利用查表法,构建09的立方表,字节变的立方表,字节变量量x存放键入的自然数

41、,其立方值存于下面的单存放键入的自然数,其立方值存于下面的单元。元。 data segment tab dw 0h,1h,8h,27h,64h,125h, dw 216h, 343h,512h,729h x db ? xxx dw ? data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov bx, offset tab mov si, offset x mov ah,1 int 21h and al,0fh mov si,al add al,al mov ah,0 add bx,ax mov a

42、x,bx mov si+1,ax mov ah,4ch int 21h code ends end start问题:可否直接查表指令?为什么?问题:可否直接查表指令?为什么? 三、分支程序设计及实例三、分支程序设计及实例分支程序根据条件是真或假决定执行与否分支程序根据条件是真或假决定执行与否判断的条件是各种指令,如判断的条件是各种指令,如cmp、test等等执行后形成的状态标志执行后形成的状态标志转移指令转移指令jcc和和jmp可以实现分支控制可以实现分支控制分支结构有分支结构有单分支结构单分支结构双分支结构双分支结构多分支结构多分支结构1、单分支结构、单分支结构 条件成立跳转,否条件成立跳转

43、,否则顺序执行分支语则顺序执行分支语句体句体注意选择正确的条注意选择正确的条件转移指令和转移件转移指令和转移目标地址目标地址例例1、从端口地址为、从端口地址为port1的输入端口输入数值,的输入端口输入数值,与预定值相比,将差额的绝对值反馈给控制端口与预定值相比,将差额的绝对值反馈给控制端口port2 data segment a db 50h ;设预定值;设预定值 data ends code segment assume cs:code,ds:data go: mov ax,data mov ds,ax mov bl,a in al,port1 cmp al,bl jg lb1 xchg

44、al,bl lb1: sub al,bl out port2,alcode ends end go问题一:求差的绝对值还有其他方法吗?问题一:求差的绝对值还有其他方法吗?解答:解答:一、先减,为正即为绝对值,为负,需求补。一、先减,为正即为绝对值,为负,需求补。2、双分支结构、双分支结构条件成立跳转执行第条件成立跳转执行第2个个分支语句体,否则顺序执分支语句体,否则顺序执行第行第1个分支语句体个分支语句体注意注意:第:第1个分支体后一个分支体后一定要有一个定要有一个jmp指令跳到指令跳到第第2个分支体后个分支体后问题:分支程序中最需要问题:分支程序中最需要注意的指令是哪一条?注意的指令是哪一条

45、?jmp指令指令例、内存单元中有一数例、内存单元中有一数x(8位无符号),按下式计位无符号),按下式计算算y值,并将值,并将y值存于值存于x后面的单元后面的单元 data segment x db 42h y dw ? data endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov al,x mov ah,0 cmp ax,50 jnb lop1 mov bx,ax mul bx mov dx,bx mov cl,2 shl bx,cl add bx,dx sub ax,bx add ax,20 jmp

46、lop2lop1: mov bx,ax shl ax,1 add ax,bx add ax,100 lop2: mov y,ax hlt code ends end start问题一:如问题一:如x是有符号数怎么办?是有符号数怎么办?问题二:如问题二:如x是是16位数怎么办?位数怎么办?问题三:如问题三:如x是是bcd码怎么办?码怎么办?3、多分支结构、多分支结构例、将某班同学的成绩按优、良、中、及格、不及例、将某班同学的成绩按优、良、中、及格、不及格分类统计人数。格分类统计人数。设设 a:优(:优(5) b:良(:良(4) c:中(:中(3) d:及格(:及格(2) e:不及格(:不及格(1

47、) data segment a db 0 b db 0 c db 0 d db 0 e db 0 data ends code segment assume cs:code,ds:data begin: mov ax,data mov ds,ax mov ah,1 int 21h a1 : cmp al,5 jne b1 inc a jmp nextb1 : cmp al,4 jne c1 inc b jmp nextc1 : cmp al,3 jne d1 inc c jmp nextd1 : cmp al,2 jne e1 inc d jmp nexte1 : cmp al,1 jne

48、next inc enext: mov ah,4ch int 21h code ends end begin编写分支程序要注意的问题编写分支程序要注意的问题1、条件转移语句的转移范围在、条件转移语句的转移范围在-128+127字字节之间,若超出此范围要和无条件转移语节之间,若超出此范围要和无条件转移语句联合使用句联合使用 例例 la lop1 lop1: jmp lop2 lop2: 2、分支程序编写时要注意每个分支的出口位、分支程序编写时要注意每个分支的出口位置,如果程序复杂,要画流程图或置,如果程序复杂,要画流程图或n-s结构结构化流程图化流程图3、利用间接转移的方式,可以实现动态转移、利

49、用间接转移的方式,可以实现动态转移 如:如:sw dw lm0,lm1,lm2,.,lmn 在:在:code中可使用以下语句中可使用以下语句 mov si, n ;n为为n的的2倍倍 jmp sw+si 三、循环程序设计三、循环程序设计循环程序结构循环程序结构是满足一定条件的情况下,是满足一定条件的情况下,重复执行某段程序重复执行某段程序循环结构的程序通常有循环结构的程序通常有3个部分:个部分: 循环初始部分循环初始部分为开始循环准备必要的条件,为开始循环准备必要的条件,如循环次数、循环体需要的数值等如循环次数、循环体需要的数值等 循环体部分循环体部分指重复执行的程序部分,其中指重复执行的程序

50、部分,其中包括对循环条件等的修改程序段包括对循环条件等的修改程序段循环控制部分循环控制部分判断循环条件是否成立,决判断循环条件是否成立,决定是否继续循环定是否继续循环循环控制循环控制循环结构程序循环结构程序的设计关键是循环控制部分的设计关键是循环控制部分循环控制可以在进入循环之前进行,也可循环控制可以在进入循环之前进行,也可以在循环体后进行,于是形成两种结构:以在循环体后进行,于是形成两种结构:“先判断、后循环先判断、后循环”结构结构“先循环、后判断先循环、后判断”结构结构循环结束的控制可以用循环次数,还可以循环结束的控制可以用循环次数,还可以用特定条件等,于是又有:用特定条件等,于是又有:计

51、数控制循环计数控制循环条件控制循环条件控制循环先循环后判断的循环结构先循环后判断的循环结构1、 计数控制循环计数控制循环 计数控制循环计数控制循环利用利用循环次数循环次数作为控制条件作为控制条件易于采用循环指令易于采用循环指令loop和和jcxz实现实现初始化:将循环次数或最大循初始化:将循环次数或最大循环次数置入环次数置入cx循环体循环体循环控制:用循环控制:用loop指令对指令对cx减减1、并判断是否为、并判断是否为0例例1、数据块是带符号的、数据块是带符号的8位二进制数,要求位二进制数,要求把其中的正负数分开,分别存在其后的存把其中的正负数分开,分别存在其后的存储区中。储区中。 data

52、 segment da1 db 25h, bdh, 7fh,94h,65h,a5h da2 db 20dup(?) ; 正数正数 da3 db 20dup(?) ; 负数负数 data endscode segment assume cs:code, ds: datastart: mov ax , data mov ds, ax mov es, ax lea si, da1 lea di, da2 lea bx, da3 mov cx, 20go1: lods b test al,80 jnz neg1 stosb jmp nextneg1: xchg bx, di stosb xchg bx

53、,dinext: loop go1 hltcode ends end start问题:还需要要统计正、负数的个数该如何问题:还需要要统计正、负数的个数该如何处理?处理?例例2:内存中连续存放:内存中连续存放10个个8位无符号数,计位无符号数,计算其平均值,并将其存入其后的一个单元。算其平均值,并将其存入其后的一个单元。data segmentda1 db 35h,7bh,64h,89h,a2h 10个数个数da2 db ?data endscode segment assume cs:code, ds : databegin: mov ax,data mov ds,ax lea bx,da1;

54、 lea di,da2; mov cx,10; xor ax,ax;lp1: add al,bx ; jnc m1 ; inc ah ;m1: inc bx ; loop lp1 ; mov bl, 10 ; div bl ; mov di, alcode ends end begin 问题一:问题一: 注意高注意高8位的处理?位的处理? 问题二:如是问题二:如是bcd码如何处理?码如何处理? 个数等于个数等于10 xor ax, ax mov cl , 4 lp1: add al, bx shr ax , cl daa mov di , al adc ah,0 inc bx loop lp1

55、 个数大于个数大于10 ,求累加和求累加和 xor ax, ax lp1: add al, bx daa xchg al,ah adc al,0 daa xchg al,ah inc bx loop lp12 .条件控制循环条件控制循环条件控制循环需要利用特定条件判条件控制循环需要利用特定条件判断循环是否结束断循环是否结束条件控制循环用条件转移指令判断条件控制循环用条件转移指令判断循环条件循环条件转移指令可以指定目的标号来改变转移指令可以指定目的标号来改变程序的运行顺序,如果目的标号指程序的运行顺序,如果目的标号指向一个重复执行的语句体的开始或向一个重复执行的语句体的开始或结束,便构成了循环控

56、制结构结束,便构成了循环控制结构显示以显示以0结尾的字符串结尾的字符串;数据段;数据段string db let us have a try !,0;代码段;代码段mov bx,offset stringagain: mov dl,bxcmp dl,0jz done;为;为0结束结束mov ah,2;不为;不为0,显示,显示int 21hinc bx;指向下一个字符;指向下一个字符jmp againdone:记录某个字存储单元数据中记录某个字存储单元数据中1的个数的个数;数据段数据段number dw 1110111111100100b;代码段代码段mov bx,numberxor dl,dl

57、;循环初值:;循环初值:dl0again:test bx,0ffffh ;也可以用;也可以用cmp bx,0jz done;全部是;全部是0就可以退出循环,减少循环次数就可以退出循环,减少循环次数shl bx,1;用指令;用指令shr bx,1也可以也可以adc dl,0;利用;利用adc指令加指令加cf的特点进行计数的特点进行计数jmp again3、多重循环(循环嵌套)、多重循环(循环嵌套)u 循环之中还有循环,可以多次嵌套,典型例子双循环之中还有循环,可以多次嵌套,典型例子双重循环。重循环。例:将一组数据按一定的顺序(大小)排列。例:将一组数据按一定的顺序(大小)排列。基本方法:基本方法

58、:1 1、两两相比(沉底法)、两两相比(沉底法) 大循环用交换标志控制,有交换继续,否则停止大循环用交换标志控制,有交换继续,否则停止。 小循环利用循环次数控制,循环次数依次递减。小循环利用循环次数控制,循环次数依次递减。 2 2、依次相比法(冒泡法)、依次相比法(冒泡法) 大、小循环用都利用循环次数控制,大循环大、小循环用都利用循环次数控制,大循环n-1n-1次,小循环从次,小循环从n-1n-1开始,并依次递减开始,并依次递减 将一组将一组16位有符号数按从大到小的顺序排列位有符号数按从大到小的顺序排列data segmentarray dw 1234h,5376h, 796ah,., 0a

59、b10hcount equ length arraydata endsstack segmentstapn dw 100 dup(?)top equ length stapnstack endscode segment assume cs: code, ds:data ,ss:stack start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov ax, top mov sp, ax mov bl, 0ffh; a1: cmp bl, 0ffh jne a4 ; xor bl,bl mov cx, count-1; xor si, s

60、i ; a2: mov ax, si+array; cmp ax,si+array+2; jge a3 xchg si+array+2, ax; mov si+array,ax mov bl,0ffh;a3: inc si; inc si; loop a2; jmp a1; a4: hltcode ends end start循环程序应用举例循环程序应用举例例例1: 将存储器将存储器al中的二进制数变为十进制后,取转中的二进制数变为十进制后,取转变后的百位数放在寄存器变后的百位数放在寄存器dl中中 kiok db 100 lea bx , kiok ; mov al,0f3h ; cvdec:

温馨提示

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

评论

0/150

提交评论