搜索
bottom↓
回复: 23

51汇编:我没CALL它也执行了,我郁闷

[复制链接]

出0入0汤圆

发表于 2012-3-4 14:57:43 | 显示全部楼层 |阅读模式
小菜以前用的C开发的,最近想学习一下汇编可是今天才编写了一个小的程序就出问题了。
ORG 0000H
JMP main
main:


MEM_CLR:
   mov r0,#0x7f
L1:clr A
   mov @r0,a
   djnz r0,L1
RET
END
程序调试的时候发现MEM_CLR居然执行了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-3-4 14:59:13 | 显示全部楼层
我没CALL怎么就执行了,我记得我原来学习汇编的时候没有遇到这种情况,是不是一时没回过神,不晓得哪里出错了。郁闷!

出0入0汤圆

发表于 2012-3-4 15:06:10 | 显示全部楼层
main接下來就是MEM_CLR,就执行了MEM_CLR

出0入0汤圆

 楼主| 发表于 2012-3-4 15:09:56 | 显示全部楼层
回复【2楼】tony_sgt
-----------------------------------------------------------------------
我觉得我原来写过类似的不是这样的,是不是把函数放到main的前面或者加一个循环!

出0入0汤圆

发表于 2012-3-4 15:09:58 | 显示全部楼层
main中要有jmp main

出0入0汤圆

 楼主| 发表于 2012-3-4 15:12:47 | 显示全部楼层
我在网上看到过其他的程序好像就是和我的这个框架差不多。我感觉这个ret就失去作用了,函数的应该是先入栈再出栈,这个就是顺序执行了,感觉编译器没有检查ret的存在,偶觉得应该检查ret的存在然后放在一个flash位置中,只有call才调用,这样我不是很想的通!

出0入0汤圆

 楼主| 发表于 2012-3-4 15:32:41 | 显示全部楼层
ORG 0000H
JMP main
main:
call MEM_CLR
loop:
mov P1,#0x00
call DELAY
mov P1,#0xff
call DELAY
jmp loop

MEM_CLR:
   mov r0,#0x7f
   clr A
L1:mov @r0,a
   djnz r0,L1
ret

DELAY:
        mov r7,#255
L:mov r6,#255
    djnz r6,$
        djnz r7,L
ret
END
这段代码也死了,是不是我的keil没有破_解的原因,ret直接就jmp到main了!郁闷了!

出0入0汤圆

 楼主| 发表于 2012-3-4 15:35:30 | 显示全部楼层
菜鸟学习汇编就是想更深的研究下单片机的内部运行原理,TNND第一个例子就被搞晕了。

出0入0汤圆

发表于 2012-3-4 15:52:14 | 显示全部楼层
汇编里面,16进制不是用0X表示的。你那样弄,就乱套了。

出0入0汤圆

发表于 2012-3-4 15:56:39 | 显示全部楼层
另外你main里面没有程序当然顺序执行了。


这就是先学C,后学汇编的严重后果。

出0入0汤圆

发表于 2012-3-4 16:00:50 | 显示全部楼层
应该这样:

ORG 0000H
JMP MAIN
MAIN:

SJMP $

MEM_CLR:
   MOV R0,#7fH
L1:
   CLR A
   MOV @R0,A
   DJNZ R0,L1  
RET
END

出0入0汤圆

 楼主| 发表于 2012-3-4 16:12:24 | 显示全部楼层
回复【10楼】gongnn 魔法师
-----------------------------------------------------------------------

问下为什么程序call mem_clr ret还是到main
程序并没有执行下面的,我就不是很清楚了,我原来都没遇到这样的情况,现在毛病还变多了。

出0入0汤圆

 楼主| 发表于 2012-3-4 16:24:56 | 显示全部楼层
在线求解中,汇编有意思就是问题多啊!

出0入0汤圆

发表于 2012-3-4 16:57:35 | 显示全部楼层
回复【11楼】rookies
回复【10楼】gongnn 魔法师
-----------------------------------------------------------------------
问下为什么程序call mem_clr ret还是到main
程序并没有执行下面的,我就不是很清楚了,我原来都没遇到这样的情况,现在毛病还变多了。
-----------------------------------------------------------------------

这两个现在地址相同啊。没看见你main里面有程序啊。

出0入0汤圆

 楼主| 发表于 2012-3-4 17:07:50 | 显示全部楼层
回复【13楼】gongnn 魔法师
-----------------------------------------------------------------------

程序没有执行loop那个循环!这个就不是很清楚了,我现在明白了为什么我的程序会出现这种状况,我把堆栈的数据也清空了。函数的入口地址和保存的下一条指令的PC的存储值都清空了,程序就死了,我现在才明白,TNND我说我原来没遇到过。这程序很有意思!

出0入0汤圆

 楼主| 发表于 2012-3-4 17:11:14 | 显示全部楼层
ORG 0000H
mov r0,#0x7f
clr A
L:mov @r0,A
djnz r0,L

JMP main
main:
mov sp,#0x40
mov A,#0x01
loop:
mov P1,A
RL         A
call delay
ljmp loop

delay:
    mov r5,#5
L2: mov r7,#255
L1: mov r6,#255
        djnz r6,$
        djnz r7,L1
        djnz r5,L2
ret

END
正确的代码在这,先初始化RAM但是不能在住程序中干,一干就完蛋,他不想PIC是硬件堆栈,汇编真的可移植性很差(容易被其他经验干扰)我暂时是这么想的。

出0入0汤圆

发表于 2012-3-4 17:11:18 | 显示全部楼层
这段程序当然会回到MAIN,你也太猛了,在MEM_CLR中,把内存全部清了零,栈的内容全是零了,RET后不回到MAIN才怪呢。

出0入0汤圆

发表于 2012-3-4 17:22:29 | 显示全部楼层
回复【15楼】rookies
-----------------------------------------------------------------------

程序也不能这样写的。记住一点,汇编与C最大的区别就是汇编全部得由编程人来管理处分存贮器,包括内存,程序存贮等。对51来说,第一条语句,一定得是JMP,否则,下面的中断地址就完了(第一个就是中断0003)。还有,在你新的程序以及前面错误的程序中,MAIN前一定要有ORG 0060,也就是说,至少不能让你的主程序占用中断地址空间,如果不加,编释器会顺序编下去,同样占到中断地址。

出0入0汤圆

 楼主| 发表于 2012-3-4 17:35:02 | 显示全部楼层
回复【16楼】BDXing6
-----------------------------------------------------------------------

我也觉得我太有才了,居然写出这么怪的程序,才开始研究汇编,后面的说不定惊喜更多!哈哈谢谢大家的回答了!

出0入0汤圆

 楼主| 发表于 2012-3-4 17:36:10 | 显示全部楼层
回复【17楼】BDXing6
-----------------------------------------------------------------------

原来上课的时候了解过就是没有实际用汇编开发过项目,一直用C,现在把好多东西都忘了!

出0入0汤圆

发表于 2012-3-4 18:32:43 | 显示全部楼层
汇编与C最大的区别就是汇编全部得由编程人来管理处分存贮器,包括内存,程序存贮等。
正在学汇编

出0入0汤圆

 楼主| 发表于 2012-7-27 09:12:56 | 显示全部楼层
看了原来的帖子,发现自己居然犯了如此幼稚的错误。

出0入0汤圆

发表于 2012-7-27 17:44:32 | 显示全部楼层
rookies 发表于 2012-7-27 09:12
看了原来的帖子,发现自己居然犯了如此幼稚的错误。

其实和C差不多啊,LZ不错,继续Happy

出0入0汤圆

发表于 2012-7-27 18:39:21 | 显示全部楼层
我就是在稍长点的程序中不会分配内存所以投奔c的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 16:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表