程序如下:
ORG 0000H
LJMP START
ORG 0003H
LJMP EXT0
ORG TIM0
START: MOV SP,#70H
MOV TMOD,#00000001B
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
MOV IE,#10000011B
MOV IP,#00000001B
MOV R5,#100
MOV R1,#0FEH
JMP $
TIM0: PUSH ACC
PUSH PSW
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
DJNZ R3,LOOP
MOV R3,#100
MOV A,R1
MOV P2,A
RL A
MOV R1,A
LOOP: POP PSW
POP ACC
RETI
EXT0: PUSH ACC
PUSH PSW
MOV A,#00
MOV R2,#10
LOOP3: MOV P2,A
CALL DELAY
CPL A
DJNZ R2,LOOP3
POP PSW
POP ACC
RETI
DELAY: MOV R5,#20
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
报警如下:
Build target 'Target 1'
assembling AAAA.asm...
AAAA.asm(7): error A42: PHASE ERROR (PASS-2)
Target not created
关于这个设置堆栈数值为啥会错,求大神解答下,应该是对的啊,
此帖出自
小平头技术问答
这么简单的问题
ORG是Origin的缩写:起始地址,源。在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。例如:
ORG 2000H
START:MOV AX,#00H
汇编语言源程序中若没有ORG伪指令,则程序执行时,指令代码被放到自由内存空间的CS:0处;若有ORG伪指令,编译器则把其后的指令代码放到ORG伪指令指定的偏移地址。两个ORG伪指令之间,除了指令代码,若有自由空间,则用0填充。
预处理-->编译-->汇编-->链接,这是高级语言的编译全过程。对于纯汇编,就只有汇编和链接两个步骤。
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位置。这是链接器的工作。 至于x86 dos和win32 exe,ORG的实现就复杂了,ORG不再是绝对定位,只能在一个段里相对定位。
这个是别人说的
对于初学者,你就记着,ORG后面跟的是地址,不是标号!
一周热门 更多>