AVR (09.02.2007 19:15, просмотров: 1) ответил д__ на Я не обязан доказывать бредовость твоих идей, уж лучше ты докажи что ты прав с конкретным количеством тактов затраченных на операцию
Дружок, грязью я тебя пока еще не полил, и оскорбить не попытался. А вот в умственных способностях действительно приходится усомниться - уж извини за горькую правду Тебе же было предложено самостоятельно скомпилировать твой и мой код и, заглянув в профилировщик, убедиться в том, что твой (с делениями) исполняется за время в десятки раз большее, чем мой (без делений), не так ли? Вместо этого ты требуешь доказательств - значит, почему-то не способен сделать это самостоятельно, что отнюдь не делает чести твоим умственным способностям. А "площадное хамство и хулиганские манеры поведения в общественных местах" тебе, позволь узнать, в чем привиделись - только, пожалуйста, с конкретными фактами на руках и не тряся бубном, взывая к профкому, парткому и месткому. Ждем-с.
И для охолонутия вот тебе мои факты супротив твоего пиздобольства:
Мой исходник:
<c>
char asc[5];
void main(void)
{
unsigned int temp,val=59999;
char binc,atemp;
atemp='0'; temp=10000; while(val >= temp) {atemp++; val-=temp;};*(asc+0)=atemp;
atemp='0'; temp=1000; while(val >= temp) {atemp++; val-=temp;};*(asc+1)=atemp;
atemp='0'; temp=100; while(val >= temp) {atemp++; val-=temp;};*(asc+2)=atemp;
atemp='0'; binc=(char)val; while(binc >= 10) {atemp++; binc-=10;};*(asc+3)=atemp;
binc+='0';*(asc+4)=binc;
}
</c>
Листинг компилятора:
<asm>
;CodeVisionAVR C Compiler V1.24.5 Standard
;(C) Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
;http://www.hpinfotech.com
;e-mail:office@hpinfotech.com
;Chip type : ATmega16
;Program type : Application
;Clock frequency : 4.000000 MHz
;Memory model : Tiny
;Optimize for : Speed
;(s)printf features : int
;(s)scanf features : int, width
;External SRAM size : 0
;Data Stack size : 40 byte(s)
;Heap size : 0 byte(s)
;Promote char to int : No
;char is unsigned : Yes
;8 bit enums : Yes
;Word align FLASH struct: No
;Enhanced core instructions : On
;Automatic register allocation : On
;Use AVR Studio 3 Terminal I/O : No
.DSEG
.ORG 0x88
; 1 char asc[5];
_asc:
000088 .BYTE 0x5
; 2
; 3 void main(void)
; 4 {
.CSEG
_main:
; 5 unsigned int temp,val=59999;
; 6 char binc,atemp;
; 7
; 8 atemp='0'; temp=10000; while(val >= temp) {atemp++; val-=temp;};*(asc+0)=atemp;
; temp -> R16,R17
; val -> R18,R19
; binc -> R20
; atemp -> R21
000033 e52f LDI R18,95
000034 ee3a LDI R19,234
000035 e350 LDI R21,LOW(48)
000036 e100 LDI R0x10,LOW(0x2710)
000037 e217 LDI R0x11,HIGH(0x2710)
_0x3:
000038 1720 CP R0x12,R0x10
000039 0731 CPC R0x13,R0x11
00003a f020 BRLO _0x5
00003b 5f5f SUBI R21,-1
00003c 1b20 SUB R0x12,R0x10
00003d 0b31 SBC R0x13,R0x11
00003e cff9 RJMP _0x3
_0x5:
00003f 9350 0088 STS _asc+0x0,R0x15
; 9 atemp='0'; temp=1000; while(val >= temp) {atemp++; val-=temp;};*(asc+1)=atemp;
000041 e350 LDI R21,LOW(48)
000042 ee08 LDI R0x10,LOW(0x3e8)
000043 e013 LDI R0x11,HIGH(0x3e8)
_0x6:
000044 1720 CP R0x12,R0x10
000045 0731 CPC R0x13,R0x11
000046 f020 BRLO _0x8
000047 5f5f SUBI R21,-1
000048 1b20 SUB R0x12,R0x10
000049 0b31 SBC R0x13,R0x11
00004a cff9 RJMP _0x6
_0x8:
00004b 9350 0089 STS _asc+0x1,R0x15
; 10 atemp='0'; temp=100; while(val >= temp) {atemp++; val-=temp;};*(asc+2)=atemp;
00004d e350 LDI R21,LOW(48)
00004e e604 LDI R0x10,LOW(0x64)
00004f e010 LDI R0x11,HIGH(0x64)
_0x9:
000050 1720 CP R0x12,R0x10
000051 0731 CPC R0x13,R0x11
000052 f020 BRLO _0xB
000053 5f5f SUBI R21,-1
000054 1b20 SUB R0x12,R0x10
000055 0b31 SBC R0x13,R0x11
000056 cff9 RJMP _0x9
_0xB:
000057 9350 008a STS _asc+0x2,R0x15
; 11 atemp='0'; binc=(char)val; while(binc >= 10) {atemp++; binc-=10;};*(asc+3)=atemp;
000059 e350 LDI R21,LOW(48)
00005a 2f42 MOV R20,R18
_0xC:
00005b 304a CPI R20,10
00005c f018 BRLO _0xE
00005d 5f5f SUBI R21,-1
00005e 504a SUBI R20,LOW(10)
00005f cffb RJMP _0xC
_0xE:
000060 9350 008b STS _asc+0x3,R0x15
; 12 binc+='0';*(asc+4)=binc;
000062 5d40 SUBI R20,-LOW(48)
000063 9340 008c STS _asc+0x4,R0x14
</asm>
49 слов кода, наихудшее время исполнения (при N = 59999) = 277 тактов, наилучшее (при N = 0..9) = 39 тактов, среднее = (277+39)/2 = 158 тактов.
-----------------------------------------------------------
Теперь твой код:
<c>
void main(void)
{
char *rslt;
long val=65535;
int len=5;
rslt[len]=0;
while((--len)>=0)
{
rslt[len]=(val % 10)+'0';
val /=10;
}
}
</c>
Твой листинг компилятора:
<asm>
.DSEG
.ORG 0x88
; 1 void main(void)
; 2 {
.CSEG
_main:
; 3 char *rslt;
; 4 long val=65535;
; 5 int len=5;
; 6
; 7 rslt[len]=0;
000035 9724 SBIW R28,4
000036 e084 LDI R24,4
000037 e0a0 LDI R26,LOW(0)
000038 e0b0 LDI R27,HIGH(0)
000039 e5e4 LDI R30,LOW(_0x3*2)
00003a e0f0 LDI R31,HIGH(_0x3*2)
00003b 940e 00cd CALL __INITLOCB
; *rslt -> R16
; val -> Y+0
; len -> R17,R18
00003d e015 LDI R17,5
00003e e020 LDI R18,0
00003f 2fe1 MOV R30,R0x11
000040 2ff2 MOV R31,R0x12
000041 0fe0 ADD R30,R16
000042 2fae MOV R26,R30
000043 e0e0 LDI R30,LOW(0)
000044 93ec ST X,R30
; 8 while((--len)>=0)
_0x4:
000045 2fe1 MOV R30,R0x11
000046 2ff2 MOV R31,R0x12
000047 9731 SBIW R30,1
000048 2f1e MOV R0x11,R30
000049 2f2f MOV R0x12,R31
00004a 01df MOVW R26,R30
00004b 9710 SBIW R26,0
00004c f11c BRLT _0x6
; 9 {
; 10 rslt[len]=(val % 10)+'0';
00004d 2fe1 MOV R30,R0x11
00004e 2ff2 MOV R31,R0x12
00004f 0fe0 ADD R30,R16
000050 93ef PUSH R30
000051 81a8 LDD R26,Y+0x0
000052 81b9 LDD R27,Y+0x0+1
000053 818a LDD R24,Y+0x0+2
000054 819b LDD R25,Y+0x0+3
000055 e0ea LDI R30,LOW(0xa)
000056 e0f0 LDI R31,HIGH(0xa)
000057 e060 LDI R22,BYTE3(0xa)
000058 e070 LDI R23,BYTE4(0xa)
000059 940e 00a6 CALL __MODD21
00005b 5de0 SUBI R30,LOW(-0x30)
00005c 4fff SBCI R31,HIGH(-0x30)
00005d 4f6f SBCI R22,BYTE3(-0x30)
00005e 4f7f SBCI R23,BYTE4(-0x30)
00005f 91af POP R26
000060 93ec ST X,R30
; 11 val /=10;
000061 81a8 LDD R26,Y+0x0
000062 81b9 LDD R27,Y+0x0+1
000063 818a LDD R24,Y+0x0+2
000064 819b LDD R25,Y+0x0+3
000065 e0ea LDI R30,LOW(0xa)
000066 e0f0 LDI R31,HIGH(0xa)
000067 e060 LDI R22,BYTE3(0xa)
000068 e070 LDI R23,BYTE4(0xa)
000069 940e 00a1 CALL __DIVD21
00006b 83e8 STD Y+0x0,R30
00006c 83f9 STD Y+0x0+1,R31
00006d 836a STD Y+0x0+2,R22
00006e 837b STD Y+0x0+3,R23
; 12 }
00006f cfd5 RJMP _0x4
_0x6:
; 13 }
000070 9624 ADIW R28,4
__ANEGD1:
000072 95e0 COM R30
000073 95f0 COM R31
000074 9560 COM R22
000075 9570 COM R23
000076 5fef SUBI R30,-1
000077 4fff SBCI R31,-1
000078 4f6f SBCI R22,-1
000079 4f7f SBCI R23,-1
00007a 9508 RET
__DIVD21U:
00007b 933f PUSH R19
00007c 934f PUSH R20
00007d 935f PUSH R21
00007e 2400 CLR R0
00007f 2411 CLR R1
000080 2733 CLR R19
000081 2744 CLR R20
000082 e250 LDI R21,32
__DIVD21U1:
000083 0faa LSL R26
000084 1fbb ROL R27
000085 1f88 ROL R24
000086 1f99 ROL R25
000087 1c00 ROL R0
000088 1c11 ROL R1
000089 1f33 ROL R19
00008a 1f44 ROL R20
00008b 1a0e SUB R0,R30
00008c 0a1f SBC R1,R31
00008d 0b36 SBC R19,R22
00008e 0b47 SBC R20,R23
00008f f428 BRCC __DIVD21U2
000090 0e0e ADD R0,R30
000091 1e1f ADC R1,R31
000092 1f36 ADC R19,R22
000093 1f47 ADC R20,R23
000094 c001 RJMP __DIVD21U3
__DIVD21U2:
000095 60a1 SBR R26,1
__DIVD21U3:
000096 955a DEC R21
000097 f759 BRNE __DIVD21U1
000098 01fd MOVW R30,R26
000099 01bc MOVW R22,R24
00009a 01d0 MOVW R26,R0
00009b 2f83 MOV R24,R19
00009c 2f94 MOV R25,R20
00009d 915f POP R21
00009e 914f POP R20
00009f 913f POP R19
0000a0 9508 RET
__DIVD21:
0000a1 d018 RCALL __CHKSIGND
0000a2 dfd8 RCALL __DIVD21U
0000a3 f40e BRTC __DIVD211
0000a4 dfcd RCALL __ANEGD1
__DIVD211:
0000a5 9508 RET
__MODD21:
0000a6 94e8 CLT
0000a7 ff97 SBRS R25,7
0000a8 c009 RJMP __MODD211
0000a9 95a0 COM R26
0000aa 95b0 COM R27
0000ab 9580 COM R24
0000ac 9590 COM R25
0000ad 5faf SUBI R26,-1
0000ae 4fbf SBCI R27,-1
0000af 4f8f SBCI R24,-1
0000b0 4f9f SBCI R25,-1
0000b1 9468 SET
__MODD211:
0000b2 fd77 SBRC R23,7
0000b3 dfbe RCALL __ANEGD1
0000b4 dfc6 RCALL __DIVD21U
0000b5 01fd MOVW R30,R26
0000b6 01bc MOVW R22,R24
0000b7 f40e BRTC __MODD212
0000b8 dfb9 RCALL __ANEGD1
__MODD212:
0000b9 9508 RET
__CHKSIGND:
0000ba 94e8 CLT
0000bb ff77 SBRS R23,7
0000bc c002 RJMP __CHKSD1
0000bd dfb4 RCALL __ANEGD1
0000be 9468 SET
__CHKSD1:
0000bf ff97 SBRS R25,7
0000c0 c00b RJMP __CHKSD2
0000c1 2400 CLR R0
0000c2 95a0 COM R26
0000c3 95b0 COM R27
0000c4 9580 COM R24
0000c5 9590 COM R25
0000c6 9611 ADIW R26,1
0000c7 1d80 ADC R24,R0
0000c8 1d90 ADC R25,R0
0000c9 f800 BLD R0,0
0000ca 9403 INC R0
0000cb fa00 BST R0,0
__CHKSD2:
0000cc 9508 RET
__INITLOCB:
__INITLOCW:
0000cd 0fac ADD R26,R28
__INITLOC0:
0000ce 9005 LPM R0,Z+
0000cf 920d ST X+,R0
0000d0 958a DEC R24
0000d1 f7e1 BRNE __INITLOC0
0000d2 9508 RET
</asm>
158 слов кода (в 3 раза хуже, чем у меня), время исполнения (при любом 16-битном N) - 7746 тактов (в 49 раз хуже, чем у меня), при любом 32-битном N - 15692 такта.
Еще вопросы (обиды, наезды и т.д.) будут?