Bine ai venit vizitatorule ( Log-are | Inregistrare )
![]() ![]() |
strlen in assembler, cum se poate determinat lungimea sirului de caractere |
Nov 9 2007, 04:18 PM
Mesaj
#1
|
|
|
Boboc ![]() Grup: Full Members Mesaje: 30 Conectat: 20-May 07 Membrul Nr.: 97,712 |
|
|
|
|
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/ |
|
|
|
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 Acest mesaj a fost editat de catre danyel7002: Nov 9 2007, 11:34 PM |
|
|
|
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
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 |
|
|
|
Nov 10 2007, 12:02 PM
Mesaj
#5
|
|
|
Boboc ![]() Grup: Full Members Mesaje: 30 Conectat: 20-May 07 Membrul Nr.: 97,712 |
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. |
|
|
|
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. |
|
|
|
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. |
|
|
|
| Reclama |
Mesaj
#
|
||
![]() - |
|
||
|
|
|||
![]() ![]() |
|
Versiune Lo-Fi | Astazi: 18th March 2010 - 11:56 AM |
Anunturi
Articole
Poze




Nov 9 2007, 04:18 PM



