Roportalul meu
Servicii Eveniment Articole ProgramTv Magazin Jocuri Horoscop Download Stiri Director Poze Anunturi Forum

Bine ai venit vizitatorule ( Log-are | Inregistrare )

 
Reply to this topicStart new topic
strlen in assembler, cum se poate determinat lungimea sirului de caractere
danyel7002
mesaj Nov 9 2007, 04:18 PM
Mesaj #1


Boboc
*

Grup: Full Members
Mesaje: 30
Conectat: 20-May 07
Membrul Nr.: 97,712



Avand in vedere ca nu e frumos rolleyes.gif 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?
Go to the top of the page
 
+Quote Post
soarce
mesaj Nov 9 2007, 06:40 PM
Mesaj #2


Trandafir
****

Grup: Full Members
Mesaje: 410
Conectat: 13-October 07
Membrul Nr.: 118,674



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:


http://www.int80h.org/strlen/
Go to the top of the page
 
+Quote Post
danyel7002
mesaj Nov 9 2007, 11:00 PM
Mesaj #3


Boboc
*

Grup: Full Members
Mesaje: 30
Conectat: 20-May 07
Membrul Nr.: 97,712



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 rolleyes.gif

Acest mesaj a fost editat de catre danyel7002: Nov 9 2007, 11:34 PM
Go to the top of the page
 
+Quote Post
soarce
mesaj Nov 10 2007, 01:13 AM
Mesaj #4


Trandafir
****

Grup: Full Members
Mesaje: 410
Conectat: 13-October 07
Membrul Nr.: 118,674



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 grin.gif


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.

Acest mesaj a fost editat de catre soarce: Nov 10 2007, 01:17 AM
Go to the top of the page
 
+Quote Post
danyel7002
mesaj Nov 10 2007, 12:02 PM
Mesaj #5


Boboc
*

Grup: Full Members
Mesaje: 30
Conectat: 20-May 07
Membrul Nr.: 97,712



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.
Go to the top of the page
 
+Quote Post
soarce
mesaj Nov 10 2007, 04:11 PM
Mesaj #6


Trandafir
****

Grup: Full Members
Mesaje: 410
Conectat: 13-October 07
Membrul Nr.: 118,674



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.
Go to the top of the page
 
+Quote Post
danyel7002
mesaj Nov 11 2007, 06:21 PM
Mesaj #7


Boboc
*

Grup: Full Members
Mesaje: 30
Conectat: 20-May 07
Membrul Nr.: 97,712



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.
Go to the top of the page
 
+Quote Post
Reclama
mesaj
Mesaj #


-









Go to the top of the page
 
Quote Post

Reply to this topicStart new topic

 

RSS Versiune Lo-Fi Astazi: 18th March 2010 - 11:56 AM