51单片机汇编语言程序经典考试题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ORG 2040H MOV A, R2 MOV R0, A MOV A, R3 MOV R1, A MOV A, @R0 CLR C
MOV JC XCH
MOV LOP1: INC
CJNE MOV RET
A, @R0 LOP1 A, @R1
@R0, A R1 R1, #76H , LOP @R0, A
B, #64H
AB
FIRST, A
A,
B
B, #0AH
AB
SECO , A
THIR , B
$
例2 已知20H单元中有一二 进制数,编程将其转换成3位 BCD数后,百位送入FIRST单元 的低4位,十位和个位分别送 入SECOND单元的高4位和低4位。
FIRST SECOND ORG MOV MOV DIV MOV MOV MOV DIV SWAP ORL MOV SJMP END
子程序名: “zero”; 入口地址: R0,R2
R0中存放子域的起 始地址 R2中存放子域的长 度 出口参数: 无
ORG 0100H MAIN: MOV R0, #20H
MOV R2, #0BH ACALL ZERO MOV R0, #30H MOV R2, #0FH ACALL ZERO MOV R0, #40H MOV R2, #10H ACALL ZERO SJMP $ ZERO: MOV @R0, #00H INC R0 DJNZ R2, ZERO RET END
例1. 将20H单元中的8位无符号数 转换成3位BCD码,并存放到FIRST (百位) 、SECO( 十位)和THIR (个位)中。
FIRST SECO THIR MOV MOV DIV MOV MOV MOV DIV MOV MOV SJMP END
EQU 30H
EQU 31H
EQU 32H
A, 20H
和 ABC: DB
是等价的。
1234H , 08H; 12H, 34H, 00H, 08H
(4) DS或DEFS (Define Storage)预留存储区 一般形式为:
<标号:> DS <表达式> 由标号指定开始单元,定义一个存储区,以备源程序使用。预 留的单元数由表达式的值确定。
例如:
ORG
3C40H
5、查表程序设计 查表程序设计中常用以下指令: MOVC A, @A+DPTR
DA DB DC STAR:
MOVC A, @A+PC
例10 用MOVC A, @A+PC指令编 程,求c=a2+b2的值,设a,b,c分别用 内部RAM单元DA,DB,DC存放。
子程序SQR 入口参数: A 出口参数: A
6、排序程序的编写
例12 编程将已存入内部RAM,70H到75H中的6个数按从小到大 顺序排列.
SORT: LOOP:
LOOP LOP2:
SUB:
LOP:
ORG MOV MOV LCALL INC INC CJNE
2000H R2,#70H R3,#71H SUB R2 R3
R3,
#76H,
SJMP LOP2 END
EQU 30H EQU 31H 0200H A, 20H B, #64H AB FIRST, A A, B B, 0AH AB A A, B SECOND, A $
2、分支程序设计
例3 已知VAR单元内有一个自 变量X,请按如下条件编程求Y, 并将它存入FUNC单元。
X>0, Y=1; X=0, Y=0; X<0, Y=-1;
汇编语言是一种面向机器的语言,使用助记符,每一个助记符 对应一个机器码,因此使用汇编语言编程比使用机器码更方便,但 用汇编语言编写的程序计算机不能直接识别和执行,必须将其翻译 成目标程序,这一翻译过程称为汇编,汇编可以用人工完成也可以 用机器完成。
2.汇编指令的格式 汇编指令由1—4个字段组成,格式如下: <标号:> <操作码><操作数1><操作数2><操作数3 >;<注释>
23H, ‘DAY’
(1000H)=53H (Leabharlann Baidu001H)=74H (1002H)=78H (1003H)=31H (1004H)=32H (1005H)=23H (1006H)=44H (1007H)=41H (1008H)=59H
数字1的ASCII码 数字2的ASCII码
‘DAY’的ASCII码
TEMP: DS
10
…
从3C40开始,保留10个连续的存储单元。
(5) EQU(Equate)为标号赋值 一般形式为: <标号:> EQU nn或<表达式> 其功能是,将语句操作数的值,赋给本语句的标号。故又称为等
值指令。
例如: BLK EQU 1000H
即给标号BLK赋以地址值1000H,在同一个程序中,用EQU给 标号赋以地址值后,标号的值在整个程序中不能再改变。
SJMP HALT
LOOP2: MOV Y1,#01H
HALT: SJMP $
END
3、循环程序编写 例5 将内部RAM 30H开始的10个无符号字节数相加,结果存入30H 单元,设和不超过8位.
MOV R7, #09H MOV R0, #30H MOV A, @R0 LOOP: INC R0 ADD A, @R0 DJNZ R7, LOOP MOV 30H, A SJMP $ END
项或项表,是指一个字节,数或字符串,或以引号括起来的 ASCII码字符串。
该指令的功能是将项或项表的数值存入从标号开始的连续单 元中。
例如: HERE:
SEG1: SEG2:
DB DB ORG DB DB END
84H ;
(HERE)=84H
43H ;
(HERE+1)=43H
1000H
53H, 74H, 78H, ’1’, ’2’
EXBCD:
INC INC PUSH MOV DIV MOV DEC MOV XCH DIV MOV DEC MOV POP RET
R0 R0
B B, #100 AB @R0, A R0 A, #10 A, B AB @R0, A R0
@R0, B B
例9. 将20H—2AH,30H—3EH, 40H—4FH 三个子域清零.
一、 伪指令 1.伪指令的概念
不产生目标代码,不影响程序执行,仅仅产生一些供汇编用 的命令,这样的命令称为伪指令。
2. 伪指令的作用 (1) 指定目标程序或数据存放的地址; (2) 给一些指定的标号赋值; (3) 在内存中预留工作单元; (4)表示源程序结束
3. 伪指令 (1) ORG 伪指令 用于设置起始地址, 一般形式为
2000H R6, #0AH R7,#200
R7, LOOP1 R6, LOOP2
说明:内循环指令周期数 为: 1+1+1+2=5μs 完成一 次内循环需要1001个机器 周期总的延时时间为
10.031ms
4、子程序的编写 (1) 保护和恢复现场 子程序中使用在主程序中使用的寄存器一般需要保护,通常需 要保护的寄存器有PSW、A和Rn等。 保护和恢复的方法是:使用PUSH和POP指令。 (2) 入口和出口参数 入口参数相当于给子程序的已知条件; 出口参数相当于调用子程序后得到的结果。 (3)子程序名 用标号表示子程序名,子程序名通常是子程序的入口地址, 用ret指令表示子程序调用结束。然后,返回到主调函数该调 用的下一条指令处执行。
注意点:项或项表为数值时,取值范围为00-FFH,若为字符 串其长度应限制在80个字符内。
(3) DW (Define Word) 一般形式为:
<标号:> DW <项或项表> 项或项表指一个字,DB用于定义8位数据(一个字节),DW 用于定义16位数据(一个字)。DW伪指令常用来建立地址表。
例如: ABC: DW
VRA FUNC
POSI: DONE:
ORG 0100H EQU 30H EQU 31H MOV A, VAR JZ DONE JNB ACC.7, POSI MOV A, #0FFH SJMP DONE MOV A, #01H MOV FUNC, A SJMP $ END
例4 已知X,Y为无符号数,分别存放于X1,Y1单元中,请按如下 条件编程求Y。
例6. 设从内部RAM的BLOCK单元开始存放一组无符号数,数据长 度存放在NUM单元,试编程求它们的最小值,并存入MIN单元。
ORG 2000H
BLOCK EQU 31H
CJNE A, B, NEXT
MIN EQU 30H
NEXT: JC LOOP
NUM EQU 2FH
MOV A,B
START: DEC NUM MOV R0, #BLOCK MOV A,@R0
51单片机汇编语言程序设计
内容提要:1、介绍伪指令;
2、汇编语言程序的汇编过程;
3、汇编语言实用程序举例。
先介绍几个概念: (1)汇编语言
用助记符表示指令系统的语言称汇编语言。 (2)汇编语言源程序
通常把用汇编语言编写的程序称之为汇编语言源程序。 (3)汇编
将汇编语言源程序“翻译”成机器语言目标程序的过程称为汇 编。 (4)目标程序 通常把可以在计算机上直接运行的机器语言程序称为目标程 序。
LOOP1: INC R0
LOOP: DJNZ NUM, LOOP1
MOV MIN, A
END
MOV B,@R0
例7 设51单片机的时钟频率为12MHz,要求设计一个软件延时程 序延时时间为10ms.
ORG MOV LOOP2: MOV LOOP1: NOP NOP NOP DJNZ DJNZ END
(1)标号 用来表明指令的地址, 用8个或以下的字符组成用字 母或下划线开头,不能使用保留字,可以缺省。
(2)操作码 即指令的助记符,用来指明CPU执行何种操作,是 不能缺少的部分。
(3)操作数 参加运算的数据或数据的地址。 (4)注释 为了方便程序的阅读,而作的说明。
三、 程序设计
1、顺序结构程序编写
例11 将一个16进制数0-F(存放在R0的低4位)转换成ASCII码存放 到原单元。
ORG 2000H MOV DPTR, #TAB MOV A,R0 ANL A,#0FH MOVC A, @A+DPTR MOV R0, A SJMP $ TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H, DB 39H,41H,42H,43H,44H,45H,46H END
-1 x<10
y=
0 10<=x<=20
1 x>20
ORG 2000H
X1 EQU 20H
Y1 EQU 21H
MOV A,X1
CJNE A,#10,NEXT1
NEXT1: JC
LOOP1
CJNE A,#21,NEXT2
NEXT2: JNC LOOP2
MOV Y1, #00H
SJMP HALT
LOOP1: MOV Y1, #0FFH
ORG nn 一般总是出现在某段程序或数据的前面。如
ORG 2000H MOV A ,20H 。。。 表示其后的指令从2000H开始存放。
若在源程序开始不放ORG指令,则汇编将从0000H开始编排目 标程序。
注意点: 要防止程序的重叠。
(2) DB (Define Byte)
一般形式为:
<标号:> DB <项或项表>
子程序调用举例: 例8. 将单字节无符号数,转换成非压缩的BCD码,用子程序编程。
说明: 使用子程序可以减少编程的工作量,提高程序的可读性。
分析: 单字节无符号数最大为255,因此最多可以转换成3位BCD码。
入口条件: 将单字节无符号数存入累加器A中。
出口条件: R0中存放结果的起始地址。即个位BCD码的地址。
SQR: TAB:
EQU 30H EQU 31H EQU 32H MOV A, DA ACALL SQR MOV R1, A MOV A, DB ACALL SQR ADD A, R1 MOV DC, A SJMP $ INC A MOVC A, @A+PC RET A DB 0,1,4, 9,16 DB 25,36,49,64,81 END
(6) END 源程序结束 一般形式为: <标号:> END
EDN语句是一个结束标志。它告诉汇编程序,该程序段已经 结束。因此,该语句必须放在整个程序之后。
实际使用时,END语句的标号是可有可无的。
二、 汇编语言的构成
1.汇编语言和机器语言
机器语言是用二进制代码“0”和“1”来表示指令和数据的最原 始的程序设计语言。用机器语言编写的程序称为目标程序或机器语 言程序。机器语言能被计算机直接识别和执行,但对人来说,直接 使用机器语言非常困难,因此产生了汇编语言。
MOV JC XCH
MOV LOP1: INC
CJNE MOV RET
A, @R0 LOP1 A, @R1
@R0, A R1 R1, #76H , LOP @R0, A
B, #64H
AB
FIRST, A
A,
B
B, #0AH
AB
SECO , A
THIR , B
$
例2 已知20H单元中有一二 进制数,编程将其转换成3位 BCD数后,百位送入FIRST单元 的低4位,十位和个位分别送 入SECOND单元的高4位和低4位。
FIRST SECOND ORG MOV MOV DIV MOV MOV MOV DIV SWAP ORL MOV SJMP END
子程序名: “zero”; 入口地址: R0,R2
R0中存放子域的起 始地址 R2中存放子域的长 度 出口参数: 无
ORG 0100H MAIN: MOV R0, #20H
MOV R2, #0BH ACALL ZERO MOV R0, #30H MOV R2, #0FH ACALL ZERO MOV R0, #40H MOV R2, #10H ACALL ZERO SJMP $ ZERO: MOV @R0, #00H INC R0 DJNZ R2, ZERO RET END
例1. 将20H单元中的8位无符号数 转换成3位BCD码,并存放到FIRST (百位) 、SECO( 十位)和THIR (个位)中。
FIRST SECO THIR MOV MOV DIV MOV MOV MOV DIV MOV MOV SJMP END
EQU 30H
EQU 31H
EQU 32H
A, 20H
和 ABC: DB
是等价的。
1234H , 08H; 12H, 34H, 00H, 08H
(4) DS或DEFS (Define Storage)预留存储区 一般形式为:
<标号:> DS <表达式> 由标号指定开始单元,定义一个存储区,以备源程序使用。预 留的单元数由表达式的值确定。
例如:
ORG
3C40H
5、查表程序设计 查表程序设计中常用以下指令: MOVC A, @A+DPTR
DA DB DC STAR:
MOVC A, @A+PC
例10 用MOVC A, @A+PC指令编 程,求c=a2+b2的值,设a,b,c分别用 内部RAM单元DA,DB,DC存放。
子程序SQR 入口参数: A 出口参数: A
6、排序程序的编写
例12 编程将已存入内部RAM,70H到75H中的6个数按从小到大 顺序排列.
SORT: LOOP:
LOOP LOP2:
SUB:
LOP:
ORG MOV MOV LCALL INC INC CJNE
2000H R2,#70H R3,#71H SUB R2 R3
R3,
#76H,
SJMP LOP2 END
EQU 30H EQU 31H 0200H A, 20H B, #64H AB FIRST, A A, B B, 0AH AB A A, B SECOND, A $
2、分支程序设计
例3 已知VAR单元内有一个自 变量X,请按如下条件编程求Y, 并将它存入FUNC单元。
X>0, Y=1; X=0, Y=0; X<0, Y=-1;
汇编语言是一种面向机器的语言,使用助记符,每一个助记符 对应一个机器码,因此使用汇编语言编程比使用机器码更方便,但 用汇编语言编写的程序计算机不能直接识别和执行,必须将其翻译 成目标程序,这一翻译过程称为汇编,汇编可以用人工完成也可以 用机器完成。
2.汇编指令的格式 汇编指令由1—4个字段组成,格式如下: <标号:> <操作码><操作数1><操作数2><操作数3 >;<注释>
23H, ‘DAY’
(1000H)=53H (Leabharlann Baidu001H)=74H (1002H)=78H (1003H)=31H (1004H)=32H (1005H)=23H (1006H)=44H (1007H)=41H (1008H)=59H
数字1的ASCII码 数字2的ASCII码
‘DAY’的ASCII码
TEMP: DS
10
…
从3C40开始,保留10个连续的存储单元。
(5) EQU(Equate)为标号赋值 一般形式为: <标号:> EQU nn或<表达式> 其功能是,将语句操作数的值,赋给本语句的标号。故又称为等
值指令。
例如: BLK EQU 1000H
即给标号BLK赋以地址值1000H,在同一个程序中,用EQU给 标号赋以地址值后,标号的值在整个程序中不能再改变。
SJMP HALT
LOOP2: MOV Y1,#01H
HALT: SJMP $
END
3、循环程序编写 例5 将内部RAM 30H开始的10个无符号字节数相加,结果存入30H 单元,设和不超过8位.
MOV R7, #09H MOV R0, #30H MOV A, @R0 LOOP: INC R0 ADD A, @R0 DJNZ R7, LOOP MOV 30H, A SJMP $ END
项或项表,是指一个字节,数或字符串,或以引号括起来的 ASCII码字符串。
该指令的功能是将项或项表的数值存入从标号开始的连续单 元中。
例如: HERE:
SEG1: SEG2:
DB DB ORG DB DB END
84H ;
(HERE)=84H
43H ;
(HERE+1)=43H
1000H
53H, 74H, 78H, ’1’, ’2’
EXBCD:
INC INC PUSH MOV DIV MOV DEC MOV XCH DIV MOV DEC MOV POP RET
R0 R0
B B, #100 AB @R0, A R0 A, #10 A, B AB @R0, A R0
@R0, B B
例9. 将20H—2AH,30H—3EH, 40H—4FH 三个子域清零.
一、 伪指令 1.伪指令的概念
不产生目标代码,不影响程序执行,仅仅产生一些供汇编用 的命令,这样的命令称为伪指令。
2. 伪指令的作用 (1) 指定目标程序或数据存放的地址; (2) 给一些指定的标号赋值; (3) 在内存中预留工作单元; (4)表示源程序结束
3. 伪指令 (1) ORG 伪指令 用于设置起始地址, 一般形式为
2000H R6, #0AH R7,#200
R7, LOOP1 R6, LOOP2
说明:内循环指令周期数 为: 1+1+1+2=5μs 完成一 次内循环需要1001个机器 周期总的延时时间为
10.031ms
4、子程序的编写 (1) 保护和恢复现场 子程序中使用在主程序中使用的寄存器一般需要保护,通常需 要保护的寄存器有PSW、A和Rn等。 保护和恢复的方法是:使用PUSH和POP指令。 (2) 入口和出口参数 入口参数相当于给子程序的已知条件; 出口参数相当于调用子程序后得到的结果。 (3)子程序名 用标号表示子程序名,子程序名通常是子程序的入口地址, 用ret指令表示子程序调用结束。然后,返回到主调函数该调 用的下一条指令处执行。
注意点:项或项表为数值时,取值范围为00-FFH,若为字符 串其长度应限制在80个字符内。
(3) DW (Define Word) 一般形式为:
<标号:> DW <项或项表> 项或项表指一个字,DB用于定义8位数据(一个字节),DW 用于定义16位数据(一个字)。DW伪指令常用来建立地址表。
例如: ABC: DW
VRA FUNC
POSI: DONE:
ORG 0100H EQU 30H EQU 31H MOV A, VAR JZ DONE JNB ACC.7, POSI MOV A, #0FFH SJMP DONE MOV A, #01H MOV FUNC, A SJMP $ END
例4 已知X,Y为无符号数,分别存放于X1,Y1单元中,请按如下 条件编程求Y。
例6. 设从内部RAM的BLOCK单元开始存放一组无符号数,数据长 度存放在NUM单元,试编程求它们的最小值,并存入MIN单元。
ORG 2000H
BLOCK EQU 31H
CJNE A, B, NEXT
MIN EQU 30H
NEXT: JC LOOP
NUM EQU 2FH
MOV A,B
START: DEC NUM MOV R0, #BLOCK MOV A,@R0
51单片机汇编语言程序设计
内容提要:1、介绍伪指令;
2、汇编语言程序的汇编过程;
3、汇编语言实用程序举例。
先介绍几个概念: (1)汇编语言
用助记符表示指令系统的语言称汇编语言。 (2)汇编语言源程序
通常把用汇编语言编写的程序称之为汇编语言源程序。 (3)汇编
将汇编语言源程序“翻译”成机器语言目标程序的过程称为汇 编。 (4)目标程序 通常把可以在计算机上直接运行的机器语言程序称为目标程 序。
LOOP1: INC R0
LOOP: DJNZ NUM, LOOP1
MOV MIN, A
END
MOV B,@R0
例7 设51单片机的时钟频率为12MHz,要求设计一个软件延时程 序延时时间为10ms.
ORG MOV LOOP2: MOV LOOP1: NOP NOP NOP DJNZ DJNZ END
(1)标号 用来表明指令的地址, 用8个或以下的字符组成用字 母或下划线开头,不能使用保留字,可以缺省。
(2)操作码 即指令的助记符,用来指明CPU执行何种操作,是 不能缺少的部分。
(3)操作数 参加运算的数据或数据的地址。 (4)注释 为了方便程序的阅读,而作的说明。
三、 程序设计
1、顺序结构程序编写
例11 将一个16进制数0-F(存放在R0的低4位)转换成ASCII码存放 到原单元。
ORG 2000H MOV DPTR, #TAB MOV A,R0 ANL A,#0FH MOVC A, @A+DPTR MOV R0, A SJMP $ TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H, DB 39H,41H,42H,43H,44H,45H,46H END
-1 x<10
y=
0 10<=x<=20
1 x>20
ORG 2000H
X1 EQU 20H
Y1 EQU 21H
MOV A,X1
CJNE A,#10,NEXT1
NEXT1: JC
LOOP1
CJNE A,#21,NEXT2
NEXT2: JNC LOOP2
MOV Y1, #00H
SJMP HALT
LOOP1: MOV Y1, #0FFH
ORG nn 一般总是出现在某段程序或数据的前面。如
ORG 2000H MOV A ,20H 。。。 表示其后的指令从2000H开始存放。
若在源程序开始不放ORG指令,则汇编将从0000H开始编排目 标程序。
注意点: 要防止程序的重叠。
(2) DB (Define Byte)
一般形式为:
<标号:> DB <项或项表>
子程序调用举例: 例8. 将单字节无符号数,转换成非压缩的BCD码,用子程序编程。
说明: 使用子程序可以减少编程的工作量,提高程序的可读性。
分析: 单字节无符号数最大为255,因此最多可以转换成3位BCD码。
入口条件: 将单字节无符号数存入累加器A中。
出口条件: R0中存放结果的起始地址。即个位BCD码的地址。
SQR: TAB:
EQU 30H EQU 31H EQU 32H MOV A, DA ACALL SQR MOV R1, A MOV A, DB ACALL SQR ADD A, R1 MOV DC, A SJMP $ INC A MOVC A, @A+PC RET A DB 0,1,4, 9,16 DB 25,36,49,64,81 END
(6) END 源程序结束 一般形式为: <标号:> END
EDN语句是一个结束标志。它告诉汇编程序,该程序段已经 结束。因此,该语句必须放在整个程序之后。
实际使用时,END语句的标号是可有可无的。
二、 汇编语言的构成
1.汇编语言和机器语言
机器语言是用二进制代码“0”和“1”来表示指令和数据的最原 始的程序设计语言。用机器语言编写的程序称为目标程序或机器语 言程序。机器语言能被计算机直接识别和执行,但对人来说,直接 使用机器语言非常困难,因此产生了汇编语言。