code segment:
... EXTRN NUMBER (MAX_NUM) DS MAX_NUM END
another code segment:
PUBLIC MAX_NUM MAX_NUM EQU 8
when i assembled and linked these codes, there was an error:
Build target 'test' assembling test.asm... test.asm(13): error A28: ABSOLUTE EXPRESSION REQUIRED Target not created
How did it hanppen?
The error message is telling you that an absolute expression is required.
You did not say on which file the error was reported, but I would think it is from the:
DS MAX_NUM
The expression you gave results in a relocatable value and not an absolute value; hence the error.
Why not put the EQU into an include file and include that into your test.asm module?
yu zhou,
I have some suggestions for you.
www.catb.org/.../smart-questions.html How To Ask Questions The Smart Way Eric Steven Raymond
Before You Ask www.catb.org/.../smart-questions.html
When You Ask www.catb.org/.../smart-questions.html
[Chinese] www.beiww.com/.../smart-questions.html æé—®çš„æ™ºæ…§ Eric Steven Raymond ç¿»è¯':王刚 <yafrank at 126 dot com >
æé—®å‰ www.beiww.com/.../smart-questions.html
æé—®æ—¶ www.beiww.com/.../smart-questions.html
I put the MAX_NUM EQU 8 into the first file,not use the PUBLIC and EXTRN keywords to export and import the symbol! just like:
MAX_NUM EQU 8 ... DS MAX_NUM ...
and then assembled and linked it,no errors! Why???
Why?
Didn't you read the answers you got?
"Look in the assembler manual what EQU means - it declares an assembly-time constant, not a run-time variable. The linker on the other hand processes run-time variables."
PUBLIC and EXTRN are used for link-time symbols, not for assembly-time symbols. But your MAX_NUM is not a program variable that will be stored in any memory cell, and so will not be assigned any address by the linker.
This is the same as programming in C:
#define MAX_NUM 8
or
enum { MAX_NUM 8 };
as compared to:
int MAX_NUM = 8;
Only the "int MAX_NUM" alternative will be a link-time symbol, where generated code reads from the memory to pick up the value.
View all questions in Keil forum