📄 utilities.lst
字号:
##############################################################################
# #
# 12/Oct/2006 10:58:07 #
# IAR Atmel AVR C/C++ Compiler V4.20A/W32, KickStart Version #
# Copyright 1996-2006 IAR Systems. All rights reserved. #
# #
# Source file = D:\IAR Systems\Embedded Workbench 4.0 #
# KickStart\avr\tutor\Utilities.c #
# Command line = "D:\IAR Systems\Embedded Workbench 4.0 #
# KickStart\avr\tutor\Utilities.c" -v0 -mt -o #
# "F:\zln\AVR与PROTEUS\IAR AVR应用程序\Debug\Obj\" -lCN #
# "F:\zln\AVR与PROTEUS\IAR AVR应用程序\Debug\List\" #
# --initializers_in_flash -z2 --no_cse --no_inline #
# --no_code_motion --no_cross_call --no_clustering #
# --no_tbaa --debug -e -I "D:\IAR Systems\Embedded #
# Workbench 4.0 KickStart\avr\INC\" -I "D:\IAR #
# Systems\Embedded Workbench 4.0 KickStart\avr\INC\CLIB\" #
# List file = F:\zln\AVR与PROTEUS\IAR AVR应用程序\Debug\List\Utilitie #
# s.lst #
# Object file = F:\zln\AVR与PROTEUS\IAR AVR应用程序\Debug\Obj\Utilities #
# .r90 #
# #
# #
##############################################################################
D:\IAR Systems\Embedded Workbench 4.0 KickStart\avr\tutor\Utilities.c
1 /**************************************************
2 *
3 * IAR EMBEDDED WORKBENCH TUTORIAL
4 * Utility file
5 *
6 * Copyright 1996 - 2003 IAR Systems. All rights reserved.
7 *
8 * $Revision: 1.3 $
9 *
10 **************************************************/
11
12 #include <stdio.h>
13 #include "Utilities.h"
14
15
\ In segment TINY_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: TINY_Z>`
16 unsigned int root[MAX_FIB];
\ root:
\ 00000000 DS 20
17
18 /*
19 Initialize MAX_FIB Fibonacci numbers.
20 */
\ In segment CODE, align 2, keep-with-next
21 void init_fib( void )
\ init_fib:
22 {
\ 00000000 .... RCALL ?PROLOGUE4_L09
23 short i = 45;
24 root[0] = root[1] = 1;
\ 00000002 E001 LDI R16, 1
\ 00000004 E010 LDI R17, 0
\ 00000006 .... LDI R30, root
\ 00000008 8302 STD Z+2, R16
\ 0000000A 8313 STD Z+3, R17
\ 0000000C .... LDI R30, root
\ 0000000E 8300 ST Z, R16
\ 00000010 8311 STD Z+1, R17
25
26 for ( i=2 ; i<MAX_FIB ; i++)
\ 00000012 E082 LDI R24, 2
\ 00000014 E090 LDI R25, 0
\ ??init_fib_0:
\ 00000016 308A CPI R24, 10
\ 00000018 E000 LDI R16, 0
\ 0000001A 0790 CPC R25, R16
\ 0000001C F4A4 BRGE ??init_fib_1
27 root[i] = get_fib(i) + get_fib(i-1);
\ 0000001E 2F08 MOV R16, R24
\ 00000020 2F19 MOV R17, R25
\ 00000022 .... RCALL get_fib
\ 00000024 2FA0 MOV R26, R16
\ 00000026 2FB1 MOV R27, R17
\ 00000028 2F08 MOV R16, R24
\ 0000002A 2F19 MOV R17, R25
\ 0000002C 5001 SUBI R16, 1
\ 0000002E 4010 SBCI R17, 0
\ 00000030 .... RCALL get_fib
\ 00000032 0F0A ADD R16, R26
\ 00000034 1F1B ADC R17, R27
\ 00000036 2F28 MOV R18, R24
\ 00000038 0F22 LSL R18
\ 0000003A 2FE2 MOV R30, R18
\ 0000003C .... SUBI R30, (-(root) & 0xFF)
\ 0000003E 8300 ST Z, R16
\ 00000040 8311 STD Z+1, R17
\ 00000042 9601 ADIW R25:R24, 1
\ 00000044 CFE8 RJMP ??init_fib_0
28 }
\ ??init_fib_1:
\ 00000046 E0E4 LDI R30, 4
\ 00000048 .... RJMP ?EPILOGUE_B4_L09
29
30 /*
31 Return the Fibonacci number 'nr'.
32 */
\ In segment CODE, align 2, keep-with-next
33 unsigned int get_fib( int nr )
\ get_fib:
34 {
\ 00000000 2F20 MOV R18, R16
\ 00000002 2F31 MOV R19, R17
35 if ( nr>0 && nr<=MAX_FIB )
\ 00000004 3021 CPI R18, 1
\ 00000006 E000 LDI R16, 0
\ 00000008 0730 CPC R19, R16
\ 0000000A F05C BRLT ??get_fib_0
\ 0000000C 302B CPI R18, 11
\ 0000000E E000 LDI R16, 0
\ 00000010 0730 CPC R19, R16
\ 00000012 F43C BRGE ??get_fib_0
36 return ( root[nr-1] );
\ 00000014 2F02 MOV R16, R18
\ 00000016 0F00 LSL R16
\ 00000018 2FE0 MOV R30, R16
\ 0000001A .... SUBI R30, LOW((-(root - 2) & 0xFF))
\ 0000001C 8100 LD R16, Z
\ 0000001E 8111 LDD R17, Z+1
\ 00000020 9508 RET
37 else
38 return ( 0 );
\ ??get_fib_0:
\ 00000022 E000 LDI R16, 0
\ 00000024 E010 LDI R17, 0
\ 00000026 9508 RET
39 }
40
41 /*
42 Puts a number between 0 and 65536 to stdout.
43 */
\ In segment CODE, align 2, keep-with-next
44 void put_fib( unsigned int out )
\ put_fib:
45 {
\ 00000000 .... RCALL ?PROLOGUE6_L09
\ 00000002 REQUIRE ?Register_R4_is_cg_reg
\ 00000002 REQUIRE ?Register_R5_is_cg_reg
\ 00000002 2FA0 MOV R26, R16
\ 00000004 2FB1 MOV R27, R17
46 unsigned int dec = 10, temp;
\ 00000006 E08A LDI R24, 10
\ 00000008 E090 LDI R25, 0
47
48 if ( out >= 10000 )
\ 0000000A 31A0 CPI R26, 16
\ 0000000C E207 LDI R16, 39
\ 0000000E 07B0 CPC R27, R16
\ 00000010 F020 BRCS ??put_fib_0
49 {
50 putchar ( '#' );/* To large value. */
\ 00000012 E203 LDI R16, 35
\ 00000014 E010 LDI R17, 0
\ 00000016 .... RCALL putchar
51 return; /* Print a '#'. */
\ 00000018 C032 RJMP ??put_fib_1
52 }
53
54 putchar ( '\n' );
\ ??put_fib_0:
\ 0000001A E00A LDI R16, 10
\ 0000001C E010 LDI R17, 0
\ 0000001E .... RCALL putchar
55 while ( dec <= out )
\ ??put_fib_2:
\ 00000020 17A8 CP R26, R24
\ 00000022 07B9 CPC R27, R25
\ 00000024 F040 BRCS ??put_fib_3
56 dec *= 10;
\ 00000026 2F48 MOV R20, R24
\ 00000028 2F59 MOV R21, R25
\ 0000002A E00A LDI R16, 10
\ 0000002C E010 LDI R17, 0
\ 0000002E .... RCALL ?S_MUL_L02
\ 00000030 2F80 MOV R24, R16
\ 00000032 2F91 MOV R25, R17
\ 00000034 CFF5 RJMP ??put_fib_2
57
58 while ( (dec/=10) >= 10 )
\ ??put_fib_3:
\ 00000036 2F08 MOV R16, R24
\ 00000038 2F19 MOV R17, R25
\ 0000003A E04A LDI R20, 10
\ 0000003C E050 LDI R21, 0
\ 0000003E .... RCALL ?US_DIVMOD_L02
\ 00000040 2F80 MOV R24, R16
\ 00000042 2F91 MOV R25, R17
\ 00000044 300A CPI R16, 10
\ 00000046 E020 LDI R18, 0
\ 00000048 0712 CPC R17, R18
\ 0000004A F0A0 BRCS ??put_fib_4
59 {
60 temp = out/dec;
\ 0000004C 2F0A MOV R16, R26
\ 0000004E 2F1B MOV R17, R27
\ 00000050 2F48 MOV R20, R24
\ 00000052 2F59 MOV R21, R25
\ 00000054 .... RCALL ?US_DIVMOD_L02
\ 00000056 2E40 MOV R4, R16
\ 00000058 2E51 MOV R5, R17
61 putchar ( '0' + temp );
\ 0000005A 2D04 MOV R16, R4
\ 0000005C 2D15 MOV R17, R5
\ 0000005E 5D00 SUBI R16, 208
\ 00000060 4F1F SBCI R17, 255
\ 00000062 .... RCALL putchar
62 out -= temp*dec;
\ 00000064 2D44 MOV R20, R4
\ 00000066 2D55 MOV R21, R5
\ 00000068 2F08 MOV R16, R24
\ 0000006A 2F19 MOV R17, R25
\ 0000006C .... RCALL ?S_MUL_L02
\ 0000006E 1BA0 SUB R26, R16
\ 00000070 0BB1 SBC R27, R17
\ 00000072 CFE1 RJMP ??put_fib_3
63 }
64
65 putchar ( '0' + out );
\ ??put_fib_4:
\ 00000074 2F0A MOV R16, R26
\ 00000076 2F1B MOV R17, R27
\ 00000078 5D00 SUBI R16, 208
\ 0000007A 4F1F SBCI R17, 255
\ 0000007C .... RCALL putchar
66 }
\ ??put_fib_1:
\ 0000007E E0E6 LDI R30, 6
\ 00000080 .... RJMP ?EPILOGUE_B6_L09
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
get_fib 0 2
init_fib 4 2
-> get_fib 4 2
-> get_fib 4 2
put_fib 6 4
-> putchar 6 2
-> putchar 6 2
-> putchar 6 2
-> putchar 6 2
Segment part sizes:
Function/Label Bytes
-------------- -----
root 20
init_fib 74
get_fib 40
put_fib 130
Others 4
244 bytes in segment CODE
4 bytes in segment INITTAB
20 bytes in segment TINY_Z
244 bytes of CODE memory (+ 4 bytes shared)
20 bytes of DATA memory
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -