新手,问个小白问题~ 关于伪指令ORG的
学单片机,不会理解ORG,逛了好多版面都没有确切的答案,然后就点开了发烧友,还是这里好啊~~
org 00h
jmp start
org 03h
jmp ext0 这里边start是主程序标号,ext0是中断子程序标号,我知道org是伪指令,用于决定程序起始地址,但是如果那个起始地址已经被前边的程序用到了,后边的程序还是会覆盖它么? 还有啊这四行代码,后边两行怎么被执行的啊,按照汇编语言的顺序,在jmp处就已经跳到后面的主程序了,那第三行org还怎么起作用呢? 麻烦诸位大神不吝赐教,小弟谢谢啦~ 嘿嘿~~
前面的问题没看懂 ,我就回答那个关于后org 03h 是被执行的问题。org 03h是外部中断0的中断服务地址,如果外部中断0被触发程序的pc指针就会指到org 03h ,不要问为什么 这是汇编的规定 。到03h这后依然顺序执行 通过jmp ext0跳到存放中断服务程序的地方。这样0rg 03h被执行了,如果没有中断触发那么这个org 03h 就永远不会被执行
哦,也就是说触发外部中断int0之后程序会自动跳到地址为03h的位置运行喽? 我不知道我理解的对不对。
还有啊,我理解是单片机的ram分成数据储存与程序储存,程序储存写入的就是我编辑的程序,数据储存则是各种寄存器,那个org表示的就是程序从程序储存器哪一个地址开始写入,org 00h就是从程序储存的00h位置开始写入,那第一个问题就出现了,如果主程序比较长,一直向下写覆盖了03h这个位置,那后边中断子程序在写入的时候,是不是就得覆盖03h这个位置啊,那之前写入的程序怎么办? ,嘿嘿,小白,可能理解有问题,望指正,谢谢啦~~
还有啊,org 00h这个指令,就是说程序以00h为开头写入程序储存器,那么00h这个位置多长时间写满啊,写满之后跳到01h么。
唔,我看见了,书上有‘中断源的入口地址’,是说中断被触发就从那个地址读入程序么。
问题比较多,嘿嘿,谢谢啦~~
额,还有个问题,org 03h这个命令,不是定义的从03h位置开始写入下边程序么,那么下边程序是 jmp ext0,也就是说只要程序执行到03h这个位置,就要执行对应的指令jmp ext0了呗~~
这个理解的没问题
第一句理解没问题,00h这个地址能存8位的二进制数,00h后对应的就是01h以此类推,程序寄存器里面中断源入口地址是固定的属于保留地址 这个你最好不要再里面写入程序指令,写程序保持良好的习惯这很有好处的,如果说你写的程序过大装不下的话,可以外接存储设备来保存程序指令,你说的那个可能就不能让它发生。下面是一个用了中断的程序你看看 ,这个程序是很久前写的没验证过 ,不过你可以看看
ORG 0000H
LJMP ST0
ORG 0003H
LJMP PIT0
ORG 0030H
ST0:MOV P1,#0FFH
SETB EA
SETB EX0
SETB IT0
WAIT:AJMP WAIT
PIT0:MOV A,P1
SWAP A
MOV P1,A
RETI
END
嘿嘿,不好意思中断优先级我还没看到那儿呢,马上下一个就是多个中断了,我还是理解中断优先再看你的回复吧,不过实在谢谢了啊,嘿嘿~~~
不过的话,也就是在我没有指明的条件下,主程序从程序储存00h处开始写入,会自动跳过那些有特殊意义的地址喽(比如说中断对应那五个入口地址),继续在下一个内存单元写入。然后如果要使用中断,就在那些特殊意义地址放上一条无条件跳转指令,跳到其它地址?
还有啊,我从书上看到五个中断源中断处理程序入口是以相互相隔八个内存单元的方式排列在一起的,那这些入口之间的内存单元,系统会默认写入吗,应该会吧。
另外书上说如果中断处理程序比较小可以安排在相隔的八个单元之间,那我写主程序的时候是不是还要声明跳过这些单元啊,如果使用顺序最靠后的那个中断源,是不是即便中断子程序长也不用跳转了,直接一路写下去就行,主程序可以把这段中断子程序夹在中间,后面那段主程序用个org指令错开子程序所在的内存单元?
另外还有个问题(不好意思哈,小白问题有点多,再次谢谢你啦~~ ) 在汇编语言中,是每条指令占一个程序内存单元吗,还有如果没有开中断,那么中断源的入口地址还会被系统刻意留下吗? 再次拜谢,嘿嘿~~
我又看了一下上边的程序,org 03h jmp ext0 也就是说在要读入03h的时候才回启动中断子程序,那么就是说在没有触发中断的情况下主程序不会读入位于03h处的程序喽? 03h被跳过了,那与下一个中断源入口地址之间的七个内存单元呢? 会被写入吧,那如果我不想用跳转指令,想直接顺着03h一路向下写程序,主程序在写到02h的内存位置时候,是不是需要一个org指令,跳开下面的04h(03h中断源入口被保留),05h... 1ah,直接到1ch 呢? ~~
谢谢谢谢谢谢谢谢谢~~~~~~~~~~~~~~~~~~~
这个你用keil软件的调试功能一下就可以看清楚了,通过反汇编的图可以看出
1:伪指令不会被编译,伪指令就是汇编程序能够识别的汇编指令,而不是单片机的执行指令
2:当你没用伪指令标示中断入口时,程序会根据内存空间的指针依次写入执行指令,不会特意保留。这一点可以从两张图对比中看出来。
你的这些问题通过调试可以很直观地得到答案 ,如果不会调试的话 你先找些资料学习一下用keil软件调试程序
哦哦,我想我明白一开始那个问题了,org 00h jmp start org 03h jmp ext0 相当于直接在01h位置写入jmp start ,在03h位置写入jmp ext0 下边的程序继续沿着03h按顺序向下写入ram,当读取内存程序的时候,单片机先读jmp start ,之后调至start继续向下读,02h被跳过,当中断被触发的时候单片机跳至03h,执行jmp ext0,跳至中断子程序,不知道我这么理解对不对? 实在是太感谢啦~~
非常正确
嘿嘿,不胜感激实在是不胜感激,那个... 您qq多少啊,以后有不会的,我直接小纸条好么...
新手学汇编实在是问题多多,以后麻烦大神啦,嘿嘿~~
再次鞠躬,说一声谢谢~~
我也是新手 有问题可以相互学习
我扣扣770564536 也在学习单片机 求交流