JMP @A+DPTR
0111 0011 ; (A)+(DPTR)→(PC)
这条指令的转移地址由数据指针DPTR中的16位数据和累加器A中的8位无符号数相加形成,并将结果直接送入PC,不改变累加器和数据指针内容,也不影响标志。利用这条指令可以实现程序的散转。
例3-4.如果累加器A中存放待处理命令编号(0~7),程序存储器中存放着首址标号为TAB的转移指令表,则执行下面的程序,将根据A中命令编号转向相应的命令处理程序。
EX1:
MOV R1,A RL A ADD A,R1
; ; ;(A)×3
;转移表首址→DPTR
MOV DPTR,#TAB JMP @A+DPTR
TAB:
LJMP PROG0 LJMP PROG1 LJMP PROG2 LJMP PROG3 LJMP PROG4 LJMP PROG5 LJMP PROG6 LJMP PROG7
;跳转到((A)+(DPTR))间址单元 ;转向命令0处理入口 ;转向命令1处理入口 ;转向命令2处理入口 ;转向命令3处理入口 ;转向命令4处理入口 ;转向命令5处理入口 ;转向命令6处理入口 ;转向命令7处理入口
2. 调用子程序指令(LCALL、ACALL、RET)
在程序设计中,常常把具有一定功能的公用程序段编制成子程序。当主程序转至子程序时用调用指令,而在子程序的最后安排一条返回指令,使执行完子程序后再返回主程序。为保证正确返回,每次调用子程序时自动将下条指令地址保存到堆栈,返回时按先进后出的原则再把地址弹出至PC中。
31
(1)绝对调用指令
汇编指令格式 机器码格式 操 作
a10a9a8 1 0001 ACALL addr11 ; (PC)+2→(PC) a7~a0 (SP)+1→(SP) (PC7~0)→((SP)) (SP)+1→(SP) (PC15~8)→((SP)) Addr11→PC10~0 PC15~11不变
这条指令无条件地调用位于指令所指出地址的程序。指令执行时PC加2,获得下条指令的地址,并把这16位地址压入堆栈,栈指针加2。然后把指令中的a10~a0值送入PC中的PC10
~
0
位,PC的P15~P11不变,获得子程序的起始地址(即
PC15PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0)转向执行子程序。所用的子程序的起始地址必须与ACALL后面一条指令的第一个字节在同一个2KB区域的存储器区内。指令的操作码与被调用的子程序的起始地址的页号有关。见表3-1。
例如:设(SP)=60H,标号地址HERE为1234H,子程序SUB的入口地址为1345H,执行指令:
HERE: ACALL SUB
结果:(SP)=62H,堆栈区内(61H)=36H,(62H)=12H,(PC)=1345H。 指令的机器码为71H,45H。
(2)长调用指令
汇编指令格式 机器码格式 操 作
0001 0010 LCALL addr16 ; (PC)+3→(PC)
a15~a8
32
a7~ a0 (SP)+1→(SP)
(PC7~0)→((SP)) (SP)+1→(SP) (PC15~8)→((SP))
addr16→(PC)
LCALL addr16是一条三字节指令,它提供16位目标地址,以调用64KB范围内所指定的子程序。执行这条指令时先把PC内容加3以获得下一条指令的首地址,并将该地址作为返回地址压入堆栈(先压入低位地址PC7~0,后压入高位地址PC15~8),然后将指令中的16位目的地址addr16送入程序计数器PC,从而使程序去执行被调用的子程序。指令执行后不影响任何标志。
例如:设(SP)=2FH,标号BEGIN的地址为1000H,标号FUNC的地址为2300H,执行指令: BEGIN: LCALL FUNC
结果:(SP)=31H,(30H)=03H,(31H)=10H,(PC)=2300H。
(3)返回指令
1)子程序返回指令
汇编指令格式 机器码格式 操 作
0010 0010 RET ; ((SP))→(PC15~8)
(SP)-1→(SP) ((SP))→(PC7~0) (SP)-1→(SP)
RET是子程序返回指令,RET指令通常安排在子程序的末尾。当程序执行到本指令时表示子程序执行结束,使程序能从子程序返回到主程序,继续下面指令的执行。因此,它的主要功能是把栈顶相邻两个单元的内容(断点地址)弹出送到PC,SP的内容减去2,程序返回到PC值所指的指令处执行。
例如:设(SP)=62H,(62H)=07H,(61H)=30H,执行指令:RET
33
结果:(SP)=60H,(PC)=0730H,CPU从0730H开始执行程序。
2)、中断返回指令
汇编指令格式 机器码格式 操 作
0011 0010 RETI ; ((SP))→(PC15~8)
(SP)-1→(SP) ((SP))→(PC7~0) (SP)-1→(SP)
这条指令的功能与RET指令相类似,但不能用RET指令来替代。通常安排在中断服务程序的最后。它的应用在中断节中讨论。
3. 条件转移指令
条件转移指令是根据某种特定条件发生转移的指令。条件满足时转移(相当于一条相对转移指令),条件不满足时则顺序执行下面的指令。目的地址在下一条指令的起始地址为中心的256个字节范围中(-128B~127B)。当条件满足时,先把PC加到指向下一条指令的第一个字节地址,再把相对目的地址的偏移量加到PC上,计算出转向地址。
(1)判零转移指令
汇编指令格式 机器码格式 操 作
0110 0000 JZ rel ; 相对地址(rel) (PC)+2→(PC)
若(A)=0,则(PC)=(PC)+rel; 若(A)≠0,则顺序执行程序。
0111 0000 JNZ rel ; (PC)+2→(PC)
相对地址( rel ) 若(A)≠0,则(PC)=(PC)+rel; 若(A)=0,则顺序执行程序。
34
(2)比较不相等转移指令
汇编指令格式 机器码格式 操 作
1011 0101 CJNE A,direct,rel ; (PC)+3→(PC)
direct 若(A)>(direct),则(PC)+rel→(PC),
且0→CY;
上述两条指令的功能是: JZ rel JNZ rel
; 如果累加器ACC的内容为零,则执行转移。
; 如果累加器ACC的内容不为零,则执行转移。
相对地址(rel) 若(A)<(direct),则(PC)+rel→(PC),
且1→CY;
若(A)=(direct),则程序顺序执行,
且0→CY。
1011 0100 CJNE A,#data,rel ; (PC)+3→PC
data 若(A)>data,则(PC)+rel→(PC),
且0→CY;
相对地址(rel) 若(A) 且1→CY; 若(A)= data,则程序顺序执行, 且0→CY。 1011 1rrr CJNE Rn,#data,rel ; (PC)+3→(PC) data rel) 相对地址(若(Rn)>data,则(PC)+rel→(PC), 35 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库单片机指令系统(7)在线全文阅读。
相关推荐: