|
Technical Support Support Resources Product Information | GENERAL: LOCATING IMPROPER FIXUP INSTRUCTIONSInformation in this article applies to: - C166 All Versions
- C251 All Versions
- C51 All Versions
SYMPTOMSAfter making changes to a program or after adding in-line assembly improper fixup errors are generated by the linker. For example:
*** ERROR L121: IMPROPER FIXUP
MODULE: NO_SP.obj (NO_SPEED1)
SEGMENT: ?PR?MAIN?NO_SPEED1
OFFSET: 0099H
CAUSEA fixup error is generated when it is impossible to generate an instruction address that reaches an operand. This is frequently the case with instructions that implement relative jumps or branches. Typically, improper fixups are caused by in-line assembly code that attempts to access an address that is too far away. The error message listed above was generated by a program that included in-line assembly. You can easily find the assembler instruction that contains an improper fixup using the information provided by the error message. In the case of the error listed above... - MODULE: refers to an object file created by the compiler or assembler. You will need the listing file for this module to locate the offending instruction. For C source files, use the CODE directive to include assembler instructions in the listing file. If you used in-line assembly, use the list file created by the assembler. In µVision2, listing file options are available in Project - Options - Listing.
- SEGMENT: provides the name of the segment where the fixup error exists. The segment name usually refers to a function. You should note, however, that constants may also create improper fixups. In this example, the segment ?PR?MAIN?NO_SPEED1 contains the assembler instructions of the function main which may be found in the C listing file. Search in the ASSEMBLY LISTING OF GENERATED CODE section of the listing file for the segment name. A line similar to RSEG ?PR?main?NO_SPEED1 denotes the beginning of the segment with the fixup error.
- OFFSET: refers to an instruction offset within the segment. The listing file includes the offset along with the instruction for each segment so you should be able to use this information to locate the instruction with the fixup error. In this example the listing file near offset 0099H appears as follows:
0096 782D 609 MOV R0,#10 ; delay factor 10
0098 D800 F 610 DJNZ R0,0 ; count down delay
009A 7E08 611 MOV R6,#8
The problem is with the DJNZ instruction at offset 0099H. In this case, the DJNZ is attempting to jump to address 0000h but fails because relative jumps can only reach locations that are within a +/- 128 byte range. Upon examination of the code at the point of the fixup error, it is aparent that a jump to 0000h was not intended. Instead a simple delay loop should be generated and the DJNZ instruction should jump to itself. This can be accomplished by changing the DJNZ instruction in the in-line assembly to DJNZ R0,$. After making this change, the assembler correctly inserts a jump to the DJNZ instruction and the linker no longer generates the fixup error.
SEE ALSOFORUM THREADSThe following Discussion Forum threads may provide information related to this topic. Last Reviewed: Thursday, January 10, 2002
|
|