uloha 8051

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
lacika
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1179
Dátum registrácie: 07 Feb 2009, 00:00
Bydlisko: Kosice
Vek: 33
Kontaktovať používateľa:

uloha 8051

Príspevok od používateľa lacika » 22 Okt 2012, 14:15

Mam za ulohu urobit kopirovanie retazca z Code do xData a z xData reverzne do data.

mam k dispozcii dva zdrojaky.. code2int (code to data)

Kód: Vybrať všetko

#include "reg51.inc"    ; hlavickovy subor s definiciami SFR a SBIT

VAR1    SEGMENT XDATA   ; definicia segmentu v XDATA pamati
                        ; (v tomto priklade nepotrebne, vyuzitelne v domacej ulohe)

AS      EQU     1000H   ; ZACIATOK retazca (v CODE pamati)
AD      EQU     2000H     ; CIELOVA adresa retazca (v DATA pamati)

        USING   0       ; definuje hodnoty absolutnych adries AR0-AR7
                        ; (0 - zodpoveda banke 0)
                        ; direktiva USING zabezpeci automaticke generovanie
                        ; adries AR0-AR7, ktore prisluchaju zvolenej banke
                        ; registrov (AR0 je absolutna adresa registra R0
                        ; v aktualne zvolenej banke, t.j. 00h pre banku 0,
                        ; 08h pre banku 1, ...).
                        ; !!! direktiva USING nezabezpeci natavenie prislusnej
                        ; banky registrov v PSW. Toto musi zabezpecit
                        ; vhodnou modifikaciou registra PSW.
                        ; Po resete je v PSW nastavena banka registrov 0:
; Program Status Word (PSW)
; addr    PSW:  CY  AC  F0  RS1 RS0  OV  -  P   Reset 
; 90H            x   x   x   x   x    x  x  x   0x00
;                            0   0              Banka 0
;                            0   1              Banka 1
;                            1   0              Banka 2
;                            1   1              Banka 3
; 


        ORG 0           ; zaciatok programu PO RESETE
        jmp     START
;----------------------------------------------
; HLAVNY PROGRAM
;----------------------------------------------

        ORG     100h
START:  MOV DPTR,#AS    ; zdrojova adresa zaciatku retazca v CODE pamati
        MOV R1,#AD      ; cielova adresa retazca v DATA pamati
        CALL MOVCSTR    ; volanie podporogramu kopirovania

        MOV DPTR,#ADR2  ; len na demonstrovanie hodnoty ADR2
                        ; (vidno napr. v simulatore), umoznuje
                        ; alokovat presnu polohu v XDATA pamati.

KONIEC: JMP KONIEC      ; koniec (nekonecna slucka)

;----------------------------------------------
; PODPROGRAMY
;----------------------------------------------
MOVCSTR:
; pouziva;    A, R0, R1, DPTR
; uchovava;   A, R0
; nici:       R1, DPTR
; zasobnik:   2 bajty

        PUSH ACC                ; odlozenie akumulatora (ACC je adresa akumulatora v oblasti SFR,
                                ; instrukcia PUSH A neexistuje!!!)
        PUSH AR0                ; odlozenie R0 v banke definovanej
                                ; direktivou USING (AR0 je absolutna adresa
                                ; R0 v DATA pamati, instrukcia PUSH RO neexistuje!!! )
        MOV R0,#0               ; inicializacia "indexu" prvku v kopirovanom
                                ; retazci, ktory zacina na adrese AS v CODE pamati

MVS:    MOV  A,R0               ; kopia "indexu" do A
        MOVC A,@A+DPTR          ; nacitanie zdrojoveho bajtu retazca
        MOV @R1,A               ; presun bajtu priamo do DATA pamate
        INC R0                  ; inkrementacia "indexu"
        INC R1                  ; inkrementacia cielovej adresy (smernika)
        CJNE A,#00H,MVS         ; test ukoncenia (konca retazca)
        POP AR0                 ; obnova R0
MVSEND: POP ACC                 ; obnova akumulatora
        RET                     ; navrat z podprogramu

;----------------------------------------------
; Retazec v extrenej programovej pamati
; (je ulozeny trvale, teda po resete procesora je okamzite k dispozicii)
;----------------------------------------------
        ORG     AS
        DB      'R'             ; retazec v programovej ("CODE") pamati
        DB      'E'
        DB      'T'
        DB      'A'
        DB      'Z'
        DB      'E'
        DB      'C'
        DB      00h             ; zakonceny nulou (umoznuje ukoncit podprogram kopirovania)

        RSEG    VAR1            ; priklad alokacie priestoru v XDATA pamati
        ORG     1000H           ; definovanie polohy v adresovom priestore
ADR1:   DS      20              ; ADR1 ma hodnotu 1000H
ADR2:   DS      30              ; ADR2 ma hodnotu 1014H

        END
A este mam zdrojak xram2int

Kód: Vybrať všetko

AS	EQU	1000H	; ZACIATOK retazca
AD	EQU	30H	; CIELOVA ADRESA BLOKU DAT
AR0	EQU	00H	; ADRESA REGISTRA R0

	ORG 0		; PO RESETE

;----------------------------------------------
; HLAVNY PROGRAM
;----------------------------------------------

START:	MOV DPTR,#AS	; INICIALIZACIA - ADRESY ZACIATKU
	MOV R1,#AD	; INICIALIZACIA - CIELOVEJ ADRESY

	CALL MOVXSTR	; VOLANIE PODPROGRAMU

KONIEC:	JMP KONIEC	; KONIEC

;----------------------------------------------
; PODPROGRAMY
;----------------------------------------------

;----------------------------------------------
MOVXSTR:

	PUSH ACC		; ODLOZENIE AKUMULATORA
	PUSH AR0
	MOV R0,#0

MVX:	MOVC A,DPTR		; NACITANIE ZDROJOVEHO BYTE
	MOV @R1,A		; PRESUN BYTE Z ACC DO CIELA
	INC DPTR		; INKREMENT ZDROJOVEHO SMERNIKA
	INC R1			; INCREMENT CIELOVEHO SMERNIKA
	CJNE A,#00H,MVS 	; TEST KONCA RETAZCA
	POP AR0
MVXEND:	POP ACC			; OBNOVA AKUMULATORA
	RET			; NAVRAT Z PODPROGRAMU

	END
vie mi niekto poradit ako to poskaladat?
Dakujem
0
Myslieť, znamená hovno vedieť.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: uloha 8051

Príspevok od používateľa xmilos » 23 Okt 2012, 15:06

Hmmm...
to chces cele napisat, alebo len nasmerovat.

Su tam chyby. v 2. casti nie je adresa MVX ( v CJNE je MVS ). Nazov bloku naznacuje prenos z XDATA (MOVXSTR), ale kopiruje z CODE ( MOVC A, DPTR ). Tam by mala byt MOVX A, DPTR.
0

Napísať odpoveď