51汇编:我没CALL它也执行了,我郁闷
小菜以前用的C开发的,最近想学习一下汇编可是今天才编写了一个小的程序就出问题了。ORG 0000H
JMP main
main:
MEM_CLR:
mov r0,#0x7f
L1:clr A
mov @r0,a
djnz r0,L1
RET
END
程序调试的时候发现MEM_CLR居然执行了! 我没CALL怎么就执行了,我记得我原来学习汇编的时候没有遇到这种情况,是不是一时没回过神,不晓得哪里出错了。郁闷! main接下來就是MEM_CLR,就执行了MEM_CLR 回复【2楼】tony_sgt
-----------------------------------------------------------------------
我觉得我原来写过类似的不是这样的,是不是把函数放到main的前面或者加一个循环! main中要有jmp main 我在网上看到过其他的程序好像就是和我的这个框架差不多。我感觉这个ret就失去作用了,函数的应该是先入栈再出栈,这个就是顺序执行了,感觉编译器没有检查ret的存在,偶觉得应该检查ret的存在然后放在一个flash位置中,只有call才调用,这样我不是很想的通! 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了!郁闷了! 菜鸟学习汇编就是想更深的研究下单片机的内部运行原理,TNND第一个例子就被搞晕了。 汇编里面,16进制不是用0X表示的。你那样弄,就乱套了。 另外你main里面没有程序当然顺序执行了。
这就是先学C,后学汇编的严重后果。 应该这样:
ORG 0000H
JMP MAIN
MAIN:
SJMP $
MEM_CLR:
MOV R0,#7fH
L1:
CLR A
MOV @R0,A
DJNZ R0,L1
RET
END 回复【10楼】gongnn 魔法师
-----------------------------------------------------------------------
问下为什么程序call mem_clr ret还是到main
程序并没有执行下面的,我就不是很清楚了,我原来都没遇到这样的情况,现在毛病还变多了。 在线求解中,汇编有意思就是问题多啊! 回复【11楼】rookies
回复【10楼】gongnn 魔法师
-----------------------------------------------------------------------
问下为什么程序call mem_clr ret还是到main
程序并没有执行下面的,我就不是很清楚了,我原来都没遇到这样的情况,现在毛病还变多了。
-----------------------------------------------------------------------
这两个现在地址相同啊。没看见你main里面有程序啊。 回复【13楼】gongnn 魔法师
-----------------------------------------------------------------------
程序没有执行loop那个循环!这个就不是很清楚了,我现在明白了为什么我的程序会出现这种状况,我把堆栈的数据也清空了。函数的入口地址和保存的下一条指令的PC的存储值都清空了,程序就死了,我现在才明白,TNND我说我原来没遇到过。这程序很有意思! 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是硬件堆栈,汇编真的可移植性很差(容易被其他经验干扰)我暂时是这么想的。 这段程序当然会回到MAIN,你也太猛了,在MEM_CLR中,把内存全部清了零,栈的内容全是零了,RET后不回到MAIN才怪呢。 回复【15楼】rookies
-----------------------------------------------------------------------
程序也不能这样写的。记住一点,汇编与C最大的区别就是汇编全部得由编程人来管理处分存贮器,包括内存,程序存贮等。对51来说,第一条语句,一定得是JMP,否则,下面的中断地址就完了(第一个就是中断0003)。还有,在你新的程序以及前面错误的程序中,MAIN前一定要有ORG 0060,也就是说,至少不能让你的主程序占用中断地址空间,如果不加,编释器会顺序编下去,同样占到中断地址。 回复【16楼】BDXing6
-----------------------------------------------------------------------
我也觉得我太有才了,居然写出这么怪的程序,才开始研究汇编,后面的说不定惊喜更多!哈哈谢谢大家的回答了! 回复【17楼】BDXing6
-----------------------------------------------------------------------
原来上课的时候了解过就是没有实际用汇编开发过项目,一直用C,现在把好多东西都忘了! 汇编与C最大的区别就是汇编全部得由编程人来管理处分存贮器,包括内存,程序存贮等。
正在学汇编 看了原来的帖子,发现自己居然犯了如此幼稚的错误。
rookies 发表于 2012-7-27 09:12 static/image/common/back.gif
看了原来的帖子,发现自己居然犯了如此幼稚的错误。
其实和C差不多啊,LZ不错,继续Happy 我就是在稍长点的程序中不会分配内存所以投奔c的
页:
[1]