Article View: comp.robotics
Article #263Re: 68HC11: AS11.EXE generates faulty code
From: Fred G Martin
Date: Sun, 06 Sep 1992 14:44
Date: Sun, 06 Sep 1992 14:44
61 lines
3395 bytes
3395 bytes
In article <30sis-c@massey.ac.nz> G.Moretti@massey.ac.nz writes: >Take a look at the following file. If I remove the ORG $0000 the errors >go away. However this sort of erroneous behaviour in an assembler makes >it unusable, especially when if you put the MSG on a line by itself the >PHASING ERROR message goes away, leaving an apparently error-free assembly. >------------------------------------------------------------------------------ >0001 0100 org $100 >0002 >0003 0100 ce 01 0e ldx #msg <---- Address is wrong >0004 0103 9d 00 jsr led_on >0005 0105 20 04 bra done <---- Should be 20 03 >0006 0107 c3 00 01 addd #1 >0007 010a 7e 01 0a done jmp done >0008 >9| Phasing Error >0009 010d 48 65 6c 6c 6f msg fcc "Hello" >0010 ************************************************ >0011 0000 org $0000 <---- remove this - all ok >0012 >0013 0000 b6 10 03 led_on lda $1003 >0014 0003 8a 80 ora #$80 >0015 0005 b7 10 03 sta $1003 >0016 0008 39 rts >---------------------------------------------------------------------------- Giovanni, The phasing error is due the composition of two things: (1) your code makes forward references to labels; (2) later in the assembly stream, code is generated that resides earlier in the memory of the 6811. Because AS11 makes only two passes on the code, it gets confused. This is a known problem (the phasing error) and is discussed in the documentation for the AS11 assembler (the file ASEMBLER.DOC). Here's what occured for your sample code: In the first pass, the assembler has to figure out how large the arguments are for each instruction so that it can resolve forward label references. The trouble is with the label 'led-on'. In the first pass, the assembler assumes the "JSR led-on" will require three bytes (one byte instruction, two bytes data). But then it discovers (after your ORG $0000 puts 'led-on' in the zero page) that the 'led-on' label can be expressed in one byte. When it goes to fill in the label values, it seems to optimize this value to fit into one byte, generating the error. If you structure your assembly source code so that all code is generated in increasing order of location in the 6811 memory map, AS11 should do fine. The only other 6811 assembler I've used is *not* freeware, but it does deal with this problem by having the capability to make an arbitrary number of passes on the source code until forward references and code placement are resolved. It's named ASM11 and is sold by Dunfield Development Systems, Inc. (phone: 613-256-5820). - Fred Martin
Technical Details
Message-ID:
<1992Sep6.144411.21482@news.media.mit.edu>Path:
arc1-ca.pugleaf.net!sparky!uunet!ogicse!uwm.edu!wupost!micro-heart-of-gold.mit.edu!news.media.mit.edu!fredmReferences:
<30sis-c@massey.ac.nz>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!ogicse!uwm.edu!wupost!micro-heart-of-gold.mit.edu!news.media.mit.edu!fredm From: fredm@media.mit.edu (Fred G Martin) Newsgroups: comp.robotics,comp.sys.m6809 Subject: Re: 68HC11: AS11.EXE generates faulty code Message-ID: <1992Sep6.144411.21482@news.media.mit.edu> Date: 6 Sep 92 14:44:11 GMT Article-I.D.: news.1992Sep6.144411.21482 References: <30sis-c@massey.ac.nz> Sender: news@news.media.mit.edu (USENET News System) Organization: MIT Media Laboratory Lines: 61