单片机汇编语言RET没有和ACALL配套使用时返回到哪里?
当X>0时,Y=1,当X=0时,Y=0,当X<0时,Y=-1,编写程序如下:XEQU30HYEQU31HSIN:MOVA,XJZSIN1JBACC.7,SIN2MOVY,...
当X>0时,Y=1,当X=0时,Y=0,当X<0时,Y=-1,编写程序如下:
X EQU 30H
Y EQU 31H
SIN: MOV A,X
JZ SIN1
JB ACC.7,SIN2
MOV Y,#1
RET
SIN1:MOV Y,#0
RET
SIN2:MOV Y,#0FFH
RET
单片机书里面有很多这种没有acall只有RET的程序,难道全部是子程序,等待被调用的吗?!真的很不懂,求高手解答,万分感谢啦 展开
X EQU 30H
Y EQU 31H
SIN: MOV A,X
JZ SIN1
JB ACC.7,SIN2
MOV Y,#1
RET
SIN1:MOV Y,#0
RET
SIN2:MOV Y,#0FFH
RET
单片机书里面有很多这种没有acall只有RET的程序,难道全部是子程序,等待被调用的吗?!真的很不懂,求高手解答,万分感谢啦 展开
4个回答
展开全部
如不是在调用后RET了那就只会回到你堆栈最上高二地址(栈)中所指的地址上去了,你可这试试,先用二个压栈指令POP压二个数后(低位先压)再RET,这会程序就会转到你压的这个数的地方运行起走。一般书上的例程绝大多数是以子程序方式表示的,所以是只等你调用的。
展开全部
这是一个完整的子程序。
学过分支结构吗?这里就是,相当于把前两个ret换成sjmp 最后一行,但是sjmp的机器码比ret长,所以直接写个ret了事。
调用时,肯定是acall sin,然后到分支处,可以不跳,可以跳sin1,可以跳sin2,总之选一个,然后运行到最近的ret处就返回了,其它的ret对这次调用来说,等于是废代码。
实际上,对这个程序来说,除非跑飞,否则不使用acall,是不可能运行到3个ret中的任何一个的,使用acall sin,则会运行到3个中的1个,然后就退出子程序了。至于sin1与sin2写法上与sin相同,但是sin是函数入口,sin1与sin2是跳转分支入口,而非函数入口。
学过分支结构吗?这里就是,相当于把前两个ret换成sjmp 最后一行,但是sjmp的机器码比ret长,所以直接写个ret了事。
调用时,肯定是acall sin,然后到分支处,可以不跳,可以跳sin1,可以跳sin2,总之选一个,然后运行到最近的ret处就返回了,其它的ret对这次调用来说,等于是废代码。
实际上,对这个程序来说,除非跑飞,否则不使用acall,是不可能运行到3个ret中的任何一个的,使用acall sin,则会运行到3个中的1个,然后就退出子程序了。至于sin1与sin2写法上与sin相同,但是sin是函数入口,sin1与sin2是跳转分支入口,而非函数入口。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
单片机中很多子程序为了简洁,可以有很多的RET返回语句的,这跟C语言一样,一个函数或子程序也可以有多个RETURN一样,你这段程序也可以只有一个RET,这样的话就需要用SJMP或LJMP转移到程序返回处,效果一样,但程序看起来就不那么清晰明了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
取决于栈指针所指向的内容。
就你贴出的这段程序而言,鬼才知道会飞到哪里去……
就你贴出的这段程序而言,鬼才知道会飞到哪里去……
追问
单片技术里面有很多这种只有RET没有ACALL 的程序,难道全部都是需要被调用子程序?!
追答
没CALL的话就要自己手动压栈。
你需要好好看看书,了解一下RET语句到底干了些什么。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
更多回答(2)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询