第三章 计算机指令系统
3-1 指令格式
3-2 指令寻址方式
3-3 状态标志
3-4 MCS-51指令系统一,汇编语言指令格式
[标号,]操作码 操作数 1,操作数 2[;注释 ]
换行表示一条指令结束。
例,LOOP,MOV A,#40H ; 取参数
1.标号,指令的符号地址
2.操作码,指明指令功能 。
3.操作数,指令操作对象数据、地址、寄存器名及约定符号。
4.注释行,说明指令在程序中的作用。
操作码和操作数 是指令主体。
MOV__move传送
XCH__exchange交换
ANL__and logic与逻辑运算
XRL__exclusive or异或运算
MUL__Multiply乘法
RR__rotate right右循环
SJMP__short jump短跳转
RET__return 子程序返回
3-1 指令格式二,机器语言指令格式操作码 [操作数 1] [操作数 2]
有单字节、双字节和三字节指令。
汇编语言指令中操作码和操作数是指令主体,称为指令可执行部分,指令表中可查出对应指令代码。
举例:
汇编语言,机器语言:
MOV A,R0 E8H
MOV R6,#32H 7E 32H
MOV 40H,#100H 75 40 64H
1110100001111110
00110010
01110101
01000000
01100100
3-2 指令寻址方式
3-2-1 操作数类型位 (b)─ 位寻址区中的一位二进制数据字节 (B)─ 8 位二进制数据字 (W)─ 16 位双字节数据
3-2-2 寻址方式一,立即寻址方式指令中给出实际操作数据 (立即数 ),一般用于为寄存器或存储器赋常数初值。
举例:
8位立即数,MOV A,#40H ; A?40H
16位立即数,MOV DPTR,#2100H ; DPTR?2100H
二,直接寻址方式指令操作数是存储器单元地址,数据在存储器单元中。
MOV A,40H ; A?(40H)
直接寻址方式对数据操作时,地址是固定值,而地址所指定的单元内容为变量形式。
41H 78H
40H 56H
56H
例,设存储器两个单元的内容如图所示,
执行指令 MOV A,40H后 A =?
思考题,直接寻址方式指令和立即寻址方式指令的形式有什么不同?
三,寄存器寻址方式指令操作数为寄存器名,数据在寄存器中。
例,MOV A,R0; A?R0
设指令执行前 A=20H,R0=40H,
执行指令后,A=?,R0=?
四,寄存器间接寻址方式指令的操作数为寄存器名,寄存器中为数据地址。
存放地址的寄存器称为间址寄存器或数据指针。
例,MOV A,@R0; A?(R0)
设指令执行前 A=20H,R0=40H,地址为 40H存储器单元内容如图所示 。 执行指令后,
A=?,R0 =?,(40H)=?
41H 67H
40H 34H34H 40H 34H
40H 40H
0100 0000
A
0010 0000
R0
10
R0→
五,变址间接寻址方式数据在存储器中,指令给出的寄存器中为数据的基地址和偏移量。
数据地址 = 基地址 + 偏移量。
例,MOVC A,@A+DPTR; A?(A+DPTR)
设指令执行前 A=09H,DPTR=2000H,存储器单元内容如图所示。执行指令后,A=?
DPTR=?
12H
2000H
六,位寻址方式指令给出位地址。一位数据在存储器位寻址区。
例,MOV C,40H; Cy?(位地址 40H)
设指令执行前 Cy=1,位地址 40H存储器单元如图,
执行指令后,Cy=?
28H 01100010
29H 11010111
位寻址区
0
2008H 89H
2009H 12H
3-4 MCS-51指令系统分析指令功能分类:
数据传送、数据操作、布尔处理、程序控制。
3-4-1 数据传送指令实现寄存器、存储器之间的数据传送。
一,内部传送指令,片内数据存储器数据传送。
二,外部传送指令,片外数据存储器数据传送。
三,交换指令,片内数据存储器数据传送。
四,堆栈操作指令,片内数据存储器数据传送。
五,查表指令,程序存储器数据传送。
(一 )内部传送指令,实现片内数据存储器中数据传送。
指令格式,MOV 目的 操作数,源 操作数寻址方式,立即寻址、直接寻址、寄存器寻址、寄存器间址。
习题 1,找出配对指令,实现反向传送。
指令机器码:
11101rrr E8~ EF
11100101 n E5 n
1110011i E6,E7
01110100 d 74 d
10101rrr n
1010011i n
85 n1 n2
90 d1 d2
MOV A,Rn ; A←Rn,Rn=R0~ R7
MOV A,n ; A←(n),
MOV A,@Ri ; A←(Ri),Ri=R0,R1
MOV A,#d ; A←d,
MOV Rn,n ; Rn←(n)
MOV @Ri,n ; (Ri)←(n)
MOV n1,n2 ; (n1)←(n2)
MOV DPTR,#d1d2 ; DPTR←d1d2
例 3-4-1,顺序执行下列指令序列,求每一步执行结果 。
MOV A,#30H
MOV 4FH,A
MOV R0,#20H
MOV @R0,4FH
MOV 21H,20H
地址 内容
…
60H 32 H
…
32H 58H
习题 2,用两种寻址方式实现,将片内 RAM 60H单元的数据传送给累加器 A。
解,MOV A,#60H MOV R0,#60H MOV A,@R0; A= 30H; (4FH)= 30H; R0= 20H; (20H)= 30H; (21H)= 30H
,60H
,60H
说明:
只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。
1,一条指令中不能同时出现两个工作寄存器:
非法 指令,MOV R1,R2
MOV R2,@R0
2,间址寄存器只能使用 R0,R1。
非法 指令,MOV A,@R2
3,SFR区只能直接寻址,不能用寄存器间接寻址。
非法 指令,MOV R0,#80H
MOV A,@R0
4,指令表,B,指令字节数,M,机器周期数
(二) 外部传送指令实现片外数据存储器和 A累加器之间的数据传送。
指令格式,MOVX 目的 操作数,源 操作数寻址方式:片外数据存储器用寄存器间址方式。
1,DPTR作 16位数据指针,寻址 64KB片外 RAM空间
MOVX A,@DPTR ; A←(DPTR)
MOVX @DPTR,A ; (DPTR)←A
2,Ri作 8位数据指针,寻址 256B片外 RAM空间
MOVX A,@Ri ; A←(Ri)
MOVX @Ri,A ; (Ri)←A
例 3-4-2:
实现片外数据存储器数据传送 (2000H)?(2100H)。
MOV DPTR,#2000H
MOVX A,@DPTR
MOV DPTR,#2100H
MOVX @DPTR,A
片外 R A M
地址 内容
2000H X
…
D P T R →
2100H
片外 R A M
地址 内容
2000H X
…
D P T R → 2100H X
习题 3,将片外 RAM 0000H单元的数据传送到片内 RAM的
60H单元 。; DPTR= 2000H; A= X; DPTR= 2100H; (2100H)= X
片外数据存储器不能直接寻址。下列为 非法 指令:
MOVX A,2000H
MOVX 2100H,2000H
思考题,为什么对 DPTR的数据传送使用内部传送指令?
(三) 交换指令实现片内 RAM区的数据双向传送。
1,字节交换指令
XCH A,Rn ; A? Rn
XCH A,@Ri; A?(Ri)
XCH A,n ; A?(n)
片内 R A M
地址 内容
2 B H 35H
2 A H 38H
…
20H
习题 4,将片内 RAM60H单元与 61H单元的数据交换 。
例,设 A= 29H,执行指令 XCH A,2AH后,A=?
(2AH)=?
38H
29H
XCH 60H,61H ← 对吗?
29 H
2,半字节交换指令
XCHD A,@Ri ; A0~ 3?(Ri)0~ 3
SWAP A ; A4~ 7?
A0~ 3例 3-4-3,将片内 RAM 2AH和 2BH单元中的
ASCII码转换成压缩式 BCD码存入 20H单元。
压缩式 B C D 码千位 百位十位 个位
A 00000000 00H000010001000000010000101 088085
MOV A,#0R0,#2AH1,BXCHD A,@R0SWAP,1XCH A,20H
00H
片内 R A M
地址 内容
2 B H 35H
2 A H 38H
…
20H85H
R1→
R0→
单字节 B C D
0000 千位
0000 百位
0000 十位
0000 个位习题,交换片内 RAM 40H单元和 41H单元的低半字节。
(四)堆栈操作指令入栈指令,PUSH n ; SP?SP+1,(SP)?(n)
出栈指令,POP n ; (n)?(SP),SP?SP-1
例,设 A=02,B=56H,执行下列指令后,
SP=?,A=?,B=?
片内 R A M
34H
33H
32H
31H
30H
×
×
×
×
SP→ ×
×
×
×
SP→ 02
×
×
×
SP→ 56H
×
×
×
56H
02H
SP→ ×
×
×
→ 56H
02
×
×
×
→
×
×
×
56H
→
×
02H
A
00×
SBR,MOV SP,#30H ;设栈底
PUSH A
PUSH B
MOV A,#0
MOV B,#01
…
POP B
POP A
(五 ) 查表指令实现从程序存储器读取数据到 A累加器,只能使用变址间接寻址方式 。
多用于查常数表程序,可直接求取常数表中的函数值。
1,DPTR为基址寄存器
MOVC A,@A+DPTR ; A?(A+DPTR)
查表范围为 64KB 程序存储器任意空间,称为远程查表指令 。
2,PC为基址寄存器
MOVC A,@A+PC ; A?(A+PC)
常数表只能在查表指令后 256B范围内。
例:查表法求 Y=X2。 设 X(0≤X≤15) 在片内 RAM的 20H单元中,要求将查表求 Y,存入片内 RAM21H单元。
1) ORG 1000H
SQU,MOV DPTR,#TAB ;确定表首地址(基地址)
MOV A,20H ; 取 X( 偏移量
MOVC A,@A+DPTR; 查表求 Y=X2
MOV 21H,A ; 保存 Y
RET ; 子程序结束
… ;其它程序段
ORG 3000H ; 常数表格首地址
TAB,DB 00,01,04,09,…,225 ; 平方表
2) 指令地址 源程序
ORG 1000H ; 程序起始地址
1000H SQU,MOV A,20H ; 取 X
1002H ADD A,#3 ; 修正偏移量
1004H MOVC A,@A+PC ; 查表求 Y=X2
1005H MOV 21H,A ; 存结果
1007H RET ; 子程序结束
1008H TAB,DB 00,01,04 ; 平方表
100BH DB 09,…,225
思考题,当 0≤ X≤255 时,如何用查表法编程求 Y=X2。
例,查表法求 Y=X2。 设 X(0≤X≤15) 在片内 RAM的 20H单元中,要求将查表求 Y,存入片内 RAM21H单元。
习题,找出指令错误并改正:
1,MOV A,#1000H ; A← 1000H
2,MOVX A,1000H ; A←( 1000H)片外 RAM
3,MOVC A,1000H ; A←( 1000H)片外 ROM
4,MOVX 60H,A ; 片外 RAM(60H)←A
5,MOV R0,60H ; 片内 RAM,(61H)←( 60H)
MOV 61H,@R0
6,XCH R1,R2 ; R1←→R 2
7,MOVX DPTR,#2000H; DPTR← 2000H
8,MOVX 60H,@DPTR ; 片内 RAM← 片外 RAM
3-4-2 算术运算指令与数据传送指令不同,多数算术运算指令会影响标志位的状态,即 CPU执行算术运算指令后,根据数据操作情况自动设置标志位的状态。
3-3 状态标志
C y AC F0 RS1 RS0 OV — P
MCS-51 的程序状态字寄存器 PSW 为标志寄存器。
其格式如下:
1,标志位 (自动设置状态 )
1) Cy:进位标志位保存运算后最高位的进位 /借位状态,当有进位 /
借位,Cy=1,否则 Cy=0。
2) AC:辅助进位标志位保存低半字节的进位 /借位状态,当 D3产生进位 /
借位,AC=1,否则 AC=0。 用于十进制调整。
3) OV:溢出标志位
OV=Cy7?Cy6,补码运算产生溢出 OV=1,否则 OV=0。
4) P:奇偶标志位反映累加器 A中数据的奇偶性。当 1的个数为奇数,
P=1,否则 P=0。
2.用户选择位 (编程设置状态 )
1) F0:用户自定义标志位。
2) RS1,RS0:
工作寄存器区选择位。
复位时,PSW=00H
RS1 RS0 工作寄存器
0 0 0区
0 1 1区
1 0 2区
1 1 3区例,复位后,设置使用工作寄存器
2区,其余标志位不变。
解,MOV PSW,#
C y AC F0 RS1 RS0 OV — P
18H
3-4-2 算术运算指令完成片内 RAM 和 A 中数据的加减乘除运算 。
一,加减指令
1.加法指令
0011 1011
+ 0011 1011
0111 0110
76H 0 0 1 1
1)不带进位加法,ADD A,源 操作数
ADD A,R2 ; A←A+R2,影响 Cy,OV,AC,P
例 1,A=3BH,PSW=0,执行指令 ADD A,#3BH
求,A=,Cy=,OV=,AC=,P=,
PSW=?01000001= 41H
C y AC F0 RS1 RS0 OV — P
1001 1010
1110 0011
+ 0
1 0111 1101
2) 带进位加法,ADDC A,源 操作数
ADDC A,R2 ; A←A+R2+Cy,影响 Cy,OV,AC,P
7DH 1 1 0 0
例 2,A= 9AH,R2= E3H,PSW= 0,执行指令
ADDC A,R2 后求:
A=,Cy=,OV=,AC=,P=,
PSW=?10000100 = 84H
C y AC F0 RS1 RS0 OV — P
带进位加法指令 ADDC用于多字节运算例,设双字节数 X 存在片内 RAM 41H,40H单元,Y存在
42H,43H单元,编程求 Z=X+Y,并存入片内 RAM单元
44H,45H,46H。
片内 RAM
地址 内容
46H Z
H
45H Z
M
44H Z
L
43H Y
H
42H Y
L
41H X
H
40H X
L
ADDS,MOV A,40H
ADD A,42H
MOV 44H,A
MOV A,41H
ADDC A,43H
MOV 45H,A
MOV A,#0
ADDC A,#0
MOV 46H,A
RET; 取被加数低字节;加上加数低字节;保存和的低字节;取被加数高字节;加上加数高字节;保存和的高字节;求高字节进位;子程序结束;低字节相加;高字节相加;计算高字节进位;子程序结束十进制加法指令,
ADD A,源操作数
DAA
带进位十进制加法指令,
ADDC A,源操作数
DA A
作业,BCD码加法编程。
设 X,Y为 4位压缩 BCD码,求 Z=X+Y。
BCD调整指令:
DA A ; 对 A 中加法结果进行调整
2.减法指令
SUBB A,源 操作数 ;带借位减法指令
SUBB A,R2 ; A←A -R2-Cy,; 影响 Cy,OV,AC,P
00 0 0 0 0
习题,编程求双字节减法 。 设 X,Y存在片内 RAM 60H
起始单元,计算 Z=X-Y 。
例,A= 5AH,R2= 5AH,Cy= 0,执行下列指令
SUBB A,R2
求,A=,Cy=,OV=,P=,AC=?
3,增量、减量指令
INC 单操作数如,INC R2 ; R2←R2+1
DEC 单操作数如,DEC R2 ; R2←R2 -1
INC DPTR ; DPTR←DPTR+1
不影响标志位状态 。
注意,没有指令 DEC DPTR
可用指令 DEC DPL 代替
4.乘除指令
MUL AB ; BA←A × B,Cy← 0,; 当积高字节 B=0,OV← 0; B≠ 0,则 OV← 1
例,A= 96(60H),B= 192(C0H),执行指令 MUL AB
后,
求,A=,B=,Cy=,OV=,P=?
解,96 × 192 = 18432(4800H)
00H 48H 0 1 0
12H 0CH 0 0 0
例,A= 156(F6H),B= 13(0DH),执行指令 DIV AB
后求,A=,B=,Cy=,OV=,P=?
解,156 ÷ 13 = 18(12H),余数 = 12(0CH)。思考题,如何实现多字节数据的乘除运算 。
DIV AB ; A÷ B,A← 商,B← 余数,Cy←0,; 当除数 B=0,OV←1 ; B≠0,则 OV←0
3-4-2 逻辑运算指令一,单操作数指令 ( A累加器为操作数 )
1,A清 0指令,CLR A ; A← 0
2,A取反指令,CPL A ; A←/A
3,循环移位指令:
1) 8位循环指令:
RL A ; A循环左移一位
RR A ; A循环右移一位
2) 9位循环指令:
RLC A; 带 Cy循环左移一位
RRC A; 带 Cy循环右移一位例 3-4-7,设 A= 11000101,Cy= 0,分别执行下列单条指令,CPL A 求,A=,Cy=
RL A
RLC A
00111010 01 00 1 1
用 9位循环指令实现多字节移位例,编程将寄存器 R6R5 中的双字节数 X左移一位。
CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
0
Cy R6 R5 Cy; Cy=0,设 R6= 55H,R5= AAH; R6=01010101,R5=10101010,Cy=0; R6=01010101,R5=01010100,Cy=1; R6=10101011,R5=01010100,Cy=0
思考题,如何将寄存器 R6R5中的双字节数 X右移一位。
(二 )双操作数逻辑运算指令 (对位逻辑运算 ):
ANL,ORL,XRL
习题 1,如何将累加器 A中的数据高 4位清 0,低位不变?
习题 2,如何将寄存器 R2中的数据奇数位取反,偶数位不变?
例 3-5-8 A=01×××××× B,× 表示随机状态,为 1
或 0,执行下述一组指令执行后 A的值如何?
XRL A,#0C0H ; 将累加器 A的内容 D7,D6取反
ORL A,#03H ; 将累加器 A的内容 D1,D0置 1
ANL A,#0E7H ; 将累加器 A的内容 D4,D3清 0
解,执行上述指令后,A=10× 00× 11B。
3-4-4 布尔变量操作指令对片内 RAM中位寻址区操作。位累加器 Cy和位地址 b。
一,位传送
MOV C,b ; Cy?(b)
MOV b,C ; (b)?Cy
26H 1 0 1 1 0 1 0 1
25H 1 0 0 0 0 1 1 0
24H 0 1 1 1 0 0 0 0
例:将位地址 20H的一位数传送到位地址 30H中:
MOV C,20H
MOV 30H,C
二.位清 0、置 1、取反,CLR,SETB,CPL:
CLR C ; Cy?0,
CLR 40H ; (位地址 40H)? 0
三.逻辑运算,ANL,ORL:
ANL C,40H ; C←C∧(40H)
ANL C,/40H ; C←C∧/(40H)
例:设 Cy=1,(位地址 40H)=1,执行指令
ANL C,/40H 后,
Cy=?,(位地址 40H)=?
位地址表示法,
位地址 40H,位寄存器 F0,字节加位 ACC.0
0
习题,设累加器 A中数据为 29H,Cy=0,执行指令
ORL C,0E3H 后,Cy=?
1
4-4-1 转移指令转移指令通过改写 PC的当前值,从而改变 CPU执行程序的顺序,使程序发生跳转。
按转移条件分类:
1)无条件转移,
执行无条件转移指令,程序无条件转移到指定处 。
2)条件转移,
指令中给出转移条件,执行指令时,先测试条件,
若满足条件,则程序发生转移,否则,仍顺序执行程序 。
按转移方式分类:
1 0 0 0 H S J M P
02
1 0 0 4 H
1)绝对转移,指令给出转移目的的绝对地址 nn,
执行指令后,PC?nn。
2)相对转移,指令给出转移目的与转移指令的相对偏移量 e,执行指令后,PC?PC + e 。
例,地址 源程序
1000H LJMP 2000H
1003H …
…
2000H … ; 转移目的指令例,地址 源程序
1000H SJMP 02
…
1004H … ; 转移目的指令一,无条件转移指令
1.长转移指令:
LJMP nn ; PC? nn
指令机器码,02 nnH nnL
指令转移范围,64KB
2.绝对转移指令:
AJMP pn ; PC?PC+2; PC10~ 0?pn10~ 0; PC15~ 11不变指令机器码,pn10~ 8 00001,pn7~ 0
指令转移范围,2KB
转移时要求转移前后保持 PC15~ 11不变。
相对偏移量 e 的计算式,
e = 目的指令地址 -(转移指令地址 +指令字节数 )
= 目的地址 - PC当前值
3.短转移指令:
SJMP e ; PC?PC+2,PC?PC+e
指令机器码,80H,e
相对偏移量 e为 8位补码。
指令转移范围:前 128~后 127字节编程时,用标号代替转移目的地址,转移指令的操作数交给汇编程序计算。
LJMP NEXT AJMP NEXT SJMP NEXT
…
NEXT:
例 1,计算转移指令的相对偏移量 e,并判断是否超出转移范围。
例 2,求原地踏步指令的指令代码
HERE,SJMP HERE 求出指令代码为,80 FE
H
相对偏移量 = 2150H -(2130H+2)= 001EH,
只取低 8位,e = 1EH 指令机器码,80 1E
H 习题,计算程序中转移指令的相对偏移量 e,并判断是否超出转移范围。
地址 源程序
2130H LOOP,…
…
21B0H SJMP LOOP
指令地址 源程序
2130H SJMP NEXT
…
2150H NEXT,MOV A,R2
4,间接转移指令 (多分支转移指令 )
JMP @A+DPTR,; PC?A+DPTR
指令机器码 73H,指令转移范围 64KB。
KEY,MOV DPTR,#KTAB
MOV A,40H
ADD A,A
JMP @A+DPTR
KTAB,AJMP FUNC0
AJMP FUNC1
…
FUNC0,…
FUNC1,…
应用,处理功能键。
要求不同功能键执行不同程序段。设每个功能键对应一个键值 X(0≤X≤FH) 。
设 X已存入片内 RAM的 40H
单元中。
若 X=0,则执行程序段 FUNC0
若 X=1,则执行程序段 FUNC1
… 。
二.条件转移指令
1,判零转移指令
JZ e ; PC←PC+2,; 若 A=00H,PC←PC+e( 转移 ),;若 A≠00H,PC不变 (不转移 )
条件转移指令形成程序的分支,赋予计算机判断决策能力转移条件,1)标志位的状态 2)位地址中的状态
JNZ e ; PC←PC+2,若 A≠00H,; PC←PC+ e( 转移 );若 A=00H,PC不变 (不转移 )
2.判 Cy转移指令
JC e ; Cy=1则转移,Cy=0不转移
JNC e ; Cy=0则转移,Cy=1不转移
3.判位转移指令
JB b,e ; (b)=1转移,否则不转移
JNB b,e ; (b)=0转移,否则不转移
4,判位清 0转移指令:
JBC b,e ; (b)=1转移,且 (b)?0,否则不转移
5,比较不相等转移指令:
CJNE 操作数 1,操作数 2,e
CJNE A,n,e ; PC←PC+3; 若 A≠(n),则 PC←PC+e;且当 A>(n),Cy=0,当 A<(n),Cy=1;;若 A =(n),PC不变,且 Cy=0。
相当于两个操作数相减,仅影响标志状态,不保存结果
6,循环转移指令:
DJNZ 操作数,e
DJNZ R2,e ; PC←PC+2,R2←R2 -1;若 R2≠0,PC←PC+e,; 若 R2=0,PC不变。
例:用于循环结构程序。设要求程序循环执行 100次
MOV R2,#100 ; 设循环计数器初值
LOOP,… ; 多次循环程序段
DJNZ R2,LOOP ; 循环控制
… ;循环结束习题,当循环计数器初值为 0,循环次数有多少?
4-6-3 子程序调用和返回指令子程序调用和返回指令也使程序发生转移。
一.长调用指令
LCALL nn ; PC?PC+3,; SP?SP+1,(SP)?PCL,SP?SP+1,(SP)?PCH; PC?nn
nn为子程序起始地址,编程时可用标号代替。
指令机器码,12 nnH nnL
指令调用范围,64KB
主程序
…
C A L L S
…
C A L L S
…
子程序 S
…
…
…
R E T
子程序调用过程:
与转移指令不同:转移时,
先用堆栈保存当前地址二.绝对调用指令
ACALL pn ; PC?PC+2; SP?SP+1,(SP)?PCL,SP?SP+1,(SP)?PCH; PC10~ 0?pn10~ 0; PC15~ 11不变
pn为 子程序首地址指令机器码,pn10~ 810001,pn7~ 0
指令调用范围 2KB。
三.子程序返回指令
RET; PCH?(SP),SP?SP-1,PCL?(SP),SP?SP-1
指令机器码,22H
RET指令从堆栈弹出保存的 PC地址,实现子程序返回。
片内 R A M
35H
34H
33H
32H
31H
30H ×
20H
92H
21H
53H
SP→
SP→
SP→
PC
2000H208FH209221002150215322002250225121FFH
程序存储器
2000H M O V S P,#30H
…
20 8FH L C A L L 21 00 H
…
2100H …
…
2150H L C A L L 22 00 H
…
21 FF H R E T
2200H …
…
2250H R E T
MAIN,MOV SP,#30H; 设置栈底
…
LCALL SUB ; 调用子程序
…
SUB,… ; 子程序段
…
RET ; 返回主程序例:子程序嵌套注意,1.子程序起始指令要使用标号,用作子程序名。
2,执行返回指令 RET之前,保证栈顶内容为主程序返回地址,以便正确返回主程序。
常用格式,
MAIN,… ; 主程序
LCALL SUBR ; 调用 SUBR
…
…
SUBR,… ; 子程序首地址
…
RET ; 子程序返回
3-1 指令格式
3-2 指令寻址方式
3-3 状态标志
3-4 MCS-51指令系统一,汇编语言指令格式
[标号,]操作码 操作数 1,操作数 2[;注释 ]
换行表示一条指令结束。
例,LOOP,MOV A,#40H ; 取参数
1.标号,指令的符号地址
2.操作码,指明指令功能 。
3.操作数,指令操作对象数据、地址、寄存器名及约定符号。
4.注释行,说明指令在程序中的作用。
操作码和操作数 是指令主体。
MOV__move传送
XCH__exchange交换
ANL__and logic与逻辑运算
XRL__exclusive or异或运算
MUL__Multiply乘法
RR__rotate right右循环
SJMP__short jump短跳转
RET__return 子程序返回
3-1 指令格式二,机器语言指令格式操作码 [操作数 1] [操作数 2]
有单字节、双字节和三字节指令。
汇编语言指令中操作码和操作数是指令主体,称为指令可执行部分,指令表中可查出对应指令代码。
举例:
汇编语言,机器语言:
MOV A,R0 E8H
MOV R6,#32H 7E 32H
MOV 40H,#100H 75 40 64H
1110100001111110
00110010
01110101
01000000
01100100
3-2 指令寻址方式
3-2-1 操作数类型位 (b)─ 位寻址区中的一位二进制数据字节 (B)─ 8 位二进制数据字 (W)─ 16 位双字节数据
3-2-2 寻址方式一,立即寻址方式指令中给出实际操作数据 (立即数 ),一般用于为寄存器或存储器赋常数初值。
举例:
8位立即数,MOV A,#40H ; A?40H
16位立即数,MOV DPTR,#2100H ; DPTR?2100H
二,直接寻址方式指令操作数是存储器单元地址,数据在存储器单元中。
MOV A,40H ; A?(40H)
直接寻址方式对数据操作时,地址是固定值,而地址所指定的单元内容为变量形式。
41H 78H
40H 56H
56H
例,设存储器两个单元的内容如图所示,
执行指令 MOV A,40H后 A =?
思考题,直接寻址方式指令和立即寻址方式指令的形式有什么不同?
三,寄存器寻址方式指令操作数为寄存器名,数据在寄存器中。
例,MOV A,R0; A?R0
设指令执行前 A=20H,R0=40H,
执行指令后,A=?,R0=?
四,寄存器间接寻址方式指令的操作数为寄存器名,寄存器中为数据地址。
存放地址的寄存器称为间址寄存器或数据指针。
例,MOV A,@R0; A?(R0)
设指令执行前 A=20H,R0=40H,地址为 40H存储器单元内容如图所示 。 执行指令后,
A=?,R0 =?,(40H)=?
41H 67H
40H 34H34H 40H 34H
40H 40H
0100 0000
A
0010 0000
R0
10
R0→
五,变址间接寻址方式数据在存储器中,指令给出的寄存器中为数据的基地址和偏移量。
数据地址 = 基地址 + 偏移量。
例,MOVC A,@A+DPTR; A?(A+DPTR)
设指令执行前 A=09H,DPTR=2000H,存储器单元内容如图所示。执行指令后,A=?
DPTR=?
12H
2000H
六,位寻址方式指令给出位地址。一位数据在存储器位寻址区。
例,MOV C,40H; Cy?(位地址 40H)
设指令执行前 Cy=1,位地址 40H存储器单元如图,
执行指令后,Cy=?
28H 01100010
29H 11010111
位寻址区
0
2008H 89H
2009H 12H
3-4 MCS-51指令系统分析指令功能分类:
数据传送、数据操作、布尔处理、程序控制。
3-4-1 数据传送指令实现寄存器、存储器之间的数据传送。
一,内部传送指令,片内数据存储器数据传送。
二,外部传送指令,片外数据存储器数据传送。
三,交换指令,片内数据存储器数据传送。
四,堆栈操作指令,片内数据存储器数据传送。
五,查表指令,程序存储器数据传送。
(一 )内部传送指令,实现片内数据存储器中数据传送。
指令格式,MOV 目的 操作数,源 操作数寻址方式,立即寻址、直接寻址、寄存器寻址、寄存器间址。
习题 1,找出配对指令,实现反向传送。
指令机器码:
11101rrr E8~ EF
11100101 n E5 n
1110011i E6,E7
01110100 d 74 d
10101rrr n
1010011i n
85 n1 n2
90 d1 d2
MOV A,Rn ; A←Rn,Rn=R0~ R7
MOV A,n ; A←(n),
MOV A,@Ri ; A←(Ri),Ri=R0,R1
MOV A,#d ; A←d,
MOV Rn,n ; Rn←(n)
MOV @Ri,n ; (Ri)←(n)
MOV n1,n2 ; (n1)←(n2)
MOV DPTR,#d1d2 ; DPTR←d1d2
例 3-4-1,顺序执行下列指令序列,求每一步执行结果 。
MOV A,#30H
MOV 4FH,A
MOV R0,#20H
MOV @R0,4FH
MOV 21H,20H
地址 内容
…
60H 32 H
…
32H 58H
习题 2,用两种寻址方式实现,将片内 RAM 60H单元的数据传送给累加器 A。
解,MOV A,#60H MOV R0,#60H MOV A,@R0; A= 30H; (4FH)= 30H; R0= 20H; (20H)= 30H; (21H)= 30H
,60H
,60H
说明:
只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。
1,一条指令中不能同时出现两个工作寄存器:
非法 指令,MOV R1,R2
MOV R2,@R0
2,间址寄存器只能使用 R0,R1。
非法 指令,MOV A,@R2
3,SFR区只能直接寻址,不能用寄存器间接寻址。
非法 指令,MOV R0,#80H
MOV A,@R0
4,指令表,B,指令字节数,M,机器周期数
(二) 外部传送指令实现片外数据存储器和 A累加器之间的数据传送。
指令格式,MOVX 目的 操作数,源 操作数寻址方式:片外数据存储器用寄存器间址方式。
1,DPTR作 16位数据指针,寻址 64KB片外 RAM空间
MOVX A,@DPTR ; A←(DPTR)
MOVX @DPTR,A ; (DPTR)←A
2,Ri作 8位数据指针,寻址 256B片外 RAM空间
MOVX A,@Ri ; A←(Ri)
MOVX @Ri,A ; (Ri)←A
例 3-4-2:
实现片外数据存储器数据传送 (2000H)?(2100H)。
MOV DPTR,#2000H
MOVX A,@DPTR
MOV DPTR,#2100H
MOVX @DPTR,A
片外 R A M
地址 内容
2000H X
…
D P T R →
2100H
片外 R A M
地址 内容
2000H X
…
D P T R → 2100H X
习题 3,将片外 RAM 0000H单元的数据传送到片内 RAM的
60H单元 。; DPTR= 2000H; A= X; DPTR= 2100H; (2100H)= X
片外数据存储器不能直接寻址。下列为 非法 指令:
MOVX A,2000H
MOVX 2100H,2000H
思考题,为什么对 DPTR的数据传送使用内部传送指令?
(三) 交换指令实现片内 RAM区的数据双向传送。
1,字节交换指令
XCH A,Rn ; A? Rn
XCH A,@Ri; A?(Ri)
XCH A,n ; A?(n)
片内 R A M
地址 内容
2 B H 35H
2 A H 38H
…
20H
习题 4,将片内 RAM60H单元与 61H单元的数据交换 。
例,设 A= 29H,执行指令 XCH A,2AH后,A=?
(2AH)=?
38H
29H
XCH 60H,61H ← 对吗?
29 H
2,半字节交换指令
XCHD A,@Ri ; A0~ 3?(Ri)0~ 3
SWAP A ; A4~ 7?
A0~ 3例 3-4-3,将片内 RAM 2AH和 2BH单元中的
ASCII码转换成压缩式 BCD码存入 20H单元。
压缩式 B C D 码千位 百位十位 个位
A 00000000 00H000010001000000010000101 088085
MOV A,#0R0,#2AH1,BXCHD A,@R0SWAP,1XCH A,20H
00H
片内 R A M
地址 内容
2 B H 35H
2 A H 38H
…
20H85H
R1→
R0→
单字节 B C D
0000 千位
0000 百位
0000 十位
0000 个位习题,交换片内 RAM 40H单元和 41H单元的低半字节。
(四)堆栈操作指令入栈指令,PUSH n ; SP?SP+1,(SP)?(n)
出栈指令,POP n ; (n)?(SP),SP?SP-1
例,设 A=02,B=56H,执行下列指令后,
SP=?,A=?,B=?
片内 R A M
34H
33H
32H
31H
30H
×
×
×
×
SP→ ×
×
×
×
SP→ 02
×
×
×
SP→ 56H
×
×
×
56H
02H
SP→ ×
×
×
→ 56H
02
×
×
×
→
×
×
×
56H
→
×
02H
A
00×
SBR,MOV SP,#30H ;设栈底
PUSH A
PUSH B
MOV A,#0
MOV B,#01
…
POP B
POP A
(五 ) 查表指令实现从程序存储器读取数据到 A累加器,只能使用变址间接寻址方式 。
多用于查常数表程序,可直接求取常数表中的函数值。
1,DPTR为基址寄存器
MOVC A,@A+DPTR ; A?(A+DPTR)
查表范围为 64KB 程序存储器任意空间,称为远程查表指令 。
2,PC为基址寄存器
MOVC A,@A+PC ; A?(A+PC)
常数表只能在查表指令后 256B范围内。
例:查表法求 Y=X2。 设 X(0≤X≤15) 在片内 RAM的 20H单元中,要求将查表求 Y,存入片内 RAM21H单元。
1) ORG 1000H
SQU,MOV DPTR,#TAB ;确定表首地址(基地址)
MOV A,20H ; 取 X( 偏移量
MOVC A,@A+DPTR; 查表求 Y=X2
MOV 21H,A ; 保存 Y
RET ; 子程序结束
… ;其它程序段
ORG 3000H ; 常数表格首地址
TAB,DB 00,01,04,09,…,225 ; 平方表
2) 指令地址 源程序
ORG 1000H ; 程序起始地址
1000H SQU,MOV A,20H ; 取 X
1002H ADD A,#3 ; 修正偏移量
1004H MOVC A,@A+PC ; 查表求 Y=X2
1005H MOV 21H,A ; 存结果
1007H RET ; 子程序结束
1008H TAB,DB 00,01,04 ; 平方表
100BH DB 09,…,225
思考题,当 0≤ X≤255 时,如何用查表法编程求 Y=X2。
例,查表法求 Y=X2。 设 X(0≤X≤15) 在片内 RAM的 20H单元中,要求将查表求 Y,存入片内 RAM21H单元。
习题,找出指令错误并改正:
1,MOV A,#1000H ; A← 1000H
2,MOVX A,1000H ; A←( 1000H)片外 RAM
3,MOVC A,1000H ; A←( 1000H)片外 ROM
4,MOVX 60H,A ; 片外 RAM(60H)←A
5,MOV R0,60H ; 片内 RAM,(61H)←( 60H)
MOV 61H,@R0
6,XCH R1,R2 ; R1←→R 2
7,MOVX DPTR,#2000H; DPTR← 2000H
8,MOVX 60H,@DPTR ; 片内 RAM← 片外 RAM
3-4-2 算术运算指令与数据传送指令不同,多数算术运算指令会影响标志位的状态,即 CPU执行算术运算指令后,根据数据操作情况自动设置标志位的状态。
3-3 状态标志
C y AC F0 RS1 RS0 OV — P
MCS-51 的程序状态字寄存器 PSW 为标志寄存器。
其格式如下:
1,标志位 (自动设置状态 )
1) Cy:进位标志位保存运算后最高位的进位 /借位状态,当有进位 /
借位,Cy=1,否则 Cy=0。
2) AC:辅助进位标志位保存低半字节的进位 /借位状态,当 D3产生进位 /
借位,AC=1,否则 AC=0。 用于十进制调整。
3) OV:溢出标志位
OV=Cy7?Cy6,补码运算产生溢出 OV=1,否则 OV=0。
4) P:奇偶标志位反映累加器 A中数据的奇偶性。当 1的个数为奇数,
P=1,否则 P=0。
2.用户选择位 (编程设置状态 )
1) F0:用户自定义标志位。
2) RS1,RS0:
工作寄存器区选择位。
复位时,PSW=00H
RS1 RS0 工作寄存器
0 0 0区
0 1 1区
1 0 2区
1 1 3区例,复位后,设置使用工作寄存器
2区,其余标志位不变。
解,MOV PSW,#
C y AC F0 RS1 RS0 OV — P
18H
3-4-2 算术运算指令完成片内 RAM 和 A 中数据的加减乘除运算 。
一,加减指令
1.加法指令
0011 1011
+ 0011 1011
0111 0110
76H 0 0 1 1
1)不带进位加法,ADD A,源 操作数
ADD A,R2 ; A←A+R2,影响 Cy,OV,AC,P
例 1,A=3BH,PSW=0,执行指令 ADD A,#3BH
求,A=,Cy=,OV=,AC=,P=,
PSW=?01000001= 41H
C y AC F0 RS1 RS0 OV — P
1001 1010
1110 0011
+ 0
1 0111 1101
2) 带进位加法,ADDC A,源 操作数
ADDC A,R2 ; A←A+R2+Cy,影响 Cy,OV,AC,P
7DH 1 1 0 0
例 2,A= 9AH,R2= E3H,PSW= 0,执行指令
ADDC A,R2 后求:
A=,Cy=,OV=,AC=,P=,
PSW=?10000100 = 84H
C y AC F0 RS1 RS0 OV — P
带进位加法指令 ADDC用于多字节运算例,设双字节数 X 存在片内 RAM 41H,40H单元,Y存在
42H,43H单元,编程求 Z=X+Y,并存入片内 RAM单元
44H,45H,46H。
片内 RAM
地址 内容
46H Z
H
45H Z
M
44H Z
L
43H Y
H
42H Y
L
41H X
H
40H X
L
ADDS,MOV A,40H
ADD A,42H
MOV 44H,A
MOV A,41H
ADDC A,43H
MOV 45H,A
MOV A,#0
ADDC A,#0
MOV 46H,A
RET; 取被加数低字节;加上加数低字节;保存和的低字节;取被加数高字节;加上加数高字节;保存和的高字节;求高字节进位;子程序结束;低字节相加;高字节相加;计算高字节进位;子程序结束十进制加法指令,
ADD A,源操作数
DAA
带进位十进制加法指令,
ADDC A,源操作数
DA A
作业,BCD码加法编程。
设 X,Y为 4位压缩 BCD码,求 Z=X+Y。
BCD调整指令:
DA A ; 对 A 中加法结果进行调整
2.减法指令
SUBB A,源 操作数 ;带借位减法指令
SUBB A,R2 ; A←A -R2-Cy,; 影响 Cy,OV,AC,P
00 0 0 0 0
习题,编程求双字节减法 。 设 X,Y存在片内 RAM 60H
起始单元,计算 Z=X-Y 。
例,A= 5AH,R2= 5AH,Cy= 0,执行下列指令
SUBB A,R2
求,A=,Cy=,OV=,P=,AC=?
3,增量、减量指令
INC 单操作数如,INC R2 ; R2←R2+1
DEC 单操作数如,DEC R2 ; R2←R2 -1
INC DPTR ; DPTR←DPTR+1
不影响标志位状态 。
注意,没有指令 DEC DPTR
可用指令 DEC DPL 代替
4.乘除指令
MUL AB ; BA←A × B,Cy← 0,; 当积高字节 B=0,OV← 0; B≠ 0,则 OV← 1
例,A= 96(60H),B= 192(C0H),执行指令 MUL AB
后,
求,A=,B=,Cy=,OV=,P=?
解,96 × 192 = 18432(4800H)
00H 48H 0 1 0
12H 0CH 0 0 0
例,A= 156(F6H),B= 13(0DH),执行指令 DIV AB
后求,A=,B=,Cy=,OV=,P=?
解,156 ÷ 13 = 18(12H),余数 = 12(0CH)。思考题,如何实现多字节数据的乘除运算 。
DIV AB ; A÷ B,A← 商,B← 余数,Cy←0,; 当除数 B=0,OV←1 ; B≠0,则 OV←0
3-4-2 逻辑运算指令一,单操作数指令 ( A累加器为操作数 )
1,A清 0指令,CLR A ; A← 0
2,A取反指令,CPL A ; A←/A
3,循环移位指令:
1) 8位循环指令:
RL A ; A循环左移一位
RR A ; A循环右移一位
2) 9位循环指令:
RLC A; 带 Cy循环左移一位
RRC A; 带 Cy循环右移一位例 3-4-7,设 A= 11000101,Cy= 0,分别执行下列单条指令,CPL A 求,A=,Cy=
RL A
RLC A
00111010 01 00 1 1
用 9位循环指令实现多字节移位例,编程将寄存器 R6R5 中的双字节数 X左移一位。
CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
0
Cy R6 R5 Cy; Cy=0,设 R6= 55H,R5= AAH; R6=01010101,R5=10101010,Cy=0; R6=01010101,R5=01010100,Cy=1; R6=10101011,R5=01010100,Cy=0
思考题,如何将寄存器 R6R5中的双字节数 X右移一位。
(二 )双操作数逻辑运算指令 (对位逻辑运算 ):
ANL,ORL,XRL
习题 1,如何将累加器 A中的数据高 4位清 0,低位不变?
习题 2,如何将寄存器 R2中的数据奇数位取反,偶数位不变?
例 3-5-8 A=01×××××× B,× 表示随机状态,为 1
或 0,执行下述一组指令执行后 A的值如何?
XRL A,#0C0H ; 将累加器 A的内容 D7,D6取反
ORL A,#03H ; 将累加器 A的内容 D1,D0置 1
ANL A,#0E7H ; 将累加器 A的内容 D4,D3清 0
解,执行上述指令后,A=10× 00× 11B。
3-4-4 布尔变量操作指令对片内 RAM中位寻址区操作。位累加器 Cy和位地址 b。
一,位传送
MOV C,b ; Cy?(b)
MOV b,C ; (b)?Cy
26H 1 0 1 1 0 1 0 1
25H 1 0 0 0 0 1 1 0
24H 0 1 1 1 0 0 0 0
例:将位地址 20H的一位数传送到位地址 30H中:
MOV C,20H
MOV 30H,C
二.位清 0、置 1、取反,CLR,SETB,CPL:
CLR C ; Cy?0,
CLR 40H ; (位地址 40H)? 0
三.逻辑运算,ANL,ORL:
ANL C,40H ; C←C∧(40H)
ANL C,/40H ; C←C∧/(40H)
例:设 Cy=1,(位地址 40H)=1,执行指令
ANL C,/40H 后,
Cy=?,(位地址 40H)=?
位地址表示法,
位地址 40H,位寄存器 F0,字节加位 ACC.0
0
习题,设累加器 A中数据为 29H,Cy=0,执行指令
ORL C,0E3H 后,Cy=?
1
4-4-1 转移指令转移指令通过改写 PC的当前值,从而改变 CPU执行程序的顺序,使程序发生跳转。
按转移条件分类:
1)无条件转移,
执行无条件转移指令,程序无条件转移到指定处 。
2)条件转移,
指令中给出转移条件,执行指令时,先测试条件,
若满足条件,则程序发生转移,否则,仍顺序执行程序 。
按转移方式分类:
1 0 0 0 H S J M P
02
1 0 0 4 H
1)绝对转移,指令给出转移目的的绝对地址 nn,
执行指令后,PC?nn。
2)相对转移,指令给出转移目的与转移指令的相对偏移量 e,执行指令后,PC?PC + e 。
例,地址 源程序
1000H LJMP 2000H
1003H …
…
2000H … ; 转移目的指令例,地址 源程序
1000H SJMP 02
…
1004H … ; 转移目的指令一,无条件转移指令
1.长转移指令:
LJMP nn ; PC? nn
指令机器码,02 nnH nnL
指令转移范围,64KB
2.绝对转移指令:
AJMP pn ; PC?PC+2; PC10~ 0?pn10~ 0; PC15~ 11不变指令机器码,pn10~ 8 00001,pn7~ 0
指令转移范围,2KB
转移时要求转移前后保持 PC15~ 11不变。
相对偏移量 e 的计算式,
e = 目的指令地址 -(转移指令地址 +指令字节数 )
= 目的地址 - PC当前值
3.短转移指令:
SJMP e ; PC?PC+2,PC?PC+e
指令机器码,80H,e
相对偏移量 e为 8位补码。
指令转移范围:前 128~后 127字节编程时,用标号代替转移目的地址,转移指令的操作数交给汇编程序计算。
LJMP NEXT AJMP NEXT SJMP NEXT
…
NEXT:
例 1,计算转移指令的相对偏移量 e,并判断是否超出转移范围。
例 2,求原地踏步指令的指令代码
HERE,SJMP HERE 求出指令代码为,80 FE
H
相对偏移量 = 2150H -(2130H+2)= 001EH,
只取低 8位,e = 1EH 指令机器码,80 1E
H 习题,计算程序中转移指令的相对偏移量 e,并判断是否超出转移范围。
地址 源程序
2130H LOOP,…
…
21B0H SJMP LOOP
指令地址 源程序
2130H SJMP NEXT
…
2150H NEXT,MOV A,R2
4,间接转移指令 (多分支转移指令 )
JMP @A+DPTR,; PC?A+DPTR
指令机器码 73H,指令转移范围 64KB。
KEY,MOV DPTR,#KTAB
MOV A,40H
ADD A,A
JMP @A+DPTR
KTAB,AJMP FUNC0
AJMP FUNC1
…
FUNC0,…
FUNC1,…
应用,处理功能键。
要求不同功能键执行不同程序段。设每个功能键对应一个键值 X(0≤X≤FH) 。
设 X已存入片内 RAM的 40H
单元中。
若 X=0,则执行程序段 FUNC0
若 X=1,则执行程序段 FUNC1
… 。
二.条件转移指令
1,判零转移指令
JZ e ; PC←PC+2,; 若 A=00H,PC←PC+e( 转移 ),;若 A≠00H,PC不变 (不转移 )
条件转移指令形成程序的分支,赋予计算机判断决策能力转移条件,1)标志位的状态 2)位地址中的状态
JNZ e ; PC←PC+2,若 A≠00H,; PC←PC+ e( 转移 );若 A=00H,PC不变 (不转移 )
2.判 Cy转移指令
JC e ; Cy=1则转移,Cy=0不转移
JNC e ; Cy=0则转移,Cy=1不转移
3.判位转移指令
JB b,e ; (b)=1转移,否则不转移
JNB b,e ; (b)=0转移,否则不转移
4,判位清 0转移指令:
JBC b,e ; (b)=1转移,且 (b)?0,否则不转移
5,比较不相等转移指令:
CJNE 操作数 1,操作数 2,e
CJNE A,n,e ; PC←PC+3; 若 A≠(n),则 PC←PC+e;且当 A>(n),Cy=0,当 A<(n),Cy=1;;若 A =(n),PC不变,且 Cy=0。
相当于两个操作数相减,仅影响标志状态,不保存结果
6,循环转移指令:
DJNZ 操作数,e
DJNZ R2,e ; PC←PC+2,R2←R2 -1;若 R2≠0,PC←PC+e,; 若 R2=0,PC不变。
例:用于循环结构程序。设要求程序循环执行 100次
MOV R2,#100 ; 设循环计数器初值
LOOP,… ; 多次循环程序段
DJNZ R2,LOOP ; 循环控制
… ;循环结束习题,当循环计数器初值为 0,循环次数有多少?
4-6-3 子程序调用和返回指令子程序调用和返回指令也使程序发生转移。
一.长调用指令
LCALL nn ; PC?PC+3,; SP?SP+1,(SP)?PCL,SP?SP+1,(SP)?PCH; PC?nn
nn为子程序起始地址,编程时可用标号代替。
指令机器码,12 nnH nnL
指令调用范围,64KB
主程序
…
C A L L S
…
C A L L S
…
子程序 S
…
…
…
R E T
子程序调用过程:
与转移指令不同:转移时,
先用堆栈保存当前地址二.绝对调用指令
ACALL pn ; PC?PC+2; SP?SP+1,(SP)?PCL,SP?SP+1,(SP)?PCH; PC10~ 0?pn10~ 0; PC15~ 11不变
pn为 子程序首地址指令机器码,pn10~ 810001,pn7~ 0
指令调用范围 2KB。
三.子程序返回指令
RET; PCH?(SP),SP?SP-1,PCL?(SP),SP?SP-1
指令机器码,22H
RET指令从堆栈弹出保存的 PC地址,实现子程序返回。
片内 R A M
35H
34H
33H
32H
31H
30H ×
20H
92H
21H
53H
SP→
SP→
SP→
PC
2000H208FH209221002150215322002250225121FFH
程序存储器
2000H M O V S P,#30H
…
20 8FH L C A L L 21 00 H
…
2100H …
…
2150H L C A L L 22 00 H
…
21 FF H R E T
2200H …
…
2250H R E T
MAIN,MOV SP,#30H; 设置栈底
…
LCALL SUB ; 调用子程序
…
SUB,… ; 子程序段
…
RET ; 返回主程序例:子程序嵌套注意,1.子程序起始指令要使用标号,用作子程序名。
2,执行返回指令 RET之前,保证栈顶内容为主程序返回地址,以便正确返回主程序。
常用格式,
MAIN,… ; 主程序
LCALL SUBR ; 调用 SUBR
…
…
SUBR,… ; 子程序首地址
…
RET ; 子程序返回