单片机问题,求高手详解!

1.设(SP)=07H,(PC)=2100H,则执行LCALL,0221H之后,08H单元的内容为( )

2.十进制数一29的8位二进制补码表示为____0E3H______。
(请问以下解法错在哪里)

1、答案:00H,LCALL调用把地址0221H放到堆栈中,先低后高,所以08H是00H,PC也会变化,这里就不说了
2、十进制变成二进制不能一位对应四位,那个是十六进制变成2进制的方法。。。。追问

我是菜鸟呀,第一题还是没有搞懂哟、、、、请不吝赐教!
(第二个题搞懂了,多谢阁下一语道破!!)

追答

先看下LCALL的描述:
LCALL addr16

长调用,这条指令无条件调用位于16位地址addr16的子程序。它把PC加3以获得下一条指令的地址并将其压入堆栈(先低位字节后高位字节),同时每压栈一字节SP加1.然后把指令的第二和第三字节(A15~A8,A7~A0)分别装入PC的高位和低位字节中,接着从PC所指出的地址开始执行程序。

这里用了两个东西PC和堆栈。
PC用来放地址的,就是说下次程序要运行哪条指令,先把地址放进去,你这里没涉及到,描述都在上面,稍微复杂点。
然后呢是堆栈,LCALL是调用命令,相当于C语言的函数调用,调用后函数完了要返回,返回到程序原来运行的那个地方,这样的话,程序必须知道是什么地方,所以呢,运行子程序前先把原来的地方,也就是地址存起来。就是存到堆栈里了,这也就是压栈。返回时叫出栈。
而地址呢,程序运行哪里就先把那的地址放到PC里,题目中原来是2100H,然后要调用了,调用后Pc地址就要变了,所以先把2100H存起来,存到堆栈里,先存低位,也就是00H放到地址的08H,然后21H放到09H里,存的时候堆栈地址先加1,所以从08H开始存。。。

应该明白了吧?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-02
错误就在别人要的是2进制,你却用16进制,29的8位二进制码为0001 1101 。8 4 2 1 码。这样算出来才是对的
相似回答