c语言 单片机 非常简单 求指教!!!!!

ORG 0000H
AJMP START
ORG 0030H // 这个是做什么的?上面AJMP START:后不就隔过去了??????
MOV R2,#10
MOV R3,#0
MOV DPTR,#TAB
NEXT:MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
INC R3
ACALL DELAY
DJNZ R2,NEXT
AJMP START
DELAY:
MOV R7,#0FH
L1:MOV R6,#0FH
L2:MOV R5,#0FFH
DJNZ R5,$ // $什么意思?????
DJNZ R6,L2
DJNZ R7,L1
RET // ret 做什么的???
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END

org指令时链接时使用的,不是汇编那一步使用的。即不是cpu的一条指令,而是给编译器看的伪指令。
在51单片机、x86 dos、win32 exe中实现都有差异。
以最简单的51单片机为例,编译器最终链接生成HEX文件,再烧录到51的rom中去。单片机很简单,没有x86的分段、分页,启动就是从rom的0x0的位置开始执行。同时0x30H位置开始存放中断向量,
所以单片机程序一般开头就是
ORG 0000H
AJMP MAIN
ORG 0030H

这里的ORG 0000H指令,使得程序链接成HEX文件时,AJMP MAIN这条指令的机器码就在HEX文件的0x0位置。这是链接器的工作。

-------------------------------------------------------------------------------------------------------

关于伪指令$,它表示地址计数器的当前值,也就是本条指令第一个字节的地址偏移,如:
ORG $ + 8 表示起始地址定位于当前编译地址第一字节的后8个字节处;JMP $ 表示无条件转移至当前地址,其实际执行效果为永远停留在当前地址。
又如:Array DW 1, 2, $ + 4, 3, 4, $ + 4,可以用图表示为:

| …… |
| 01h | <--- Array 1
| 00h |
| 02h | 2
| 00h |
| 08h | $ + 4 ($相对于Array首地址的偏移是4,因此$ + 4 = 8h)
| 00h |
| 03h | 3
| 00h |
| 04h | 4
| 00h |
| 0eh | $ + 4 ($相对于Array首地址的偏移是10,因此$ + 4 = 0eh)
| 00h |
| … … |

可见,$用在不同的地方,其表示的当前地址计数是不同的。

-----------------------------------------------------------------------------------------------

ret 就是返回的意思
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-23
第一个:其作用是告诉汇编程序,在开始执行的时候,将某段机器语言装载到内存中的哪个地址。目的是越过单片机的特殊功能寄存器,楼主在ORG 0030H后应该少了一个 START: ORG 0030H表示START程序段从地址0030H开始

第二个:DJNZ为非零跳转,既R5不是0时 ,跳转到$位置的程序段,$在此处表示本语句跳转,也就是当R5不为零时,一直执行 DJNZ R5,$

第三个:表示返回,函数结束的意思,在此为DELAY函数段返回。另:reti表示中断返回本回答被网友采纳
第2个回答  2013-06-23
找本书慢慢来看吧 看的出你有些心态急躁
相似回答