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
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
Dakujem