单片机题目,有耐心的人进。会多少说多少。。。。集思广益!!

来源:百度知道 编辑:UC知道 时间:2024/05/30 22:43:22
ORG 200H
MOV SP,#40H
MOV A,#30H
LCALL 250H
ADD A,#10H
MOV B,A
L1:SJMP L1
ORG 250H
MOV DPTR,#20AH
PUSH DPL
PUSH DPH
RET
执行程序后SP=?,A=?,B=?
说说每条指令的作用。

51的指令是从0000H开始执行的,所以在前面加上
ORG 0000H
LJMP 200H
在最后加上
END
仿真运行才能正常通过
运行后为:
SP = 42H
A = 30H
B = 50H
下面解释每天指令的含义
ORG 200H
MOV SP,#40H ;将堆栈指针知道40H处,在ROM空间的地址为200H
MOV A,#30H ;ROM地址为203H
LCALL 250H ;调用子程序,ROM地址:205H
ADD A,#10H ;这条指令压根,ROM地址:208H
MOV B,A ;将ACC的内容复制到累加器B;这个时侯A = 30H,ROM地址:20AH
L1:SJMP L1 ;ROM地址:20CH

ORG 250H
MOV DPTR,#20AH
PUSH DPL
PUSH DPH
RET
最后这四条指令这儿一起说,先将20AH放到DPTR中,然后再低位高位一次压入堆栈中,执行一条RET指令,关键就是执行的RET指令,它的功能就是将堆栈中的最高的两个字节放入程序指针里面,相当于两条POP指令,先出高位到PC的高位,再出低位到PC的低位,这样就按照我们的意愿改变了PC的值,这招一般用在子程序和中断返回中,可以通过这招返回到我们指定的地址,而不是像最初那样返回到自程序调用或中断的地方,这招以前还用汇编写程序时想到的,嘿嘿,现在都用C语言来写程序了,你也最好向C语言方面过渡,对将来的发展更好

ORG 200H (程序从200H开始执行)
MOV SP,#40H (堆栈指针指向40H)
MOV A,#30H (30H送入累加器)
LCALL 250H (调用从250H开始的子程序)
ADD A,#10H (A+10H A中为40H)
MOV B,A (B中为40H)
L1:SJMP L1 (无条件跳转在此 即等待)
ORG 250H (子程