Avand in vedere ca nu e frumos
sa intrebi userul cate litere are cuvantul si nici sa stabilesti un caracter ca semn final, ce fel sar putea face pt a se afla lungimea unui sir de caractere?
strlen in assembler
Început de danyel7002, Vin 9 nov 2007 · 6 răspunsuri · 5.595 vizualizări
Privind prin prisma programarii in limbaj de asamblare totul sta sub motto-ul "cand pui ceva in memoria calculatorului tine minte ce si unde ai pus". Cu alte cuvinte daca nu definesti un simbol care sa marcheze sfarsitul sirului de carcatere nu vei putea deduce unde se termina, deci trebuie sa cunosti un minim de informatie despre sirul de caractere pe care vrei sa-l citesti folosind un program in cod masina.
Totusi, daca sirul de caractere a fost creat de alta aplicatie atunci vei cunoaste care este simbolul de terminare a sirului. De exemplu, daca te referi la determinarea lungimii unui sir ce respecta conventia limajului C te poti uita la pagina de mai jos:
Ms pt raspuns! Sunt bucuros ca am gasit pe cineva care se pricepe si ar putea sa ma ajute!
mov dx,offset string
mov bx,0 ;buffer tastatura
mov cx,10 ; la ce se foloseste cx cand deja dimensiune declarata e 32 byte????????
mov ah,3fh
int 21h
.data
string db 32 dup(1fh)
As vrea daca se poate explicatii pt mov dx,offset string. Ce se pune in dx? offset e distanta de la adressa initiala...dar aceasta variabila vine incrementata singura???... Ce face partea asta de program mai detaliat?
Am inteles ca aceasta este secventa cu care citesc sirul de caractere care vine memorat in vectorul de caractere string. Totodata cu declararea am initializat tot vectorul cu caracterul ascii ce corespunde la adressa 1fh(triunghi cu viful in jos).
Ce ar trebui exact sa fac pt a conta lungimea sirului?
ripet:
lea si,string
mov al,[si]
inc cc ;se incrementeaza variabila care nr caracterele
inc si
cmp al,1fh
jne ripet
Imi intra in ciclul infinit, nu stiu motivul...am gresit ceva 
Editat Vin 9 nov 2007 23:34
din pacate nu pot sa-ti dau un raspuns detaliat la intrebarile tale pentru ca nu am ajuns sa programez in limbaj masina de 80x86, m-am oprit la Z80
offset string s-ar putea sa fie adresa relativa la care este inmagazinat sirul tau. inclin sa cred ca ai afisat doar bucati din program. registrul cx s-ar putea sa fie folosit de subrutina apelata prin "int 21h" care banuiesc ca este cunoscuta.
referitor la a doua parte:
1) instructiunea lea trebuie sa fie inaintea etichetei "ripet" pentru ca altfel de fiecare data cand executi saltul la ripet registrul si va indica pozitia de inceput, adica bate pasul pe loc.
2) tu initializezi niste locatii de memorie cu valoarea 1fh si apoi cand citesti vrei sa iesi din bucla cand se intalneste valoarea asta, cu alte cuvinte bucla ar trebui sa fie parcursa o singura data !!
cred ca iti intra in ciclu infinit pentru ca registrul si nu este initializat corespunzator.
trebuie sa rabdare cu programele in cod masina, si cum ne zicea un profesor din liceu. "calculatorul are intotdeauna dreptate, el face ceea ce ii zici tu". este recomandat sa utilizezi programe specializate care-ti permit executia pas cu pas a codului si astfel poti vedea exact valorile registrilor, ale flag-urilor.
Editat Sâm 10 nov 2007 01:17
1.lea intradevar trebuia sa fie pus prima de ripet...mia fugit...MS
2. ripet nu se face numai 1 data pt ca vectorul a fost initializat la inceput cu 1fh dar apoi caracterele citite au inlocuit semnul ascii(1fh). deci ramane sirul de caractere citit si apoi restul este plin de 1fh. cand intalneste 1fh iese din ciclu si asa in cc am salvat nr de caractere.
ok. dupa o cautare fara efort pe internet am gasit pagina de mai jos, cred ca o sa-ti fie utila, gasesti raspunsul si la intrebarea despre cx:
http://spike.scu.edu.au/~barry/interrupts.html
http://spike.scu.edu.au/~barry/interrupts.html#ah3f
subrutina int 21h cu ah=3fh iti furnizeaza numarul de caractere citite in ax, de asemenea trebuie sa tratezi si cazul unei erori, vezi cf, pentru ca un utilizator extern nu va sti daca totul a decurs normal sau nu.
CX = number of bytes to read
Am reusit sa inteleg cat de cat. Faza cu "cx=number of bytes to read" nu e valabila pt tastatura...eu am pus cx=30 si citesc de la tastatura mereu mai putin de 30(lucreza cu bufferul de la tastatura-citeste 30byte cand in buffer sunt numai 20?)...nu inteleg-in declaratie se scrie nr maxim de caractere...iar aici e ceva in plus, ma rog, poate e util cand se citeste un file.
