SH-2 GNU as bug/feature, and a question


Staff member
After having written some SH-2 code, I tried to assemble it with GNU as (specifically, sh-coff-as and sh-elf-as). It gave me the error message

Error: misaligned offset

on many lines. As it turns out, these were all instructions that use indirect register addressing with displacement, such as

mov.l @(3, r15), r1

The problem lies in the interpretation of the displacement value. According to the SH1/2 programming manual I have, the format of the instruction is (hope this comes out right)

MOV.L @(disp,Rm),Rn 0101nnnnmmmmdddd (disp x 4 + Rm) -> Rn

however, gas implements this as

MOV.L @(disp,Rm),Rn 0101nnnnmmmmdddd (disp + Rm) -> Rn

So in order to get my code to assemble, I had to multiply all the displacements by four; my suspicions were confirmed when gas managed to stick a 20 into four bits without complaining (though I later verified that it was correct with a hex editor :)).

Playing with disassemblers to see what the prevailing opinion was didn't help either: sh2d disassembled these to the gas syntax (for compatibility with gas maybe?), while shdis disassembled them to the syntax described in the manual. Is this a bug in gas, or a gas "feature"? Do I just have to put up with doing it the "wrong" way, or is there a good freeware SuperH assembler out there that uses the syntax described in the manual?
I'd prefer to not do that if I can help it. The assembler would have to be at the very least real (i.e. not crippled) shareware; if I ever release this code, I'd like for people to be able to assemble it without having to "find" a particular commercial assembler. Right now, that means dealing with gas's weirdness I guess... I suppose I should ask about it on the gas ML , maybe there's a few features I don't know about :).
Just out of curiousity, what are you coding in asm?

As for assemblers for SuperH? Unfortunately the only 2 I know of are gas and snasm. I always believed that gas is extraordinarily crappy, seeing how it likes to use weird-ass mangled (IMO) syntax... why can't they go with Hitachi's spec? It's probably a holdover from the differences of AT&T and Intel x86 asm. (#### that Unix-born crap!) Just a thought.

Of course, snasm has that problem of being commercial, and I think it only does coff format objects anyway....

I'll look around for you and if I find anything good I'll let you know.
I think it's more likely that its strange syntax is due to weirdness in GCC's code generation; the primary purpose of gas is to assemble the output of gcc, so it wouldn't suprise me if they tweaked the syntax a bit to make it faster or easier to generate somehow. Did I mention that the register names are case-sensitive, and that gas requires them to be lowercase (all references to them in the manual are uppercase IIRC)? Strange beast :p... maybe I could borrow some code from cpp or something and write my own, though that might be a bit of a hassle.