Mix Postat Noiembrie 20, 2009 Partajează Postat Noiembrie 20, 2009 salut. cine ma poate ajuta la traducerea secventei de cod din limbajul C in Assembler? char Cmd, i;for(i = 0; i < 8; i++){if((Cmd & (1<<i))!= 0){......} multumesc anticipat Link spre comentariu
nooob64 Postat Noiembrie 20, 2009 Partajează Postat Noiembrie 20, 2009 Cel mai simplu e sa introduci codul intr-un compilator C (pentru MCU ) si sa dai assembler view. Link spre comentariu
Mix Postat Noiembrie 20, 2009 Autor Partajează Postat Noiembrie 20, 2009 asa am facut prima data dar mplab-ul meu nu are toate facilitatile si nu imi compileaza unele comenzi Link spre comentariu
nooob64 Postat Noiembrie 22, 2009 Partajează Postat Noiembrie 22, 2009 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
edy_wheazel Postat Noiembrie 22, 2009 Partajează Postat Noiembrie 22, 2009 Mai este o varianta: il compilezi si dupa ce ai .hex-ul il bagi intr-un "pic disassembler". Da-i pe google pt. asa ceva. Link spre comentariu
kit Postat Noiembrie 23, 2009 Partajează Postat Noiembrie 23, 2009 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 1temp 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 tempCam asa ceva, parca, sper. N-am verificat in debugger codul, dar cred ca merge. Bafta! Link spre comentariu
Mix Postat Noiembrie 25, 2009 Autor Partajează Postat Noiembrie 25, 2009 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum