ASSEMBLER i8080 POMOC

Všetko o programoch, problémoch...
POZOR: žiadny WAREZ
james25

ASSEMBLER i8080 POMOC

Príspevok od používateľa james25 »

cawte, potreboval by som pomoct s binarnym vypisom programu. Ulohou programu je pocitat slova, ktore obsahuju len velke pismena abecedy a tento pocet ma byt vypisany v dvojkovej sustave. Program, aspon myslim, ze je kompletny (nejako som ho pozliepal), len mam pocit, ze je tam problem s registrami (asi som ich pomiesal), proste ocekujte to pls niekto, diky.

Kód: Vybrať všetko


org 1000         

dcx sp         ; inicializacia zasobnika (0FFFFh)

lxi h,text1      ; skopiruj text1 do h
call putstr      ; vypis uvodny text

mvi b,0         ; pocitadlo vyhovujucich slov
mvi c,0         ; pocitadlo vyhovujucich znakov v slove
mvi d,0         ; pocitadlo vsetkych znakov v slove


char_loop:
   call getchar   ; nacita sa zadany znak do registra "a"
   cpi 10      ; porovna sa register "a" s backspacom 
   jz char_end   ; skoci sa na char_end, ak sa rovna
   cpi 13      ; porovna sa register "a" s enterom
   jz char_end   ; skoci sa na char_end, ak sa rovna
   cpi 32      ; porovna sa register "a" s medzerou
   jz char_space   ; skoci sa na char_space, ak sa rovna
   cpi 65       ; nacitany znak sa porovna s 'A'
   jz char_add   ; skoci sa na char_add, ak sa rovna
   cpi 66       ; dalej sa nacitavaju a porovnavaju vsetky ASCII     
   jz char_add   ;   kody znakov velkej abecedy, az po 'Z'
   cpi 67           
   jz char_add
   cpi 68    
   jz char_add
   cpi 69    
   jz char_add
   cpi 70    
   jz char_add
   cpi 71    
   jz char_add
   cpi 72    
   jz char_add
   cpi 73    
   jz char_add
   cpi 74    
   jz char_add
   cpi 75    
   jz char_add
   cpi 76    
   jz char_add
   cpi 77    
   jz char_add
   cpi 78    
   jz char_add
   cpi 79    
   jz char_add
   cpi 80    
   jz char_add
   cpi 81    
   jz char_add
   cpi 82    
   jz char_add
   cpi 83    
   jz char_add
   cpi 84    
   jz char_add
   cpi 85    
   jz char_add
   cpi 86    
   jz char_add
   cpi 87    
   jz char_add
   cpi 88    
   jz char_add
   cpi 89    
   jz char_add
   cpi 90      ; nacitany znak sa porovna so 'Z'
   jz char_add   ; skonci sa na char_add, ak sa rovna
   inr d      ; inkrementuje sa pocitadlo vsetkych znakov v slove
   jmp char_loop   ; nacita sa dalsi znak

char_add:
   inr c      ; inkrementuje sa pocitadlo vyhovujucich znakov v slove
   inr d      ; inkrementuje sa pocitadlo vsetkych znakov v slove
   jmp char_loop   ; nacita sa dalsi znak

char_space:
   mov a,d      ; pocitadlo vsetkych znakov v slove sa skopiruje do registra "a"
   cpi 0      ; nebola prvy znak medzera?
   jz char_loop    ; ak ano, nacita sa dalsi znak
   cmp c      ; porovna sa, ci vsetky znaky boli vyhovujuce
   mvi d,0      ; vynuluje sa pocitadlo vsetkych znakov v slove
   mvi c,0      ; vynuluje sa pocitadlo vyhovujucich znakov v slove
   jnz char_loop   ; nacita sa dalsi znak
   inr b      ; inkrementuje sa pocitadlo vyhovujucich slov
   jmp char_loop   ; nacita sa dalsi znak

char_end:
   mov a,d      ; skopiruje sa pocitadlo vsetkych znakov v slove do registra "a"
   cpi 1      ; ak nie su ziadne dalsie znaky,
   jc print      ;    pokracuje sa vo vypise
   cmp c      ; inak sa kontroluje, ci posledne slovo bolo spravne
   jnz print      ; ak nie, pokracuje sa vo vypise
   inr b      ; ak ano, inkrementuje sa pocitadlo vyhovujucich slov

celociselny_zvisok_po_deleni:
sub b            ; odcita b od a
cmp b            ; porovna b s a
jnc celociselny_zvisok_po_deleni   ; ak je a < b skonci
ret            ; vrati sa spet

delenie_celeho_cisla:
mvi h,0;
_delenie:
sub b            ; odcita b od a
inr h            ; zvisi h
cmp b            ; porovna b s a
jnc _delenie         ; ak je a < b skonci
mov a, h            
ret            ; vrati sa spet

binarny_prevod:
mvi a,0            ; do registra a da 0
sta 20            ; zapise obsah registra a do pamete 20
sta 21            ; zapise obsah registra a do pamete 21
sta 22            ; zapise obsah registra a do pamete 22
sta 23            ; zapise obsah registra a do pamete 23
sta 24            ; zapise obsah registra a do pamete 24
sta 25            ; zapise obsah registra a do pamete 25
sta 26            ; zapise obsah registra a do pamete 26
sta 27            ; zapise obsah registra a do pamete 27
sta 28            ; zapise obsah registra a do pamete 28
sta 29            ; zapise obsah registra a do pamete 29

mov a, c            ; do registra a da obsah registra c
sta 20            ; zapise obsah registra a do pamete 20
mvi b,2            ; do registra b da 2

call celociselny_zvisok_po_deleni   ; zavola celociselny_zvisok_po_deleni
sta 22            ; zapise obsah registra a do pamete 22
lda 20            ; obsah pamete 20 da do registra a

call delenie_celeho_cisla      ; zavola delenie_celeho_cisla
sta 21            ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni   ; zavola celociselny_zvisok_po_deleni
sta 23            ; zapise obsah registra a do pamete 23
lda 21            ; obsah pamete 21 da do registra a
call delenie_celeho_cisla      ; zavola delenie_celeho_cisla
sta 21            ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni   ; zavola celociselny_zvisok_po_deleni
sta 24            ; zapise obsah registra a do pamete 24
lda 21            ; obsah pamete 21 da do registra a
call delenie_celeho_cisla      ; zavola delenie_celeho_cisla
sta 21            ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni   ; zavola celociselny_zvisok_po_deleni
sta 25            ; zapise obsah registra a do pamete 25
lda 21            ; obsah pamete 21 da do registra a
call delenie_celeho_cisla      ; zavola delenie_celeho_cisla
sta 21            ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni   ; zavola celociselny_zvisok_po_deleni
sta 26            ; zapise obsah registra a do pamete 26
lda 21            ; obsah pamete 21 da do registra a
call delenie_celeho_cisla      ; zavola delenie_celeho_cisla
sta 21            ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni   ; zavola celociselny_zvisok_po_deleni
sta 27            ; zapise obsah registra a do pamete 27
lda 21             ; obsah pamete 21 da do registra a
call delenie_celeho_cisla      ; zavola delenie_celeho_cisla
sta 21            ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni   ; zavola celociselny_zvisok_po_deleni
sta 28            ; zapise obsah registra a do pamete 28
lda 21            ; obsah pamete 21 da do registra a
call delenie_celeho_cisla      ; zavola delenie_celeho_cisla
sta 21            ; zapise obsah registra a do pamete 21
call celociselny_zvisok_po_deleni   ; zavola celociselny_zvisok_po_deleni
sta 29            ; zapise obsah registra a do pamete 29
lda 29            ; obsah pamete 29 da do registra a

adi 48            ; k obsahu registra a pripocita 48
out 11h            ; vypise obsah registra a na obrazovku
lda 28            ; obsah pamete 28 da do registra a
adi 48            ; k obsahu registra a pripocita 48
out 11h            ; vypise obsah registra a na obrazovku
lda 27            ; obsah pamete 27 da do registra a
adi 48            ; k obsahu registra a pripocita 48
out 11h            ; vypise obsah registra a na obrazovku
lda 26            ; obsah pamete 26 da do registra a
adi 48            ; k obsahu registra a pripocita 48
out 11h            ; vypise obsah registra a na obrazovku
mvi a,' '            ; do registra a da ' '
out 11h            ; vypise obsah registra a na obrazovku
lda 25            ; obsah pamete 25 da do registra a
adi 48            ; k obsahu registra a pripocita 48
out 11h            ; vypise obsah registra a na obrazovku
lda 24            ; obsah pamete 24 da do registra a
adi 48            ; k obsahu registra a pripocita 48
out 11h            ; vypise obsah registra a na obrazovku
lda 23            ; obsah pamete 23 da do registra a
adi 48            ; k obsahu registra a pripocita 48
out 11h            ; vypise obsah registra a na obrazovku
lda 22            ; obsah pamete 22 da do registra a
adi 48            ; k obsahu registra a pripocita 48
out 11h            ; vypise obsah registra a na obrazovku
ret            ; vrati sa spet

print:
   lxi h,text2   ; skopiruje sa text2 do h
   call putstr   ; vypise sa text2
   mov a,b      ; skopiruje sa pocitadlo vyhovujucich slov do registra "a"   
   adi '0'      ; hodnota a jej ASCII tvar ...
   call putchar   ; vypise sa znak
   call newline   ; vypise sa novy riadok
   

hlt      ; ukonci sa program

include 'examples\8080\include\getline.inc'
include 'examples\8080\include\putstr.inc'
include 'examples\8080\include\putchar.inc'
include 'examples\8080\include\getchar.inc'
include 'examples\8080\include\newline.inc'

text1: db 'Pocet slov obsahujucich len velke pismena ...',10,13,'Vloz text: ',0
text2: db 10,13,'Slov je: ',0
vlozeny: ds 30 

Návrat na "Programy a problémy s nimi"