51 汇编语言源程序的格式
第 五 章 汇 编 语 言 程 序 设 计
4. 子程序 ③通过堆栈传递参数 例5.19 在HEX单元有2个16进制数, 试将它们分别转换成ASCII码, 存 入ASC和ASC+1单元。 HEX DATA 30H ASC DATA 31H PUSH HEX ACALL HASC POP ASC MOV A, HEX SWAP A PUSH ACC ACALL HASC POP ASC+1 SJMP $
5.4 MCS-51程序设计举例
第 五 章 汇 编 语 言 程 序 设 计
4. 子程序 ①通过R0~R7或A来传送数据
2
03 31 09
例5.17 用程序实现c=a2+b2。设a,b,c存于内部RAM的D1,D2,D3。 MOV A, D1 ACALLSQR MOV R1, A MOV A, D2 ACALLSQR ADD A, R1 MOV D3, A SJMP $ SQR: INC A MOVC A, @A+PC RET TAB: DB 0, 1, 4, 9, 16 DB 25, 36, 49, 64, 81 END
2
03 31 09
MOV MOV LOOP: MOV ANL ADD MOVC MOV INC MOV
TEMP, R0 TEMP+1,R1 A, @R0 A, #0FH A, #18 A, @A+PC @R1, A R1 A, @R0
SWAP A ANL A, #0FH ADD A, #9 MOVC A, @A+PC MOV @R1, A INC R1 INC R0 DJNZ R2, LOOP MOV R0, TEMP MOV R1, TEMP+1 ; RET ASCTB:DB “0,1,2,3,4,5,6,7,8,9” DB “A,B,C,D,E,F” TEMP DATA 20H END
R1, R2,
#BLOCK
#SUM #0
N2:
ADD
INC MOV
A,
R1 @R1,
B
A R2 R3 A
MOV
MOV JNB MOV N1: INC MOV JNB
R3,
A, R2, R0 B, B.7,
#0
@R0 #0FFH @R0 N2
DEC
MOV MOV RET
R1
A, @R1,
ACC.7, N1
格式: OGR
eg. ORG START:MOV
16位地址
2000H A,#64H
2. END(汇编结束)——在END以后所写的指令,汇编程序都不予处理。源程
序中只能有一条END,放在所有指令的最后。
格式:END 3. EQU(等值命令)——将一个数或特定的汇编符号赋予规定的字符名称。用
EQU定义的字符名称,必须先定义后使用,且通常不能用于表达式中。
2
03 31 09
HASC: DEC SP DEC SP POP ACC ANL A, #0FH ADD A, #7 MOVC A, @A+PC PUSH ACC INC SP INC SP RET ASCTB:DB “0, 1, 2, 3, 4, 5, 6, 7” DB “8, 9, A, B, C, D, E, F” END
2. 操作数
A. 对于#data: #10010010B; #10; #9BH; #0ABH→注意不能丢掉前面的0; 否则 按符号地址ABH处理。eg. MOV A,#0ABH <=> MOV A,#ABH B. 对于直接地址dirdct可以用: ①10010011B;98;0F9H;eg. MOV A,98 ②标号地址:eg. MOV A,SUM ③带 +、-号的表达式 => 直接地址:eg. MOV A,SUM+3 ④SFR名:eg. MOV A,P2 C. 对于相对寻址的 rel:除可以采用上面提到的① ② ③外,还允许采用一个专 门的符号“$”,它表示相对转移指令所在的地址。eg. JNB TF0,$ *源程序中除“注释”外,不能出现全角符号;即必须全为西文字符。
5.4 MCS-51程序设计举例
第 五 章 汇 编 语 言 程 序 设 计
1. 分支程序设计 例5.8 设有4分支, 对应R3的值为 0~3; 每分支用于分别从内部RAM, 外部RAM256B, 外部64kB, 或外部 RAM4kB缓冲区读取数据, 设低8 位地址=>R0,高8位地址=>R1。 MOV A, R3 MOV DPTR, #BRTAB MOVC A, @A+DPTR JMP @A+DPTR BRTAB:DB BR0 -BRTAB DB BR1 -BRTAB DB BR2 -BRTAB DB BR3 -BRTAB BR0: MOV SJMP MOVX SJMP MOV MOV MOVX SJMP MOV ANL ANL ORL MOVX SJMP A, BRE A, BRE DPL, DPH, A, BRE A, A, P2, P2, A, $
03 31 09
5.2 伪指令
第 五 章 汇 编 语 言 程 序 设 计
1
每种汇编语言都会定义若干条伪指令,用来对汇编过程进行某种控 制,或者对符号、标号赋值。 1. ORG(汇编起始命令)——用于规定下面的目标程序的起始地址,在源程序
中可以多次使用,但所规定的地址必须从小到大,且不能造成地址重叠。
5.4 MCS-51程序设计举例
第 五 章 汇 编 语 言 程 序 设 计
5. 运算程序
2
例5.20 8位带符号数加法, 和超过8位。两个加数存于BLOCK和BLOCK+1单元, 和存在SUM和SUM+1单元。(先将两个8位带符号数扩展为16位带符号数,再相加)
MOV
MOV SUB: MOV
R0,
03 31 09
5.4 MCS-51程序设计举例
第 五 章 汇 编 语 言 程 序 设 计
1. 分支程序设计
1
例5.6_设变量X存放在VAR单元, 函数值Y存放在FUNC单元。按下式给Y赋值: -1 X < 10 Y= 0 10≤X≤20 1 20 < X VAR DATA 30H FUNC DATA 31H MOV A, VAR
5.4 MCS-51程序设计举例
第 五 章 汇 编 语 言 程 序 设 计
②通过R0, R1和DPTR传递数据所在地址
2
例5.18 求两个无符号数据块的最大值。数据块的首地址为BLOCK1和BLOCK2, 每个数据块的第一个字节都存放数据块的长度,设长度不为0,结果存入MAX单元。
TEM
DATA 20H MOV R1, #BLOCK1 ACALLFMAX MOV TEM, A MOV R1, #BLOCK2 ACALLFMAX CJNE A, TEM, NEX NEX: JNC NEX1 MOV A, TEM NEX1: MOV MAX, A SJMP $
{
CJNE NEXT1: JC MOV CJNE NEXT3: JNC MOV SJMP NEXT2: MOV NEXT4: MOV
A, #10, NEXT1 NEXT2 R0, #1 A, #21, NEXT3 NEXT4 R0, #0 NEXT4 R0, #0FFH FUNC, R0
03 31 09
R1
40H, 79H, 24H 0H, 19H, 12H 02H, 78H, 00H, 18H
5.4 MCS-51程序设计举例
第 五 章 汇 编 语 言 程 序 设 计
3. 查表程序 例5.15 将一组16进制数转换为ASCII
码。每个字节内存放两个16进制数。 16进制数据块首地址存于R0,存放 ASCII码区域的首地址存于R1,数据 块长度存于R2。
2
LOOP:
NEXT: RESU:
03 31 09
KTAB:
MOV MOV MOV MOV MOVC CJNE SJMP INC SJMP MOV RET DB DB DB
R1, B, DPTR, A, A, A, B, RESU R1 LOOP A,
#00H A #KTAB R1 @A+DPTR NEXT
5.4 MCS-51程序设计举例
第 五 章 汇 编 语 言 程 序 设 计
例5.13 有10组3字节的被加数和加数, 分别存在两个数据块中, 首地址
2
分别存于R0和R1中, 求这10组数的10组和, 各组的和仍送回以R0为指针的单元。
03 31 09
MOV MOV MOV LOOP: MOV CLR LOOP1:MOV ADDC MOV INC INC DJNZ DJNZ MOV MOV TEMP DATA
TEMP, TEMP+1, R3, R2, C A, A, @R0, R0 R1 R2, R3, R0, R1, 20H
R0 R1 #10 #3
@R0 @R1 A
LOOP1 LOOP TEMP TEMP+1
5.4 MCS-51程序设计举例
第 五 章ห้องสมุดไป่ตู้汇 编 语 言 程 序 设 计
3. 查表程序
例5.16若A中存放的是某一位十进制数的7段码, 通过查表程序, 将其转 换为相应的BCD码, 仍存于A中。
03 31 09
格式:字符名称 EQU 数或汇编符号 4. DATA(数据地址赋值命令)——将数据地址或代码地址赋予规定的字符名
称; 用DATA定义的字符名称,允许先使用后定义,且可用在表达式中。
格式:字符名称 DATA 表达式
5.2 伪指令
第 五 章 汇 编 语 言 程 序 设 计
1
5. BIT(位地址符号命令)——将位地址赋予所规定的字符名称。 格式:字符名称 BIT 位地址;eg. A1 BIT P1.0 ; A2 BIT 20H 6. DB/DW(定义字节/字命令)——从指定地址单元开始, 定义若干个8/16 位内存单元内容 格式: [标号:] DB 8位二进制数表 ; [标号:] DW 16位二进制数表 ;(*高8位在前,低8位在后) eg. lab: DB 45H, 73, “5”, “A” DW 45H, 73, “5”, “A” *注意2者的区别 7. DS(定义空间命令)——从指定地址单元开始,保留若干字节内存空间备用。 格式: [标号:] DS 表达式 ; **以上6、7两条伪指令均只能作用于ROM