Download | Programy

ASSEMBLER i8080 POMOC

Programovací jazyky, grafika, tvorba webu, SEO, programy pro práci s webem, vyhledávače

Moderátor: Moderátoři

james25
Nováček
Nováček
Příspěvky: 1
Registrován: sob bře 28, 2009 13:51

ASSEMBLER i8080 POMOC

Příspěvek od 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: Vybrat vše

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 

pc manik
Uživatel
Uživatel
Příspěvky: 334
Registrován: úte črc 22, 2008 13:51
Bydliště: Hradec Králové
Kontaktovat uživatele:

Re: ASSEMBLER i8080 POMOC

Příspěvek od pc manik »

Hmm ja na assembler jsem naprostý amater zkoušel jsem si jen chvilí na něm něco jinak jsem sand na něm nedělal více jak 20min,ale věděl bych kde se zkusit zeptat na problem a tam si myslím,že bys ho zjistil mrkni na

Kód: Vybrat vše

www.programujte.com
Odpovědět