C-kielinen esimerkkiohjelma


[edellinen sivu] [seuraava sivu] [sisällysluetteloon] [etusivulle]

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.

Lähdekoodi

uistruct.h

/* 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;

esim.c


#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();
		}
	}
}

Kääntäjä = GCC, ei optimointia

Gcc:n tuottama koodi ei täysin seuraa Motorolan assember-standardia. Sen kääntämisen käytetään gcc-loppupään mukana tulevaa assembleria.
                              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

Kääntäjä = GCC, optimointi

                              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

Kääntäjä = 5+c, ei optimointia

Tämän kääntäjän tuottama assembler-koodin ulkoasu ei vastaa Motorolan standardia. Koodi sisältää pseudokäskyjä ja osoitusmuotoja, jotka tukevat C:n kääntämistä erilaisissa tilanteissa. Mm. "o"-kirjan hyppykäskyn edessä tarkoittaa optimoitavaa hyppyä. Käskystä tuotetaan lyhyt ehdollinen hyppy (2 tavua) mikäli mahdollista, muuten lyhyt ehdollinen hyppy pitkän ehdottoman yli (yhteensä 5 tavua, 2 käskyä).

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;}


[edellinen sivu] [seuraava sivu] [sisällysluetteloon] [etusivulle]

[versio 1.2, 1996/03/10 20:08:32] [Lähetä palautetta Laurille]

Copyright © 1996 Lauri Aarnio. All Rights Reserved.