slide1 n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
第 章 汇编语言程序设计 PowerPoint Presentation
Download Presentation
第 章 汇编语言程序设计

Loading in 2 Seconds...

play fullscreen
1 / 61

第 章 汇编语言程序设计 - PowerPoint PPT Presentation


  • 147 Views
  • Uploaded on

概述. 简单程序. 查表程序. 子程序. 应用举例. 优秀程序评价标准. 分支程序. 循环程序. 第 章 汇编语言程序设计. Single Chip Microcomputer. 本章内容. 程序设计概述—设计语言. 最早人们只能用 机器语言 (二进制)编写程序; 为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为 低级语言 。然后再用汇编系统将其翻译成机器语言,该过程称为 汇编 ; 为了用更接近人的语言编写程序,程序设计师们发明了 高级语言 ,如: BASIC、FORTRAN、PASCAL、

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '第 章 汇编语言程序设计' - deliz


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

概述

简单程序

查表程序

子程序

应用举例

优秀程序评价标准

分支程序

循环程序

第章汇编语言程序设计

Single Chip Microcomputer

本章内容

slide2
程序设计概述—设计语言
  • 最早人们只能用机器语言(二进制)编写程序;
  • 为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编;
  • 为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如: BASIC、FORTRAN、PASCAL、
  • C、JAVA

然后再用编译系统将其翻译成机器语言,该过程称为编译;

  • 机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编语言编写的源程序汇编成机器语言;
  • 由低级或高级语言构成的程序称为源程序,由机器语言构成的程序称作目标程序;
slide3
源程序 目标程序

汇编

低级语言

机器语言

编译

高级语言

机器语言

slide4
程序设计实例引入
  • 实例

假设一个班有50个人,

共有3门选修课:

  • 计算机算法
  • 服装CAD设计
  • 德语

请找出:

  • 同时选了三门课的同学;
slide5

计算机算法

服装CAD设计

德语

5

2

4

12

25

12

23

39

25

25

29

29

39

39

问题的解决
  • 第一步

如何在计算机中表示选修某门课的所有同学

选修这门人数

学生的学号

这个过程实际上是设计数据结构的问题

slide6

计算机算法

CAD设计

德语

问题的解决
  • 第二步

设计思路:找出同时选了三门课的同学

这个过程实际上是设计算法的过程,既构建模型。

slide7

找出第一个学生

N

他选计算机吗?

Y

N

他选了德语吗?

Y

N

他选了CAD吗?

Y

记录要找的人

N

还有学生吗?

Y

结束

下一个学生

第三步:设计流程

重复该过程

slide8
几点启示
  • 整体构思;
  • 构建整体流程框图;
  • 结构合理,流程清晰,简单明了;
  • 局部模块化;
slide9
为什么要用流程图?
  • 符合人进行逻辑思考的习惯
  • 计算机从根本上来说,没有任何逻辑性,所以,你必须告诉它,先做什么,后做什么,遇到什么情况又该做什么,等等
  • 流程图设计本身是一个逐步求精的过程,最终将任务划分为若干能由机器指令实现的小模块
slide10

·

·

·

·

·

·

·

·

·

B

A

22H

21H

20H

简单程序设计

结构特点: 按指令的先后顺序依次执行。

例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100)

什么是BCD码?

什么是ASII码?

高四位ASII码

0011

低四位ASII码

0011

压缩BCD码

0011

0100

slide11

方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。

方法2:利用半字节交换指令来实现。

slide12

开始

·

·

·

(20H)A

·

·

·

·

·

·

10HB

A/B (A中为高4位BCD码,B中为低4位BCD码)

PC

PC

PC

PC

PC

PC

PC

PC

PC

B

B+30HB

A

B(22H)

22H

A+30HA

21H

A(21H)

20H

结束

简单程序例1---方法1

源程序如下:

ORG 0000H

MOV A,20H

MOV B,#10H

DIV AB

ORL B,#30H

MOV 22H,B

ORL A,#30H

MOV 21H,A

SJMP $

0001 0000

0000 0100

0011 0100

0011

0000

0011

0011

0011 0100

0100

slide13

开始

#20HR0

·

·

·

·

·

·

#30HA

·

·

·

A的低4位(20H)的低4位

A

PC

PC

PC

PC

PC

PC

PC

PC

PC

PC

A(22H)

(20H)A

22H

21H

A的低4位A的高4位

20H

A+30HA

R0

A(21H)

结束

简单程序例1---方法2

ORG 0000H

MOV R0,#20H

MOV A,#30H

XCHD A,@R0

MOV 22H,A

MOV A,@R0

SWAP A

ORL A , #30H

MOV 21H, A

SJMP $

源程序如下:

0011

0011

0011

0011

0000

0100

0100

0000

0011

0011

0011

0100

0000

0010 0000

slide14
程序设计概述--基本步骤
  • 题意分析
  • 画出流程图
  • 分配内存及端口
  • 编制源程序
  • 仿真、调试程序
  • 固化程序
slide15

·

·

·

·

·

·

·

·

·

·

·

·

A

43H

42H

33H

32H

23H

22H

例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,低位在后)

分析:

0101

0110

0111

1000

BCD码11H

0001

0001

BCD码83H

1000

0011

slide16

开始

(22H)A

(32H)+AA

十进制调整

A(42H)

(23H)A

(33H)+AA

十进制调整

A(43H)

结束

例2:有两 组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,求它们的和,并送入43H、42H单元中去。(高位在前,低位在后)

解:

流程图(框图)如何?

请同学们自己绘制流程图。

slide17

开始

(22H)A

(32H)+AA

十进制调整

A(42H)

(23H)A

(33H)+AA

十进制调整

A(43H)

结束

ORG 0000H

MOV A,22H

ADD A,32H

DA A

MOV 42H,A

MOV A,23H

ADDC A,33H

DA A

MOV 43H,A

SJMP $

END

此条加法指令可否改用带进位的(ADDC)?

slide18

·

·

·

·

·

·

·

·

·

·

·

·

+

A

PC

PC

PC

PC

PC

PC

PC

PC

PC

PC

PC

43H

42H

33H

32H

23H

22H

ORG 2000H

CLR C

MOV A,22H

ADD A,32H

DA A

MOV 42H,A

MOV A,23H

ADDC A,33H

DA A

MOV 43H,A

END

1111 1011

0110 1000

0110 0001

0110 0111

0001 0001

1000 0011

0101 0110

0111 1000

0110 0111

1111 1011

0110 1000

0110 0001

0101 0110

0111 1000

0001 0001

1000 0011

slide19

P3.4=0?

Y

N

点亮所有二极管

二极管交叉点亮

分支程序设计
  • 结构特点:不一定按指令的先后顺序依次运行程序,程序的流向有两个或两个以上分支,根据指定条件选择程序的流向。
  • 如实训程序中采用的分支:
slide20
分支程序的典型实例
  • 实例:已知30H单元中有一变量X,要求编写一程序按下述要求给Y赋值,结果存入31H单元。

X+1, X>0

Y = 0 , X = 0

–1 , X<0

  • 题意:根据X的不同,程序编写时有三个出口,即有三个分支!!!!

想一想:程序怎么编写?

slide21

分支程序实例---三分支程序

开始

程序框图:

XA

Y

A=0?

N

Y

A>0?

N

A= –1

A= A+1

存结果

结束

slide22

分支程序实例---三分支程序

最高位为符号位。

源程序如下:

ORG 2000H

MOV A,30H

JZ LP1 ;X = 0,转LP1处理

JNB ACC.7,LP2 ;X>0,转LP2处理

MOV A,#0FFH ;X<0,则Y= –1

SJMP LP1

LP2:ADD A,#01 ;X >0,Y=X+1

LP1:MOV 31H,A ;存结果

SJMP $ ;循环等待,$表示转至

本地址,此方法适用

于一字节的偏移量

4 3 p68 ram20h 30h 8 x y x y p1 0 led x y p1 1 led
例4.3(P68) 设内部RAM20H单元和30H 单元中分别存放了两个8位的无符号数 X、Y, 若X≥Y 则让P1.0管脚连接的LED亮;若X<Y 则让P1.1管脚连接的LED亮。

分支程序实例---数据比较大小

方法1:两个数据做减法SUBB,可根据借位CY来判断两个数的大小!

方法2:两个数据做比较CJNE,再根据是否相等和借位CY来判断两个数的大小!

slide24
方法1编程:

X DATE 20H

Y DATE 30H

ORG 0000H

MOV A,X

CLR C

SUBB A,Y

JC L1

CLR P1.0

SJMP FINISH

L1: CLR P1.1

FINISH: SJMP $

END

slide25
方法2编程:

X DATE 20H

Y DATE 30H

ORG 0000H

MOV A,X

CJNE A,Y,L0

L0:JC L1

CLR P1.0

SJMP FINISH

L1: CLR P1.1

FINISH: SJMP $

END

slide26

1.先判断符号位,负数小;正数大.

2.符号相同,则用减法判断是否有借位.

分支程序实例---数据比较大小

**例4.4 两个有符号数的比较。

问题1:如何表示有符号数呢?

问题2:有符号数怎样比较大小?

slide27

教材P68 例4.4

比较20H和30H单元两个有符号数的大小,结果按下述规律显示在实训板上。

(20H)=(30H),P1.0点亮; (20H)(30H),P1.1点亮; (20H)(30H),P1.2点亮;

slide28

开始

N

X,Y符号相同?

Y

X-Y

N

X=Y?

Y

X>0?

Y

Y

N

CY=1

N

X>Y,点亮P1.1

X<Y,点亮P1.2

X=Y,点亮P1.0

结束

例4.4 程序框图

slide29

X DATA 20H

Y DATA 30H ;伪指令

ORG 0000H

MOV A,X

XRL A,Y ;X,Y进行异或

JB ACC.7,NEXT1 ;二者符号不同,跳转到NEXT1

MOV A,X ;符号相同

CJNE A,Y,NEQUAL;X≠ Y,跳转到NEQUAL

CLR P1.0 ;X=Y,点亮P1.0

SJMP FINISH

NEQUAL:JC XXY ;X < Y,转移到XXY

SJMP XDY ;否则, X > Y,转移到XDY

NEXT1: MOV A,X

JNB ACC.7,XDY ;判断X的正、负,正则转移到XDY

XXY: CLR P1.2 ;X < Y,点亮P1.2

SJMP FINISH

XDY: CLR P1.1 ; X > Y,点亮P1.1

FINISH: SJMP $

END

例4.4 程序清单

slide30
实训项目—简单程序和分支程序
  • 简单程序
    • 实训4程序1
    • P66例4.1
  • 分支程序
    • 实训4程序2
    • P67例4.3
    • P68例4.4(选做项目)
    • P70例4.5(选做项目)
slide31
散转程序
  • 散转程序是指通过修改某个参数后,程序可以有三个以上的流向,多用于键盘程序。
  • 常用的指令是JMP @A+DPTR,该指令是把16位数据指针DPTR的内容与累加器A中的8位无符号数相加,形成地址,装入程序计数器PC,形成散转的目的地址。

A中内容为8位无符号数

16位地址数

+

DPTR

A

PC

slide32

例: 根据R7的内容,转向各自对应的操作程序(R7= 0,转入OPR0;R7= 1,转入OPR1…R7= n,转入OPRn)

程序清单如下:

JUMP1: MOV DPTR,#JPTAB1 ;跳转表首送数据指针

MOV A,R7

ADD A,R7 ;R72A (修正变址值)

JNC NOAD ;判有否进位

INC DPH ;有进位则加到高字节地址 NOAD: JMP @A+DPTR ;转向形成的散转地址人口

JPTAB1: AJMP OPR0 ;直接转移地址表

AJMP OPR1

.

AJMP OPRn

slide33
循环程序设计
  • 结构特点:利用转移指令反复运行需要多次重复的程序段。
  • 实例:前面几个实训中用到的延时程序:(DELAY)

DELAY: MOV R3, #OFFH

DEL2: MOV R4,#0FFH

DEL1: NOP

NOP

DJNZ R4,DEL1

DJNZ R3,DEL2

RET

  • 循环程序的组成:

1. 初始化部分(设定循环次数等)。

2. 循环体(重复执行的部分,用于完成实际操作)

3. 循环控制(不断修改和判别循环变量,直至结束)。

4. 循环结束处理。

slide34

#200

#125

循环程序设计

延时程序中延时时间的设定:

源程序: 指令周期

DELAY: MOV R3, #( X )H 2个T机器

DEL2: MOV R4,#( Y )H 2个T机器

DEL1: NOP 1个T机器

NOP 1个T机器

DJNZ R4,DEL1 2 个T机器

DJNZ R3,DEL2 2个T机器

RET

延时时间怎样计算?

指令周期、机器周期T机器与时钟周期T时钟的关系:

T机器=12T时钟=121/fosc=1us

(假设晶振频率fosc为12M)

延时时间的简化计算结果: (1+1+2)  X  Y

若想延时100ms,只需修改计数初始值,即 (1+1+2) 125200us=100ms

slide35

循环程序设计

1S延时程序

源程序:

DELAY: MOV R2, #10

DEL3: MOV R3, #200

DEL2: MOV R4,#125

DEL1: NOP

NOP

DJNZ R4,DEL1

DJNZ R3,DEL2

DJNZ R2, DEL3

RET

slide36

开始

设循环次数

设循环初值

显示模式字送P1口

显示模式字左移1位

次数-1=0

N

Y

教材P75例4.6:编程实现P1口连接的8个LED显示方式如下:从P1.0到P1.7的顺序,依次点亮其连接的LED。

循环程序设计

slide37

子程序实例引入:实训4程序3

ORG 0000H

START: MOV R2,#08H ;设置循环次数

MOV A,#0FEH ;送显示模式字

NEXT: MOV P1,A ;点亮二极管

ACALL DELAY

RL A ;左移一位,改变显示模式字

DJNZ R2,NEXT ;循环次数减1,不为零,继续点亮

SJMP START ;下面一个二极管

DELAY: MOV R3,#0FFH ;延时子程序开始

DEL2: MOV R4,#0FFH

DEL1: NOP

DJNZ R4,DEL1

DJNZ R3,DEL2

RET

END

slide38

初始化部分

循环体

循环控制

循环结束

书P78例4.8:不同存储区域之间的数据传输:

将内部RAM30H单元开始的内容传送到外部RAM0100H单元开始的区域,直到遇到传送的内容是0为止。

数据传送程序

开始

地址指针R0赋初值

地址指针DPTR赋初值

(R0)->A

Y

A = 0

N

A->(DPTR), 地址指针增1

结束

slide39
查表程序
  • 表格是事先存放在ROM中的,一般为一串有序的常数,例如平方表、字型码表等。
  • 表格可通过伪指令DB来确定。
  • 通过查表指令MOVC A,@A+DPTR

MOVC A,@A+PC来实现。

在LED显示和键盘处理程序中将会用到。

slide40

P81例4.9 用查表法计算平方(一)

ORG 0000H

MOV DPTR,#TABLE ;表首地址送DPTR

MOV A,#05 ;被查数字05A

MOVC A,@A+DPTR ;查表求平方

SJMP $

TABLE:DB 0,1,4,9,16,25,36,49,64,81

END

slide41

P81例4.9 用查表法计算平方(二)

ORG 0000H

1000H MOV A,#05 ;05 A

1002H ADD A,#02 ;修正累加器A

1004H MOVC A,@A+PC ;查表求平方

1005H SJMP $

1007H: DB 0,1,4,9,16,25,36,49,64,81

END

slide42
八路彩灯控制程序

要求:

(1)D1~D8八个彩灯按规定顺序依次点亮(间隔1秒),最后全量;

(2)按规定顺序依次熄灭(间隔1秒),最后全灭;

(3)八个灯同时点亮,保持1秒;

(4)八个灯同时熄灭,保持0.5秒;

再将第3、4步重复4遍,最后整个程序再重复N遍。

步骤:

(1)绘制流程图

(2)编写程序

(3)调试程序

slide43

开始

初始化参数

查表

延时

N

循环次数到否?

Y

亮灭4次

N

循环N次到否?

Y

结束

参考程序(一)

ORG 0000H

LJMP MAIN

ORG 0100H

MAIN:MOV R7,#7

LOOP: MOV R6,#16

MOV R5,#4

MOV DPTR,#TABL

MOV R4,#0

LOOP1:MOV A,R4

MOVC A,@A+DPTR

MOV P1,A

INC R4

LCALL DELAY

LCALL DELAY

DJNZ R6,LOOP1

LOOP2: MOV P1,#0FFH

LCALL DELAY

LCALL DELAY

MOV P1,#00H

LCALL DELAY

DJNZ R5,LOOP2

DJNZ R7,LOOP

SJMP $

END

slide44
子程序设计
  • 在实际问题中,常常会遇到在一个程序中多次用到相同的运算或操作,若每遇到这些运算或操作,都从头编起,将使程序繁琐、浪费内存。因此在实际中,经常把这种多次使用的程序段,按一定结构编好,存放在存储器中,当需要时,可以调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。

主要内容:

1. 主程序与子程序的关系

2. 子程序嵌套

3. 子程序的调用与返回

slide45

子程序SUB

主程序与子程序的关系

子程序入口地址

主程序MAIN

调用子程序

LCALL SUB

RET

实例:实训13中调用延时程序的过程。P82 例4.10

返回

slide46

开始

送显示初值

设闪烁次数

点亮相应的LED

延时

熄灭相应的LED

延时

N

次数-1=0

Y

初值左移1位

指向下一个LED

实例:LED灯的闪烁点亮(一)

ORG 0000H

MAIN: MOV A,#0FEH ;送显示初值

LP: MOV R0,#10 ;送闪烁次数

LP0: MOV P1,A ;点亮LED

LCALL DELAY ;延时

MOV P1,#0FFH;熄灭灯

LCALL DELAY ;延时

DJNZ R0,LP0

RL A SJMP LP

slide47

子程序嵌套

子程序嵌套(或称多重转子)是指在子程序执行过程中,还可以调用另一个子程序。P83 例4.10

主程序MAIN

子程序SUB1

子程序SUB2

LCALL SUB1

LCALL SUB2

RET

RET

slide48

ORG 0000H

MAIN: MOV A,#0FEH ;送显示初值

COUN: ACALL FLASH ;调闪烁子程序

RL A ;A左移,下一个灯闪烁

SJMP COUN ;循环不止

FLASH: MOV R0,#10 ;送闪烁次数

FLASH1: MOV P1,A ;点亮LED

LCALL DELAY ;延时

MOV P1,#0FFH ;熄灭灯

LCALL DELAY ;延时

DJNZ R0,FLASH1 ;闪烁次数不够10次,继续

RET

DELAY: MOV R3,#0FFH ;延时子程序

DEL2: MOV R4,#0FFH

DEL1: NOP

DJNZ R4,DEL1

DJNZ R3,DEL2

RET

END

子程序嵌套范例:LED灯闪烁(二)

slide49

子程序的调用与返回

问题:子程序调用、返回到主程序中的正确位置,并接著执行主程序中的后续指令呢?

为了解决这个问题,我们采用了堆栈技术。

PC

21 13

20 13

主程序MAIN

子程序SUB1

子程序SUB2

2100

2200

21

2010

2110

LCALL SUB1

13

LCALL SUB2

2013

2113

20

13

RET

RET

堆栈指针SP

堆栈

slide50

子程序设计注意事项

(1)要给每个子程序起一个名字,也就是入口地址的代号。

(2)要能正确地传递参数。即首先要有入口条件,说明进入子程序时,它所要处理的数据放在何处(如:是放在A中还是放在某个工作寄存器中等)。另外,要有出口条件,即处理的结果存放在何处。

(3)注意保护现场和恢复现场。在子程序使用累加器、工作寄存器等资源时,要先将其原来的内容保存起来,即保护现场。当子程序执行完毕,在返回主程序之前,要将这些内容再取出,送还到累加器、工作寄存器等原单元中,这一过程称为恢复现场。

例4.11 查表子程序。

注意:1.入口参数和出口参数的位置

2.现场的保护与恢复。

slide51

子程序的参数传递

范例:计算平方和c=a2+b2

ORG 0000H ;主程序

MOV SP,#3FH ;设置栈底

MOV A,31H ;取数a存放到累加器A中作为入口参数

LCALL SQR ;计算a2

MOV R1,A ;出口参数——平方值存放在A中

MOV A,32H ;取数b存放到累加器A中作为出口参数

LCALL SQR ;计算b2

ADD A,R1 ;求和

MOV 33H,A ;存放结果

SJMP $

slide52

;子程序:SQR

;功能:通过查表求出平方值y=x2

;入口参数:x存放在累加器A中

;出口参数:求得的平方值y存放在A中

;占用资源:累加器A,数据指针DPTR

SQR:USH DPH ;保护现场,将主程序中DPTR的高八位放入堆栈

PUSH DPL ;保护现场,将主程序中DPTR的低八位放入堆栈

MOV DPTR,#TABLE ;在子程序中重新使用DPTR,表首地址→DPTR

MOVC A, @A+DPTR ;查表

POP DPL ;恢复现场,将主程序中DPTR的低八位从堆栈中弹出

POP DPH ;恢复现场,将主程序中DPTR的高八位从堆栈中弹出

RET

TABLE: DB 0,1,4,9,16,25,36,49,64,81

slide53
常用汇编子程序
  • 代码转换

例4.13:将二进制转换为BCD码

  • 查找程序

例4.19:查找关键字。

例4.20:查找最大值。

slide54

程序名:BINBCD

功能:二进制数转换为BCD码

入口参数:要转换的二进制数存放在累加器A中(00H-FFH)

出口参数:转换后的BCD码存放在B(百位)和A(十位和个位)中

BINBCD: PUSH PSW

MOV B,#100

DIV AB ;除法指令,A/B →商在A中,余数在B中

PUSH ACC ;把商(百位数)暂存在堆栈中

MOV A,#10

XCH A,B ;余数交换到A中,B=10

DIV AB ;A/B→商(十位)在A中,余数在B(个位)中

SWAP A ;十位数移到高半字节

ADD A,B ;十位数和个位数组合在一起

POP B ;百位数存放到B中

POP PSW

RET

slide55

程序名 :FIND ; 功能:片内RAM中数据检索

入口参数:R0指向数据块首地址,R1中为数据块长度,关键字存于累加器A中

出口参数:若找到关键字,把关键字在数据块中的序号存放到A中,若找不到

关键字,A中存放序号00H

占用资源:R0,R1,R2,A.PSW

FIND: PUSH PSW

PUSH ACC

MOV R2,#00H

LOOP: POP ACC

MOV B,A

XRL A,@R0 ;关键字与数据块中数据进行异或操作

INC R0 ;指向下一个数

INC R2 ;R2中的序号加1

JZ LOOP1 ;找到

PUSH B

DJNZ R1,LOOP

MOV R2,#00H ;找不到,R2中存放00

LOOP1: MOV A,R2

POP PSW

RET

slide56

程序名 :MAX

功能 :查找内部RAM中无符号数据块的最大值

入口参数:R1指向数据块的首地址,数据块长度存放在工作

寄存器R2中

出口参数:最大值存放在累加器A中

占用资源:R1,R2,A,PSW

MAX: PUSH PSW

CLR A ;清A作为初始最大值

LP: CLR C ;清进位位

SUBB A,@R1 ;最大值减去数据块中的数

JNC NEXT ;小于最大值,继续

MOV A,@R1 ;大于最大值,则用此值作为最大值

SJMP NEXT1

NEXT: ADD A,@R1 ;恢复原最大值

NEXT1: INC R1 ;修改地址指针

DJNZ R2,LP

POP PSW

RET

slide57
排序程序

程序名 :BUBBLE

功能 :将片内RAM数据块由大到小排序

入口参数:R0指向数据块首地址,R2存放数据块长度

出口参数:仍存放原来位置

占用资源:R0,R1,R2,R3,R5,A,PSW;00H位

slide58

BUB2:DEC R1

MOV @R1,A

INC R1

MOV A,@R1

DJNZ R5,BUB1

MOV A,R0

MOV R1,A

MOV A,R2

MOV R5,A

JB 00H,BUBB1

RET

BUBBLLE:MOV A,R0

MOV R1,A

MOV A,R2

MOV R5,A

BUBB1: CLR 00H

DEC R5

MOV A,@R1

BUB1: INC R1

MOV B,@R1

CJNE A,B,BUB0

BUB0: JNC BUB2

SETB 00H

XCH A,@R1

slide59

优秀程序的评价标准

一、汇编程序的设计风格培养

  • 标号:标号名应该能够代表目的地的意义;
  • 注释:在程序中无论怎样强调注释都不过份;
  • 注释块:在主程序或子程序的开头,应添加注释块,内容包括程序名、功能、调用条件、退出条件、调用其它子程序名、所专用或影响的寄存名;
  • 堆栈:要用堆栈保存寄存器的数据;
  • 存储器:内部、外部存储单元分配明确,标志清晰;
  • 子程序:多使用子程序;
  • 格式:标准的编程结构与格式。
slide60
二、优秀程序的评价标准
  • 软件的结构清晰、简洁、流程合理、说明清楚;
  • 各功能程序实现模块化、子程序化;
  • 程序存储器、数据存储器的规划清晰、合理,做到既节约内存,又操作方便;
  • 运行状态实现标志化管理,功能程序的运行状态、运行结果、以及运行的要求都设置状态标志以便查询,程序的转移、运行、控制都可通过状态标志条件类来控制;
  • 程序设计有流程图;
  • 全面的软件抗干扰设计,提高系统的可靠性,在系统中,设置自诊断程序。
slide61

实训与练习

实训:

1. P70例4.5。散转程序的应用。

2. P75例4.6 。要求从P1.0到P1.7,再从P1.7到P1.0轮流显示,显示时间间隔为1S。

3. 查找无符号数据块中的最小值。条件同例4.20。

作业:

4.13 4.14