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.