Esimerkkiohjelman toimintaa käsiteltiin ohjelmistoa käsittelevässä kappaleessa. Kyseessä ei ole kokonainen ohjelma, vaan vain osa käyttöliittymän koodista: funktio, jota kutsutaan kun käyttöliittymän nappia on painettu.
Tähän kappaleeseen on koottu ohjelman lähdekoodi sekä eri kääntäjillä saadut käännöslistaukset.
/* uistruct.h */
#define NUM_BUTTONS 4
struct ui_sel {
char *mode_name;
int (*update_screen)();
int flags;
struct button {
char *description;
struct ui_sel *(*funct)();
void *arg;
} button[NUM_BUTTONS];
};
extern struct ui_sel *ui_state;
#include "uistruct.h"
ui_select_function(key)
unsigned int key; /* 1..NUM_BUTTONS (1..4) */
{
struct ui_sel *(*f)();
if(--key < NUM_BUTTONS) {
if(f = ui_state->button[key].funct) {
ui_state = (*f)(ui_state, ui_state->button[key].arg);
update_screen();
}
}
}
1 ;;;-----------------------------------------
2 ;;; Start MC6811 gcc assembly output
3 ;;; gcc compiler compiled on TBD
4 ;;; OPTIONS: -mlong_branch !strength_reduce
5 ;;; OPTIONS: peephole !omit_frame_pointer !signed-char
6 ;;; Source: esim.c
7 ;;; Destination: esim.s
8 ;;; Compiled: Sat Mar 9 13:58:52 1996
9 ;;; (META)compiled by GNU C version 2.6.3.
10 ;;;-----------------------------------------
11 .module esim.c
12 ; extern _ui_state
13 ; extern _update_screen
14 .area _CODE
15 .globl _ui_select_function
0000 16 _ui_select_function:
17 ;;;-----------------------------------------
18 ;;; PROLOGUE for ui_select_function
19 ;;;-----------------------------------------
0000 3C 20 pshx ; allocate 2 byte auto variable
0001 3C 21 pshx ; allocate 2 byte auto variable
0002 18 3C 22 pshy ; Save stack frame
0004 18 30 23 tsy ; Set current stack frame
0006 DE 00 24 ldx *ZD5
0008 3C 25 pshx ; pushed register *ZD5
0009 DE 00 26 ldx *ZD6
000B 3C 27 pshx ; pushed register *ZD6
000C DE 00 28 ldx *ZD7
000E 3C 29 pshx ; pushed register *ZD7
000F DE 00 30 ldx *ZD8
0011 3C 31 pshx ; pushed register *ZD8
32 ;;;END PROLOGUE
0012 DC 00 33 ldd *ZD0
0014 18 ED 02 34 std 2,y ; movhi: *ZD0 -> 2,y
0017 18 EC 02 35 ldd 2,y
001A C3 FF FF 36 addd #-1
001D 18 ED 02 37 std 2,y ; addhi3: 2,y by #-1 -> 2,y
0020 18 EC 02 38 ldd 2,y
0023 1A 83 00 03 39 cpd #3 ; cmphi 2,y with #3
0027 23 03 40 bls .+5
0029 7E 00 AE 41 jmp L2 ; (bgtu) long branch
002C FC 00 00 42 ldd _ui_state
002F DD 00 43 std *ZD5 ; movhi: _ui_state -> *ZD5
0031 18 EC 02 44 ldd 2,y
0034 DD 00 45 std *ZD6 ; movhi: 2,y -> *ZD6
0036 DC 00 46 ldd *ZD6
0038 DD 00 47 std *ZD8 ; movhi: *ZD6 -> *ZD8
003A DC 00 48 ldd *ZD8
003C 05 49 asld
003D DD 00 50 std *ZD7 ; ashlhi3: *ZD8 by #1 -> *ZD7
003F DC 00 51 ldd *ZD7
0041 D3 00 52 addd *ZD6
0043 DD 00 53 std *ZD7 ; addhi3: *ZD7 by *ZD6 -> *ZD7
0045 DC 00 54 ldd *ZD7
0047 05 55 asld
0048 DD 00 56 std *ZD6 ; ashlhi3: *ZD7 by #1 -> *ZD6
004A DC 00 57 ldd *ZD5
004C D3 00 58 addd *ZD6
004E DD 00 59 std *ZD5 ; addhi3: *ZD5 by *ZD6 -> *ZD5
0050 DC 00 60 ldd *ZD5
0052 DD 00 61 std *ZD6 ; movhi: *ZD5 -> *ZD6
0054 DE 00 62 ldx *ZD6
0056 EC 08 63 ldd 8,x
0058 DD 00 64 std *ZD5 ; movhi: 8,x -> *ZD5
005A DC 00 65 ldd *ZD5
005C 18 ED 04 66 std 4,y ; movhi: *ZD5 -> 4,y
005F DC 00 67 ldd *ZD5 ; tsthi: R:*ZD5
0061 26 03 68 bne .+5
0063 7E 00 AE 69 jmp L3 ; (beq) long branch
0066 FC 00 00 70 ldd _ui_state
0069 DD 00 71 std *ZD5 ; movhi: _ui_state -> *ZD5
006B 18 EC 02 72 ldd 2,y
006E DD 00 73 std *ZD6 ; movhi: 2,y -> *ZD6
0070 DC 00 74 ldd *ZD6
0072 DD 00 75 std *ZD8 ; movhi: *ZD6 -> *ZD8
0074 DC 00 76 ldd *ZD8
0076 05 77 asld
0077 DD 00 78 std *ZD7 ; ashlhi3: *ZD8 by #1 -> *ZD7
0079 DC 00 79 ldd *ZD7
007B D3 00 80 addd *ZD6
007D DD 00 81 std *ZD7 ; addhi3: *ZD7 by *ZD6 -> *ZD7
007F DC 00 82 ldd *ZD7
0081 05 83 asld
0082 DD 00 84 std *ZD6 ; ashlhi3: *ZD7 by #1 -> *ZD6
0084 DC 00 85 ldd *ZD5
0086 D3 00 86 addd *ZD6
0088 DD 00 87 std *ZD5 ; addhi3: *ZD5 by *ZD6 -> *ZD5
008A DC 00 88 ldd *ZD5
008C DD 00 89 std *ZD6 ; movhi: *ZD5 -> *ZD6
008E DE 00 90 ldx *ZD6
0090 EE 0A 91 ldx 10,x
0092 3C 92 pshx ; movhi: 10,x -> ,--sp
0093 18 EC 04 93 ldd 4,y
0096 DD 00 94 std *ZD5 ; movhi: 4,y -> *ZD5
0098 FC 00 00 95 ldd _ui_state
009B DD 00 96 std *ZD0 ; movhi: _ui_state -> *ZD0
009D DE 00 97 ldx *ZD5
009F AD 00 98 jsr 0,x ; CALL: R:*ZD0 = 0,x (2 bytes)
00A1 38 99 pulx ; addhi3: sp by #2 -> sp
00A2 DC 00 100 ldd *ZD0
00A4 DD 00 101 std *ZD5 ; movhi: *ZD0 -> *ZD5
00A6 DC 00 102 ldd *ZD5
00A8 FD 00 00 103 std _ui_state ; movhi: *ZD5 -> _ui_state
00AB BD 00 00 104 jsr _update_screen ; CALL: R:*ZD0 = _update_screen (0 bytes)
00AE 105 L3:
00AE 106 L2:
00AE 107 L1:
108 ;;;EPILOGUE
00AE 38 109 pulx ; Pulling register *ZD8
00AF DF 00 110 stx *ZD8
00B1 38 111 pulx ; Pulling register *ZD7
00B2 DF 00 112 stx *ZD7
00B4 38 113 pulx ; Pulling register *ZD6
00B5 DF 00 114 stx *ZD6
00B7 38 115 pulx ; Pulling register *ZD5
00B8 DF 00 116 stx *ZD5
00BA 18 38 117 puly ; Restore stack frame
00BC 38 118 pulx ; deallocate 2 byte auto variable
00BD 38 119 pulx ; deallocate 2 byte auto variable
00BE 39 120 rts ; return from function
121 ;;;-----------------------------------------
122 ;;; END EPILOGUE for ui_select_function
123 ;;;-----------------------------------------
124 ; END
ASxxxx Assembler V01.50 (Motorola 6811), page 1.
Symbol Table
0 L1 00AE R
0 L2 00AE R
0 L3 00AE R
ZD0 **** GX
ZD5 **** GX
ZD6 **** GX
ZD7 **** GX
ZD8 **** GX
0 _ui_select_function 0000 GR
_ui_state **** GX
_update_screen **** GX
ASxxxx Assembler V01.50 (Motorola 6811), page 2.
Area Table
0 _CODE size BF flags 0
1 ;;;-----------------------------------------
2 ;;; Start MC6811 gcc assembly output
3 ;;; gcc compiler compiled on TBD
4 ;;; OPTIONS: -mlong_branch optimize !strength_reduce
5 ;;; OPTIONS: peephole !omit_frame_pointer !signed-char
6 ;;; Source: esim.c
7 ;;; Destination: esim.s
8 ;;; Compiled: Sat Mar 9 13:58:50 1996
9 ;;; (META)compiled by GNU C version 2.6.3.
10 ;;;-----------------------------------------
11 .module esim.c
12 ; extern _ui_state
13 ; extern _update_screen
14 .area _CODE
15 .globl _ui_select_function
0000 16 _ui_select_function:
17 ;;;-----------------------------------------
18 ;;; PROLOGUE for ui_select_function
19 ;;;-----------------------------------------
0000 18 3C 20 pshy ; Save stack frame
0002 18 30 21 tsy ; Set current stack frame
0004 DE 00 22 ldx *ZD5
0006 3C 23 pshx ; pushed register *ZD5
0007 DE 00 24 ldx *ZD6
0009 3C 25 pshx ; pushed register *ZD6
000A DE 00 26 ldx *ZD7
000C 3C 27 pshx ; pushed register *ZD7
28 ;;;END PROLOGUE
000D DC 00 29 ldd *ZD0
000F C3 FF FF 30 addd #-1
0012 DD 00 31 std *ZD6 ; addhi3: *ZD0 by #-1 -> *ZD6
0014 DC 00 32 ldd *ZD6
0016 1A 83 00 03 33 cpd #3 ; cmphi *ZD6 with #3
001A 23 03 34 bls .+5
001C 7E 00 5B 35 jmp L2 ; (bgtu) long branch
001F FC 00 00 36 ldd _ui_state
0022 DD 00 37 std *ZD7 ; movhi: _ui_state -> *ZD7
0024 DC 00 38 ldd *ZD6
0026 05 39 asld
0027 DD 00 40 std *ZD5 ; ashlhi3: *ZD6 by #1 -> *ZD5
0029 DC 00 41 ldd *ZD5
002B D3 00 42 addd *ZD6
002D DD 00 43 std *ZD5 ; addhi3: *ZD5 by *ZD6 -> *ZD5
002F DC 00 44 ldd *ZD5
0031 05 45 asld
0032 DD 00 46 std *ZD5 ; ashlhi3: *ZD5 by #1 -> *ZD5
0034 DC 00 47 ldd *ZD7
0036 D3 00 48 addd *ZD5
0038 DD 00 49 std *ZD5 ; addhi3: *ZD7 by *ZD5 -> *ZD5
003A DE 00 50 ldx *ZD5
003C EC 08 51 ldd 8,x
003E DD 00 52 std *ZD6 ; movhi: 8,x -> *ZD6
0040 26 03 53 bne .+5
0042 7E 00 5B 54 jmp L2 ; (beq) long branch
0045 DE 00 55 ldx *ZD5
0047 EE 0A 56 ldx 10,x
0049 3C 57 pshx ; movhi: 10,x -> ,--sp
004A DC 00 58 ldd *ZD7
004C DD 00 59 std *ZD0 ; movhi: *ZD7 -> *ZD0
004E DE 00 60 ldx *ZD6
0050 AD 00 61 jsr 0,x ; CALL: R:*ZD0 = 0,x (2 bytes)
0052 DC 00 62 ldd *ZD0
0054 FD 00 00 63 std _ui_state ; movhi: *ZD0 -> _ui_state
0057 BD 00 00 64 jsr _update_screen ; CALL: R:*ZD0 = _update_screen (0 bytes)
005A 38 65 pulx ; addhi3: sp by #2 -> sp
005B 66 L2:
67 ;;;EPILOGUE
005B 38 68 pulx ; Pulling register *ZD7
005C DF 00 69 stx *ZD7
005E 38 70 pulx ; Pulling register *ZD6
005F DF 00 71 stx *ZD6
0061 38 72 pulx ; Pulling register *ZD5
0062 DF 00 73 stx *ZD5
0064 18 38 74 puly ; Restore stack frame
0066 39 75 rts ; return from function
76 ;;;-----------------------------------------
77 ;;; END EPILOGUE for ui_select_function
78 ;;;-----------------------------------------
79 ; END
ASxxxx Assembler V01.50 (Motorola 6811), page 1.
Symbol Table
0 L2 005B R
ZD0 **** GX
ZD5 **** GX
ZD6 **** GX
ZD7 **** GX
0 _ui_select_function 0000 GR
_ui_state **** GX
_update_screen **** GX
ASxxxx Assembler V01.50 (Motorola 6811), page 2.
Area Table
0 _CODE size 67 flags 0
Koodissa näkyy myös viittauksia rekistereihin, joita ei todellisuudessa ole. Tärkeimmät ovat:
002:"(?)"0: : :;V0.6 (6809/68hc11)
003:"(?)"0: : : .sect $text
004:"(?)"0: : :ui_state .extern $data
005:"(?)"0: : :ui_select_function
007:"(?)"0: : :@2 equ 0d4
009:"(?)"0: : :@1 equ 0d2
010:"(?)"0: : : funct @1
011:"(?)"0:$1:0000 183C3434343434341830: fntmp @2
012:"(?)"0: : :;#9;
013:"(?)"0: : :;;1;
014:"(?)"0: : :;;2;#include "uistruct.h"
015:"(?)"0: : :;;3;
016:"(?)"0: : :;;4;ui_select_function(key)
017:"(?)"0: : :;;5;unsigned int key; /* 1..NUM_BUTTONS
018:"(?)"0: : :;;6;{
019:"(?)"0: : :;;7; struct ui_sel *(*f)();
020:"(?)"0: : :;;8;
021:"(?)"0: : :;;9; if(--key < NUM_BUTTONS) {
022:"(?)"0: : : .expr
023:"(?)"0:$1:000A 18EC0A : lddu 0d0,ap
024:"(?)"0:$1:000D 830001 : decdu
025:"(?)"0:$1:0010 18ED0A : stdu 0d0,ap
026:"(?)"0:$1:0013 1A830004 : cmpdu #0d4
027:"(?)"0: : : .endex
028:"(?)"0:$1:0017 245F : obhs @3
029:"(?)"0: : :;#10;
030:"(?)"0: : :;;10; if(f = ui_state->button[key].fun
031:"(?)"0: : : .expr
032:"(?)"0:$1:0019 18EC0A : lddu 0d0,ap
033:"(?)"0:$1:001C 18ED00 : std 0d0,y
034:"(?)"0:$1:001F CC0006 : ldd #0d6
035:"(?)"0:$1:0022 BD0000 R(23)eE : cll0 D%mul,pcr
036:"(?)"0:$1:0025 18ED02 : std 0d2,y
037:"(?)"0:$1:0028 FE0000 R(29)eE : ldx ui_state,gp
038:"(?)"0:$1:002B CDEF00 : stx 0d0,y
039:"(?)"0:$1:002E 18EC00 : ldd 0d0,y
040:"(?)"0:$1:0031 C30006 : addd #0d6
041:"(?)"0:$1:0034 18E302 : addd 0d2,y
042:"(?)"0:$1:0037 8F : xgdx
043:"(?)"0:$1:0038 EC02 : ldd 0d2,x
044:"(?)"0:$1:003A 18ED04 : std 0d0,bp
045:"(?)"0:$1:003D 1A830000 : cmpd #0d0
046:"(?)"0: : : .endex
047:"(?)"0:$1:0041 2735 : obeq @4
048:"(?)"0: : :;#11;
049:"(?)"0: : :;;11; ui_state = (*f)(ui_state, ui_st
050:"(?)"0: : : .expr
051:"(?)"0:$1:0043 18EC0A : lddu 0d0,ap
052:"(?)"0:$1:0046 18ED00 : std 0d0,y
053:"(?)"0:$1:0049 CC0006 : ldd #0d6
054:"(?)"0:$1:004C BD0000 R(4D)eE : cll0 D%mul,pcr
055:"(?)"0:$1:004F 18ED02 : std 0d2,y
056:"(?)"0:$1:0052 FE0000 R(53)eE : ldx ui_state,gp
057:"(?)"0:$1:0055 CDEF00 : stx 0d0,y
058:"(?)"0:$1:0058 18EC00 : ldd 0d0,y
059:"(?)"0:$1:005B C30006 : addd #0d6
060:"(?)"0:$1:005E 18E302 : addd 0d2,y
061:"(?)"0:$1:0061 8F : xgdx
062:"(?)"0:$1:0062 EE04 : ldx 0d4,x
063:"(?)"0:$1:0064 3C : pshx
064:"(?)"0:$1:0065 FE0000 R(66)eE : ldx ui_state,gp
065:"(?)"0:$1:0068 3C : pshx
066:"(?)"0:$1:0069 CDEE04 : ldx 0d0,bp
067:"(?)"0:$1:006C AD00 : callf 0d0,x
068:"(?)"0:$1:006E 31 : ins
069:"(?)"0:$1:006F 31 : ins
070:"(?)"0:$1:0070 31 : ins
071:"(?)"0:$1:0071 31 : ins
072:"(?)"0:$1:0072 FD0000 R(73)eE : std ui_state,gp
073:"(?)"0: : : .endex
074:"(?)"0: : :;#12;
075:"(?)"0: : :;;12; update_screen();
076:"(?)"0: : : .expr
077:"(?)"0:$1:0075 BD0000 R(76)eE : callf update_screen,pcr
078:"(?)"0: : : .endex
079:"(?)"0: : :@4 .tmplbl
080:"(?)"0: : :@3 .tmplbl
081:"(?)"0:$1:0078 18353131313131311838: endfn
082:"(?)"0: : :;;13; }
083:"(?)"0: : :;;14; }
084:"(?)"0: : :;;15;}
[versio 1.2, 1996/03/10 20:08:32] [Lähetä palautetta Laurille]