Sari la conținut
ELFORUM - Forumul electronistilor

traducere din c in assembler


Mix

Postări Recomandate

  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Mix

    3

  • nooob64

    2

  • kit

    1

  • edy_wheazel

    1

Top autori în acest subiect

Eu nu prea am tangenta cu ASM , dar uite codul asm generat pentru acest program scris in mikroC

char Cmd, i;void main(){for(i = 0; i < 8; i++){if((Cmd & (1<<i))!= 0){}}}

;  ASM code generated by mikroVirtualMachine for PIC - V. 8.2.0.0;  Date/Time: 11/22/2009 11:22:41 PM;  Info: http://www.mikroe.com; ADDRESS	OPCODE	ASM; ----------------------------------------------$0000	$2804			GOTO	_main$0004	$	_main:;aaaa.c,3 :: 		void main();aaaa.c,5 :: 		for(i = 0; i < 8; i++){$0004	$1303			BCF	STATUS, RP1$0005	$1283			BCF	STATUS, RP0$0006	$01A0			CLRF	_i, 1$0007	$	L_main_0:$0007	$3008			MOVLW	8$0008	$0220			SUBWF	_i, 0$0009	$1803			BTFSC	STATUS, C$000A	$2829			GOTO	L_main_1;aaaa.c,6 :: 		if((Cmd & (1<<i))!= 0)$000B	$0820			MOVF	_i, 0$000C	$00F2			MOVWF	STACK_2$000D	$3001			MOVLW	1$000E	$00F0			MOVWF	STACK_0$000F	$3000			MOVLW	0$0010	$00F1			MOVWF	STACK_0+1$0011	$0872			MOVF	STACK_2, 0$0012	$	L_main_4:$0012	$1903			BTFSC	STATUS, Z$0013	$2819			GOTO	L_main_5$0014	$0DF0			RLF	STACK_0, 1$0015	$0DF1			RLF	STACK_0+1, 1$0016	$1070			BCF	STACK_0, 0$0017	$3FFF			ADDLW	255$0018	$2812			GOTO	L_main_4$0019	$	L_main_5:$0019	$0870			MOVF	STACK_0, 0$001A	$0521			ANDWF	_Cmd, 0$001B	$00F2			MOVWF	STACK_2$001C	$3000			MOVLW	0$001D	$0571			ANDWF	STACK_0+1, 0$001E	$00F3			MOVWF	STACK_2+1$001F	$3000			MOVLW	0$0020	$0673			XORWF	STACK_2+1, 0$0021	$1D03			BTFSS	STATUS, Z$0022	$2825			GOTO	L_main_6$0023	$3000			MOVLW	0$0024	$0672			XORWF	STACK_2, 0$0025	$	L_main_6:$0025	$1903			BTFSC	STATUS, Z$0026	$2827			GOTO	L_main_3;aaaa.c,9 :: 		}}$0027	$	L_main_3:$0027	$	L_main_2:;aaaa.c,5 :: 		for(i = 0; i < 8; i++){$0027	$0AA0			INCF	_i, 1;aaaa.c,9 :: 		}}$0028	$2807			GOTO	L_main_0$0029	$	L_main_1:;aaaa.c,10 :: 		}$0029	$2829			GOTO	$
Link spre comentariu

Conteaza aici ce uC folosesti. De exemplu, pentru 18F4520 nu exista instructiunea RLF indicata in listing...

Variabilele Cmd si i se declara:

UDATA_ACSCmd res 1i res 1temp res 1
temp se foloseste pentru a pastra continutul Cmd intact. Daca in Cmd nu se afla ceva util se poate elimina

Apoi codul ar veni cam asa:

...movlw 0x08movwf i;initializez contorul buclei cu 8movff Cmd,temp;salvez continutul Cmd in caz ca mai trebuie(1)Loop: ;asta este bucla "for" din programul taubtfss temp,0 ;testez bitul ZERO al registruluigoto Loop_Next ;bitul testat este 0;aici vine;partea de cod care se ruleaza;in cazul in care bitul testat;este setatLoop_Next:rrncf temp,1; rotire catre dreapta fara Carry, pregatesc urmatorul bit pentru testaredecfsz i,1;decrementez i si vad daca-i 0goto Loop;i>0;am executat de 8 ori bucla;de aici se continua cu restul programului...
(1)sau:

movf Cmd,0; movwf temp
Cam asa ceva, parca, sper. N-am verificat in debugger codul, dar cred ca merge.

Bafta!

Link spre comentariu

mesi kit. in mod asemanator tie am gandit si eu codul. numai ca nu sunt sigur 100% ca subrutina scrisa de mine face ceea ce vreau

DS_WRITE	CALL 	        DS_RX	MOVLW	0x08	MOVWF	DEL2DS_WRITE_2	BTFSS	DATE, 0	GOTO 	DS_WRITE_1	RLF	        DATE, 1	CALL	        DS_TX	BCF 	        DS_PORT	NOP	CALL	        DS_RX	CALL	        DELAY_60US	DECFSZ	DEL2, F	GOTO	        DS_WRITE_2	RETURNDS_WRITE_1	RLF	        DATE, 1	CALL	        DS_TX	BCF 	        DS_PORT	CALL	        DELAY_60US	CALL	        DS_RX	DECFSZ	DEL2, F	GOTO	        DS_WRITE_2	RETURN

DEL2 am folosit pentru contor iar DATE este octetul pe care vreau sa il verific prin rotire la stanga

p.s. folosesc pic16f84a, del2 si date sunt declarate in cblock

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări