FPK hat geschrieben:Ich bin deswegen auch der Meinung: der Nutzer einer Entwicklungssystem darf kein Assembler benötigen, falls doch, ist was am Compiler/der Sprache falsch.
Am PC möchte ich auch nicht (mehr) mit Assembler rumfummeln. Allerdings konnte man nur so in Turbo-Pascal einen Grafikbildschirm mehr als 16 Farben bekommen.
Allerdings geht es hier um Mikrocontroller, und da musst Du mitunter selbst am gut abgehangenen GCC mit Asm arbeiten.
Und der Pascal-Compiler macht mitunter absolut komische Sachen. Einmal den Datentyp von Unsigned auf Signed gewechselt, und Du bekommst statt einer wenige µsec dauernden Hardware-Multiplikation (in 16bit) eine Software-Multiplikation mit 100-facher Dauer hingeklatscht.
Code: Alles auswählen
# [39] c_u32 := a_u16 * b_u16;
lds r18,(U_sMT_MATH_ss_A_U16)
lds r19,(U_sMT_MATH_ss_A_U16+1)
lds r22,(U_sMT_MATH_ss_B_U16)
lds r23,(U_sMT_MATH_ss_B_U16+1)
mul r18,r22
movw r20,r0
mul r19,r22
add r21,r0
mul r18,r23
add r21,r0
clr r1
mov r18,r1
mov r19,r1
sts (U_sMT_MATH_ss_C_U32),r20
sts (U_sMT_MATH_ss_C_U32+1),r21
sts (U_sMT_MATH_ss_C_U32+2),r18
sts (U_sMT_MATH_ss_C_U32+3),r19
# [40] c_i32 := a_u16 * b_i16;
lds r18,(U_sMT_MATH_ss_B_I16)
lds r19,(U_sMT_MATH_ss_B_I16+1)
mov r20,r1
sbrc r19,7
com r20
mov r21,r20
lds r22,(U_sMT_MATH_ss_A_U16)
lds r23,(U_sMT_MATH_ss_A_U16+1)
mov r24,r1
mov r25,r1
call fpc_mul_longint
sts (U_sMT_MATH_ss_C_I32),r22
sts (U_sMT_MATH_ss_C_I32+1),r23
sts (U_sMT_MATH_ss_C_I32+2),r24
sts (U_sMT_MATH_ss_C_I32+3),r25
Es ist ja richtig, dass die obere Mul nur 16 Bit liefert, Überlauf wird einfach abgeschnitten, während die untere echte 32 Bit hat. Aber es ist für den Programmierer nicht ersichtlich, warum der Compiler mal so und mal so entscheidet.
Oder Divison / 256. Immerhin erkennt der Compiler, dass er keine Software-Division aufrufen muss. Allerdings macht er dann ein Shift über 8 Bits draus. Dabei muss er nur ein paar Bytes umsortieren.
Auch sehr beliebt, Werte erstmal in ein Register laden, um sie dann in ein anderes Register umzuladen, mit dem gerechnet wird.
Wenn es dann schnell gehen soll, muss man einfach von Hand ran.