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]