This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

help

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?

Parents
  • PUBLIC and EXTRN are still for runtime variables, i.e variables that have an address.

    EQU is for assembly-time variables that does not have an address.

    You can include the file with the EQU into multiple assembler files.

    For runtime variables, you have one source file that allocates the space for the variable. This file should export the information about the variable with PUBLIC. You may then have multiple source files that makes use of the variable - they should contain a EXTRN declaration to tell the assembler that there somewhere externally exists a variable with a specific name.

Reply
  • PUBLIC and EXTRN are still for runtime variables, i.e variables that have an address.

    EQU is for assembly-time variables that does not have an address.

    You can include the file with the EQU into multiple assembler files.

    For runtime variables, you have one source file that allocates the space for the variable. This file should export the information about the variable with PUBLIC. You may then have multiple source files that makes use of the variable - they should contain a EXTRN declaration to tell the assembler that there somewhere externally exists a variable with a specific name.

Children
  • I can't understand you,aren't both PUBLIC and EXTRN
    work in assembly time?

  • They work in assembly, but for runtime variables - variables that gets a memory address. The linker must be able to know how to get a reference from one source code module to be able to use a variable that exists in another module.

    But this is separate from assembly-time numeric constants used by the assembler. EQU does not produce a runtime variable. There will be no memory allocated in the RAM of the microcontroller for an EQU symbol. And since it is an assembly time constant without a memory address, there will be no need/use for any EXTRN/PUBLIC to inform the linker about the constant. Without a memory address to share between multiple source modules, the linker don't need to know.

    But all this is introductory stuff, and as I have already mentioned, the same concept exists for C also. Get a good introductory book about assembly programming.