[Coco] Linville's ramblings on assembly vs machine code
L. Curtis Boyle
curtisboyle at sasktel.net
Mon Jul 10 18:05:58 EDT 2017
It should be mentioned that the order of the stack registers is VERY important in OS-9, system all the system calls use SWI (which pushes all registers), and the calls themselves get parameters passed to them by the registers on the stack, each with a specific purpose/function.
L. Curtis Boyle
curtisboyle at sasktel.net
TRS-80 Color Computer Games website
http://www.lcurtisboyle.com/nitros9/coco_game_list.html
> On Jul 10, 2017, at 3:34 PM, Robert Gault <robert.gault at att.net> wrote:
>
> Dave Philipsen wrote:
>> <snip>
>> I was talking with someone once about pushing and pulling registers to/from the stack on the 6809.
>> He had a concern about how one particular disassembler represented the order in which a list of
>> registers would be pushed or pulled. From the point of view of someone who worked purely with
>> assembly mnemonics and never even bothered to look at the machine codes that had been assembled,
>> this might be a valid question. Does it matter how you order the registers when you push or pull
>> them? (i.e. is pshs a,b,x,y different than pshs y,x,b,a ?)
>> If when you learned assembler you at least got a taste of how it relates to machine code you would
>> know right away that it matters not because each of the registers to be pushed or pulled is
>> represented by a single bit in a post code byte that follows the opcode. The processor will always
>> push or pull the registers in the same order regardless of how you write it in assembler. So to
>> answer the question: no, pshs a,b,x,y is not any different than pshs y,x,b,a.
>>
>> <snip>
>
> Well, here is at least one exception that proves the rule. :)
>
> It makes a very big difference what order the stacking process takes place! You can easily find examples in the Coco code where a stack has been pushed and depending on the following code, the contents of the stack was changed and then eventually pulled.
> If you don't know where a particular register was placed on the stack, then you won't know where that value is located so it can be changed.
>
> One example of this issue occurs when you replace a 6809 with a 6309 and try to work in native mode. The NMI routine in DOS1.1 is
> DNMISV LDA NMIFLAG
> BEQ LD7BB
> LDX DNMIVC
> STX 10,S
> CLR NMIFLG
> LD7BB RTI
>
> The above works with a 6809 or a 6309 in emulation mode. With a 6309 in native mode, the code needs to be
> STX 12,S
> as the stacking is changed.
>
> Robert
>
>
>
> --
> Coco mailing list
> Coco at maltedmedia.com
> https://pairlist5.pair.net/mailman/listinfo/coco
>
More information about the Coco
mailing list