5966100
This presentation is the property of its rightful owner.
Sponsored Links
1 / 42

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


  • 80 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

第四章 汇编语言程序设计

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


5966100

第四章汇编语言程序设计

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

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


5966100

§4.1 概述

4.1.1 程序设计语言

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

1. 机器语言

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

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


5966100

程序设计语言

  • 2. 汇编语言

  • 用助记符表示的指令称为符号语言或汇编语言。

  • 汇编语言程序(源程序)需要“汇编”(由专门的汇编程序完成)才能转换成机器语言。得到的机器语言程序称为目标程序。

  • 特点:

    • 是面向机器的语言,必须对硬件有一定的了解。

    • 助记符指令和机器指令一一对应。

    • 能直接管理和控制硬件设备(功能部件)。


5966100

  • 3. 高级语言

  • 高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。

  • 常用的高级语言,如BASIC、FORTRAN、C语言等。

  • 特点:

    • 通用性强,直观、易懂、易学、可读性好。

    • 计算机不能直接识别和执行。(需要进行编译)

    • 发展很快。


5966100

4.1.2 编制程序的步骤

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

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

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

关于流程图符号:

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

工作任务----矩形

判断分支----菱形

程序流向----

程序连接----

结束

开始


5966100

4.1.2 编制程序的步骤

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

5. 编写源程序;

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


5966100

4.1.3 方法技巧

  • 模块化设计(按功能分:显示、打印、输

  • 入、发送等)

  • 2. 尽量采用循环及子程序结构(节省内存)


4 1 4

4.1.4 汇编语言的规范

  • 汇编语言源程序由以下两种指令构成:

    • 汇编语句(指令语句)

    • 伪指令(指示性语句)

  • 汇编语句的格式:

  • 标号:操作码操作数;注释

  • 数据表示形式:

  • 二进制(B)、十六进制(H)、十进制(D或省略)、

  • ASCII码(以单引号标识)


5966100

伪指令

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

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

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


5966100

常用的伪指令

  • ORG(Origin)

  • 定位目的程序的起始地址。

  • 格式:ORG 表达式

  • 如:ORG 0000H

    • 注:表达式必须为16位地址值。

  • END

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

    注:一定放在程序末尾!


5966100

常用的伪指令

  • EQU (EQUate)

  • 赋值伪指令。

  • 格式:字符名称EQU数值或汇编符号

  • 例:AAEQU30H

  • K1EQU40H

  • MOV A,AA; (30H)→A

  • MOV A,K1;(40H)→A


5966100

常用的伪指令

  • DB(DefineByte)

  • 从指定单元开始定义(存储)若干个字节的数据或ASCII码字符,常用于定义数据常数表。

  • 格式:DB 字节常数或ASCII字符

  • 例:ORG 1000H

  • DB34H,0DEH,“A”,“B”

  • DB0AH,0BH,20


5966100

常用的伪指令

  • DW(DefineWord)

  • 从指定单元开始定义(存储)若干个字的数据

  • 或ASCII码字符。

  • 格式:DW字常数或ASCII字符

  • 例: ORG 2000H

  • DW1234H,“B”

  • DW0AH,20

  • 思考: (2000H)及其以后的地址单元中的内容是多少?


5966100

常用的伪指令

  • BIT

  • 位地址符号指令。

  • 把位地址赋于规定的字符名称。

  • 格式:字符名称BIT位地址

  • 例:ABCBITP1.1

  • QQBITP3.2


5966100

§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


5966100

§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


5966100

开始

表格首地址送DPTR

变量送A(20H) A

查平方表(A+DPTR) A

结果送21H单元:A 21H

结束


5966100

内部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


5966100

方法1

开始

(20H)A

10HB

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

B中为低4位BCD码

B+30HB

B(21H)

A+30HA

A(22H)

结束


5966100

周期数 源程序

  • 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码


5966100

方法2:

开始

0 (21H)

(20H)A

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

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

A的高低半字节交换

A+30HA

A(22H)

结束


5966100

周期数

源程序

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 分支程序

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


5966100

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

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


5966100

开始

取x 即(30h) A

A=?

<0

>0

0

y=x+5

y=x

y=20H

存y 即y 20h

结束


5966100

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 $


5966100

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 循环程序

  • 循环程序一般由:

  • 初始化部分

  • 循环体部分--处理部分、修改部分、控制部分

  • 结束部分

  • 其结构一般有两种:

  • 先进入处理部分,再控制循环

    • 至少执行一次循环体

  • 先控制循环,再进入处理部分

    • 循环体是否执行,取决于判断结果。


5966100

开始

设置循环初值

循环处理

循环修改

循环结束?

结束处理

结束

开始

设置循环初值

Y

循环结束?

N

循环处理

N

循环修改

Y

结束处理

结束


5966100

  • 循环控制的一般方法:

  • 循环次数已知

    • 利用循环次数控制

  • 循环次数未知

    • 利用关键字控制

  • 利用“逻辑尺”

    • 根据“逻辑尺”的内容,进行控制。


5966100

例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


5966100

例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


5966100

4.3.4 子程序问题

子程序设计时注意事项:

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

2. 要能正确传递参数:

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

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

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

3. 保护与恢复现场:

保护现场:压栈指令PUSH

恢复现场:弹出指令POP

4. 子程序可以嵌套


5966100

例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

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


5966100

4.3.5 码型转换程序的设计

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

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

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


5966100

例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


5966100

例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


5966100

二、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中


5966100

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 ;


5966100

MOV A,R4 ;

ADDC A,R4

DA A ;

MOV R4,A ;

DJNZ R7,LOOP ;

END


  • Login