slide1
Download
Skip this Video
Download Presentation
第四章 汇编语言程序设计

Loading in 2 Seconds...

play fullscreen
1 / 42

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


  • 102 Views
  • Uploaded on

第四章 汇编语言程序设计. 通过前面的学习,我们已经了解了单片机内部的结构, MCS-51 指令系统的寻址方式、各类指令的格式及功能。 下面我们就是要如何利用 MCS-51 的指令系统,来编写高效、充分利用其特点的程序。. § 4.1 概述. 4.1.1 程序设计语言. 目前,用于程序设计的语言基本上分为三种:. 1. 机器语言 在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。 缺点:程序不易看懂,不便于记忆,容易出错。. 程序设计语言. 2. 汇编语言

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 ' 第四章 汇编语言程序设计' - harrison-patton


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
slide2

第四章汇编语言程序设计

通过前面的学习,我们已经了解了单片机内部的结构,MCS-51指令系统的寻址方式、各类指令的格式及功能。

下面我们就是要如何利用MCS-51的指令系统,来编写高效、充分利用其特点的程序。

slide3
§4.1 概述

4.1.1 程序设计语言

目前,用于程序设计的语言基本上分为三种:

1. 机器语言

在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言。直接用机器语言编写的程序称为机器语言程序。

缺点:程序不易看懂,不便于记忆,容易出错。

slide4

程序设计语言

  • 2. 汇编语言
  • 用助记符表示的指令称为符号语言或汇编语言。
  • 汇编语言程序(源程序)需要“汇编”(由专门的汇编程序完成)才能转换成机器语言。得到的机器语言程序称为目标程序。
  • 特点:
    • 是面向机器的语言,必须对硬件有一定的了解。
    • 助记符指令和机器指令一一对应。
    • 能直接管理和控制硬件设备(功能部件)。
slide5

3. 高级语言

  • 高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。
  • 常用的高级语言,如BASIC、FORTRAN、C语言等。
  • 特点:
    • 通用性强,直观、易懂、易学、可读性好。
    • 计算机不能直接识别和执行。(需要进行编译)
    • 发展很快。
slide6

4.1.2 编制程序的步骤

1.任务分析(硬件、软件系统分析)

2.确定算法和工作步骤;

3.程序总体设计和流程图绘制

关于流程图符号:

开始、结束----圆角矩形

工作任务----矩形

判断分支----菱形

程序流向----

程序连接----

结束

开始

slide7

4.1.2 编制程序的步骤

4. 分配内存,确定程序与数据区存放地址;

5. 编写源程序;

6. 调试、修改,最终确定程序。

slide8

4.1.3 方法技巧

  • 模块化设计(按功能分:显示、打印、输
  • 入、发送等)
  • 2. 尽量采用循环及子程序结构(节省内存)
4 1 4
4.1.4 汇编语言的规范
  • 汇编语言源程序由以下两种指令构成:
    • 汇编语句(指令语句)
    • 伪指令(指示性语句)
  • 汇编语句的格式:
  • 标号: 操作码 操作数 ;注释
  • 数据表示形式:
  • 二进制(B)、十六进制(H)、十进制(D或省略)、
  • ASCII码(以单引号标识)
slide10

伪指令

控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。

通过使用伪指令向汇编程序发出指示信息,告诉它如何完成汇编工作。

伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。

slide11
常用的伪指令
  • ORG(Origin)
  • 定位目的程序的起始地址。
  • 格式: ORG 表达式
  • 如:ORG 0000H
    • 注:表达式必须为16位地址值。
  • END

汇编语言程序结束伪指令。

注:一定放在程序末尾!

slide12
常用的伪指令
  • EQU (EQUate)
  • 赋值伪指令。
  • 格式:字符名称EQU数值或汇编符号
  • 例: AA EQU 30H
  • K1 EQU 40H
  • MOV A,AA ; (30H)→A
  • MOV A,K1 ;(40H)→A
slide13
常用的伪指令
  • DB(DefineByte)
  • 从指定单元开始定义(存储)若干个字节的数据或ASCII码字符,常用于定义数据常数表。
  • 格式:DB 字节常数或ASCII字符
  • 例: ORG 1000H
  • DB 34H,0DEH,“A”,“B”
  • DB 0AH,0BH,20
slide14
常用的伪指令
  • DW(DefineWord)
  • 从指定单元开始定义(存储)若干个字的数据
  • 或ASCII码字符。
  • 格式:DW 字常数或ASCII字符
  • 例: ORG 2000H
  • DW 1234H,“B”
  • DW 0AH,20
  • 思考: (2000H)及其以后的地址单元中的内容是多少?
slide15
常用的伪指令
  • BIT
  • 位地址符号指令。
  • 把位地址赋于规定的字符名称。
  • 格式:字符名称BIT位地址
  • 例: ABC BIT P1.1
  • QQ BIT P3.2
slide16

§4.2 汇编语言程序编辑和汇编

1. 编辑(源程序,以.ASM扩展名存盘);

2. 汇编(手工或机器汇编);

如:MOV A,#88H;机器码74 88

又如:

地址 目标码 源程序

ORG 1000H

1000H 74 7F MOV A,#7FH

1002H 79 44 MOV R1,#44H

END

slide17
§4.3 程序设计基础与举例

4.3.1 顺序结构程序

例1:变量存在内部RAM的20H单元中,其取值范围:0~5,编成,查表法求其平方值

org 1000h

start:mov dptr,#2000h

mov a,20h

movc a,@a+dptr

mov 21h,a

sjmp $

org 2000h

table:db 0,1,4,9,16,25

end

slide18

开始

表格首地址送DPTR

变量送A(20H) A

查平方表(A+DPTR) A

结果送21H单元:A 21H

结束

slide19

内部RAM

22H

21H

6 9

20H

例2:将20H单元的压缩(Packed )BCD码拆成两个ACSII码存入21H、22H单元。

3 6

3 9

BCD

0

1

2

...

9

ASCII

30H

31H

32H

...

39H

slide20
方法1

开始

(20H)A

10HB

A/B,A中为高4位BCD码,

B中为低4位BCD码

B+30HB

B(21H)

A+30HA

A(22H)

结束

slide21

周期数 源程序

  • ORG 2000H
        • MOV A,20H
        • MOV B,#10H
        • DIV AB
        • ORL B,#30H
        • MOV 21H,B
        • ORL A,#30H
        • MOV 22H,A
        • END

1

2

4

2

2

1

1

13

;除以10H

;高4位BCD码转换位ASCII码

;低4位BCD码转换位ASCII码

slide22
方法2:

开始

0 (21H)

(20H)A

A与(21H)的低4位交换

(21H)+30H(21H)

A的高低半字节交换

A+30HA

A(22H)

结束

slide23

周期数

源程序

ORG 2000H

MOV R0,#21H

MOV @R0,#0

MOV A,20H

XCHD A,@R0

ORL 21H,#30H

SWAP A

ORL A,#30H

MOV 22H,A

END

1

1

1

1

2

1

1

1

9

;清21H单元

;低4位BCD码送21H单元,

;低4位BCD码转换位ASCII码

;高4位BCD码转换位ASCII码

4 3 2

Y

条件成立?

条件成立?

N

Y

N

程序段A

程序段A

程序段A

下条指令

单分支结构

双分支结构

4.3.2 分支程序

分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)

4 3 21

0

K=?

n

1

程序段n

程序段1

程序段0

多分支结构

4.3.2 分支程序

分支程序可根据要求无条件或条件地改变程序执行流向。编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)

slide26

例1:设变量x以补码形式存放在片内RAM 30H单元中,变量y与x的关系是:

编程根据x的值求y值并放回原单元。

slide27

开始

取x 即(30h) A

A=?

<0

>0

0

y=x+5

y=x

y=20H

存y 即y 20h

结束

slide28

ORG 1000H

START:MOV A,30H

JZ NEXT ;x=0,转移

ANL A,#80H ;保留符号位

JZ ED ;x>0,转移

MOV A,#05H ;x<0,不转移

ADD A,30H

MOV 30H,A

SJMP ED

NEXT:MOV 30H,#20H

ED:SJMP $

slide29

TAB

P0高位

P0低位

TAB+2

P1高位

P1低位

例2:根据R7的内容,转至对应的分支程序。设R7的内容为0~N,对应的处理程序地址分别为P0~P7

  • START:MOV DPTR,#TAB
  • MOV A,R7
  • ADD A,R7 ;R7×2A
  • MOV R3,A ; 暂存R3
  • MOVC A,@A+DPTR ;取高位地址
  • XCHA ,R3
  • INC A
  • MOVC A,@A+DPTR ;取低位地址
  • MOV DPL,A
  • MOV DPH,R3 ;转移地址送入DPTR
  • CLR A
  • JMP @A+DPTR
  • TAB: DW P0
  • DW P1
      • DW PN
4 3 3
4.3.3 循环程序
  • 循环程序一般由:
  • 初始化部分
  • 循环体部分--处理部分、修改部分、控制部分
  • 结束部分
  • 其结构一般有两种:
  • 先进入处理部分,再控制循环
    • 至少执行一次循环体
  • 先控制循环,再进入处理部分
    • 循环体是否执行,取决于判断结果。
slide31

开始

设置循环初值

循环处理

循环修改

循环结束?

结束处理

结束

开始

设置循环初值

Y

循环结束?

N

循环处理

N

循环修改

Y

结束处理

结束

slide32

循环控制的一般方法:

  • 循环次数已知
    • 利用循环次数控制
  • 循环次数未知
    • 利用关键字控制
  • 利用“逻辑尺”
    • 根据“逻辑尺”的内容,进行控制。
slide33

例4-3-6 : 50ms延时子程序。设晶振频率为12MHz,则机器周期为1us。

DEL: MOV R7,#200 ;1MC

DEL1:MOV R6,#123 ;1MC

NOP ;1MC

DJNZ R6,$ ;2MC

DJNZ R7,DEL1 ;2MC

RET ;2MC

延时时间:t=1+200[(1+1+2*123)+2]+2

≈50000us=50ms

slide34

例4-3-8:将内部RAM中起始地址为data的数据串串送到外部RAM中起始地址为buffer的存储区域中,直到发现‘$’字符,传送停止----循环次数事先不知道先判断,后执行。例4-3-8:将内部RAM中起始地址为data的数据串串送到外部RAM中起始地址为buffer的存储区域中,直到发现‘$’字符,传送停止----循环次数事先不知道先判断,后执行。

MOV R0,#data

MOV DPTR,#buffer

LOOP1:MOV A,@R0

CJNE A,#24H,LOOP2 ;判断是否为$字符

SJMP LOOP3 ;是,转结束

LOOP2:MOVX @DPTR,A ;不是,传送数据

INC R0

INC DPTR

SJMP LOOP1 ;传送下一数据

LOOP3:END

slide35

4.3.4 子程序问题

子程序设计时注意事项:

1. 给子程序赋一个名字。实际为入口地址代号。

2. 要能正确传递参数:

入口条件:子程序中要处理的数据如何给予。

出口条件:子程序处理结果如何存放。

(寄存器、存储器、堆栈方式)

3. 保护与恢复现场:

保护现场:压栈指令PUSH

恢复现场:弹出指令POP

4. 子程序可以嵌套

slide36

例4-3-9 :利用查表法求平方和 ,设a、b、c分别存于内部RAM的DA、DB、DC三个单元中。

MOV A,DA ;取a

ACALL SQR ;调用查表子程序

MOV R1,A ;a的平方暂存R1中

MOV A,DB;取b

ACALL SQR ;调用查表子程序

ADD A,R1 ;求出平方和暂存阿A中

MOV DC,A ;结果存于DC 中

SJMP $

SQR:MOV DPTR,#TAB ;子程序

MOVC A,@A+DPTR

RET

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

END

利用累加器或寄存器传递参数

slide37

4.3.5 码型转换程序的设计

一、十六进制数与ASCCII码之间的转换

(对比BCD与ASCCI之间的转换—4.3.1中例2)

表4-1 十六进制数与ASCII码之间的关系

slide38

例4-3-15 将一位十六进制数转换成ASCII码,设十六进制数存放在R0中,转换后的ASCII码放在R2中。

HTASC: MOV A, R0 ;取十六进制数

PUSH ACC ;保护

CLR C ;

SUBB A,#0AH ;判断是否大于十

POP ACC;

JC LOOP ;小于十,直接加30H

ADD A,#07H ;大于十,加37H

LOOP:ADD A,#30H

MOV R2,A

RET

slide39

例4-3-16 将多位十六进制数转换成ASCII码,设R0指向十六进制数低位, R2存放字节数,转换后R1指向ASCII码高位。

HTASC: MOV A,@R0 ;取十六进制数

ANL A,#0FH ;取低四位

ADD A,#15 ;偏移修正

MOVC A,@A+PC ;查表得ASCII码

MOV @R1,A ;保存

INC R1

MOV A,@R0 ;取十六进制数高四位

SWAP A ;

ANL A,#0F0H

ADD A,#06H ;偏移修正

MOVC A,@A+PC ;查表

MOV @R1,A ;保存

INC R0 ;指向下一单元

INC R1

DJNZ R2,HTASC

RET

ASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H

DB 38H,39H,41H,42H,43H,44H,45H,46H

slide40

二、BCD码与二进制数之间的转换

(对比BCD与ASCCI之间的转换—4.3.1中例2)

例4-3-17:双字节数R2R3转换成压缩BCD码存在

R4R5R6中。由十进制数与二进制数之间的关系可知:十进制数D与n位二进制数的关系克表示为

D=bn-1×2n-1+bn-2×2n-2+...+b1×2+b0

={...{[(bn-1×2+bn-2)×2]+bn-3}...+b1}×2+b0

部分和存在R4R5R6中,其中bi每次移入Cy中

slide41

DCDTH: CLR A ;

MOV R4,A ;R4清零

MOV R5,A ;R4清零

MOV R6,A ;R6清零

MOV R7,#16 ;循环初值

LOOP: CLR C

MOV A, R3 ; R2R3左移一位,并送回

RLC A ; (即将bi每次移入Cy中)

MOV R3,A ;

MOV A,R2 ;

RLC A ;

MOV R2,A ;

MOV A,R6 ; R4R5R6×2+ bi并调整送回

ADDC A,R6

DA A ;

MOV A,R5 ;

ADDC A,R5 ;

DA A ;

slide42

MOV A,R4 ;

ADDC A,R4

DA A ;

MOV R4,A ;

DJNZ R7,LOOP ;

END

ad