Jump to content
ELFORUM - Forumul electronistilor

Assembler


Guest mbogdanf

Recommended Posts

Guest mbogdanf

Am de facut un proiect in assembler pentru facultate si nu ma descurc.Poate ma ajutati voi.Proiectul consta in numararea cifrelor,literelor mici,lit.mari si caracterelor speciale.Am incercat ceva dar nu prea e bine.Astept sfaturi.Acesta este programul:.model small.stack 200h.datasir db 100 dup(?),'$'sir1 db 100 dup(' '),'$'msg db "Dati sirul:",0ah,0dh,'$'msg3 db "Litere mici=", 0ah,0dh,'$'msg4 db "Litere mari=" ,0ah,0dh,'$'msg5 db "Cifre=", 0ah,0dh,'$'msg6 db "Caractere speciale=" ,0ah,0dh,'$'x dw 0z dw 0y dw 0t dw 0imp dw 10.codemov ax,dgroupmov ds,axmov si,0mov sir[si],254lea bx,sirmov si,1mov cx,bx[si]mov ah,09hmov dx,offset msgint 21hmov ah, 0ahmov dx,offset sirint 21hmov si,2m:cmp sir[si],48jl m1m2:cmp sir[si],57jg m1m3:inc t inc si loop m m1: cmp sir[si],65jl m4m5:cmp sir[si],90jg m4m6:inc x inc si loop m m4:cmp sir[si],97jl m7m8:cmp sir[si],122jg m7m9:inc z inc si loop mm7:inc y inc si loop m mov ax,tmov cx,axcall proceduramov ah,09hmov dx,offset msg5int 21hmov ah,09hmov dx,offset sir1int 21hprocedura procrepeta: div imp ; catul impartirii este in ax, iar restul in dx.Deoarece restul nu poate ; fi mai mare de 9, putem lua in considerare numai valoarea aflata in dl. ; pentru a converti numarul aflat in al intr-o cifra de la 0 la 9,; adunam codul caracterului '0' add dl, '0' mov sir1[si],dl dec si mov dx,0 ; compara catul cu 0...Catul va fi egal cu 0 cand vor fi determinate ; toate cifrele numarului cmp ax,0 jne repeta retendpmov ah,4chint 21hend

Link to comment
  • Replies 11
  • Created
  • Last Reply

Top Posters In This Topic

ăsta NU e assembler, pare mai degrabă un ghiveci de C și asm.pentru ce procesor/controller/microcontroller trebuie făcut programul???

MifTy: Asta este assembler. Ghiveci este in alta parte. Daca nu ai idee despre ce este vorba, mai bine taci. mbogdanf: eu cred ca gresesti in rutina de conversie pentru afisarea lui dw t.
Link to comment
Guest mbogdanf

MifTy: Asta este assembler. Ghiveci este in alta parte. Daca nu ai idee despre ce este vorba, mai bine taci. mbogdanf: eu cred ca gresesti in rutina de conversie pentru afisarea lui dw t. Posibil.pentru ca la rulare imi incepe numaratoarea de pe la 300.si apoi el numara.Totusi ma gandeam ca bucla nu este buna deoarece sar putea sa nu fie bine cx .ca nu iam dat bine lungimea sirului.oricum ms mult pentru raspuns.dak mai ai vreo ideea astept

Link to comment

Procedura de impartire este gresitaimparti un numar dw(65536) la 10 ???trebuie sa faci impartiri repetateimparti cu 10000 si da un numar intre 0 si 6apoi restul imparti la 1000 -> numar intre 0 si 9si tot asa pina la ultima cifra care de fapt este ultimul rest

Link to comment

Procedura de impartire este gresitaimparti un numar dw(65536) la 10 ???trebuie sa faci impartiri repetateimparti cu 10000 si da un numar intre 0 si 6apoi restul imparti la 1000 -> numar intre 0 si 9si tot asa pina la ultima cifra care de fapt este ultimul rest

sofian, este corect si asa cum face si el:imparte la 10 si foloseste restul ca fiind prima cifra din dreapta, iar apoiimparte catul resultat la 10. prin impartiri repetate (pana cand catul este 0)rezulta numarul de afisat la drepta la stanga.
Link to comment
Guest mbogdanf

ai asa:mov sir[si],254 dar sir este db 100 + 1. hotarestete la o valoare comuna.inainte de "m:" pune mov cx,100 (sau 254)si termina programul cumva:mov ax,4c00hint 21h(inainte de "procedura proc")dak pun mov cx,100 insemana cami parcurge bucla de 100 de ori.dar dak sirul meu nu are 100 de elemente?e bine?

Link to comment

din cate vad , tu ai luat bucatele de cod din mai multe programe.daca numeri numai cifrele, este ok cu cx=100 (caracterul '$' continut initial de sir, nu este cifra)incearca sa intelegi ce face intreruperea 21h cu ah=0ah.secventa:lea bx,sirmov si,1mov cx,bx[si]este corecta pentru determinarea lungimii sirului introdus, dar nu se afla la locul ei.pune-o dupa apelul int21/ah=0ah , inainte de mov si,2 si atunci renunti la cx=100.

Link to comment
Guest mbogdanf

din cate vad , tu ai luat bucatele de cod din mai multe programe.daca numeri numai cifrele, este ok cu cx=100 (caracterul '$' continut initial de sir, nu este cifra)incearca sa intelegi ce face intreruperea 21h cu ah=0ah.secventa:lea bx,sirmov si,1mov cx,bx[si]este corecta pentru determinarea lungimii sirului introdus, dar nu se afla la locul ei.pune-o dupa apelul int21/ah=0ah , inainte de mov si,2 si atunci renunti la cx=100.da ai dreptate.procedura e din alt program si am incercat sa o folosesc.iti arat programul:.model small.data nr dw 12348 sir_nr db 6 dup(' ') ; initializare sir cu spatiu imp dw 10 ; impartitorul este 10.code ; initializare ds mov ax, dgroup mov ds, ax; terminatorul de sir este asezat pe pozitia din sir cu indicele 5 ( este ; de fapt pozitia 6 deoarece elementele sunt numerotate incepand de la 0) mov si,5 mov sir_nr[si], '$'; incepand de la indicele 4 spre 0 vor fi asezate cifrele numarului dec si ; la impartire se considera ca numarul se gaseste in DX:AX mov ax, nr mov dx,0repeta: div imp; catul impartirii este in ax, iar restul in dx.Deoarece restul nu poate ; fi mai mare de 9, putem lua in considerare numai valoarea aflata in dl. ; pentru a converti numarul aflat in al intr-o cifra de la 0 la 9,; adunam codul caracterului '0' add dl, '0' mov sir_nr[si],dl dec si mov dx,0 ; compara catul cu 0...Catul va fi egal cu 0 cand vor fi determinate ; toate cifrele numarului cmp ax,0 jne repetaafisare_nr: mov ah, 09h mov dx, offset sir_nr int 21h terminare_program: mov ah, 4ch int 21hendsi asta e programu meu de acum.model small.stack 200h.datasir db 255 dup(?),0ah,0dh,'$'sir1 db 4 dup(' ')msg db "Dati sirul:",0ah,0dh,'$'msg3 db "Litere mici=", 0ah,0dh,'$'msg4 db "Litere mari=" ,0ah,0dh,'$'msg5 db "Cifre=", 0ah,0dh,'$'msg6 db "Caractere speciale=" ,0ah,0dh,'$'x dw 0z dw 0y dw 0t dw 0imp dw 10.codemov ax,dgroupmov ds,axmov es,axmov si,0mov sir[si],255mov ah,09hmov dx,offset msgint 21hmov ah, 0ahmov dx,offset sirint 21hlea bx,sirmov si,1mov cx,bx[si]mov si,2m:cmp sir[si],48jl m1m2:cmp sir[si],57jg m1m3:inc t inc siloop mm1:cmp sir[si],65jl m4m5:cmp sir[si],90jg m4m6:inc xinc siloop m m4:cmp sir[si],97jl m7m8:cmp sir[si],122jg m7m9:inc zinc siloop mm7:inc yinc siloop m mov di,3mov sir1[di],'$'dec dimov ax,tmov dx,0call proceduramov ah,09hmov dx,offset sir1int 21hmov ah,4chint 21hprocedura procrepeta:div imp; catul impartirii este in ax, iar restul in dx.Deoarece restul nu poate ; fi mai mare de 9, putem lua in considerare numai valoarea aflata in dl.; pentru a converti numarul aflat in al intr-o cifra de la 0 la 9,; adunam codul caracterului '0'add dl, '0'mov sir1[di],dldec dimov dx,0; compara catul cu 0...Catul va fi egal cu 0 cand vor fi determinate ; toate cifrele numaruluicmp ax,0jne repetaretendpendam schimbat cate ceva.si am o intrebare.lungimea maxima a unui sir introdus de la tast cu 0ah e 255?dak e asa inseamna ca in sirul urmator o sa am maxim 3 caractere.si de aceea iam dat maxim 4,ultimul pentru terminatorul de sir.

Link to comment

Nu ai timp sa citesti prin cursuri sau sa dai un search pe google?"INT 21h / AH=0Ah - input of a string to DS:DX, fist byte is buffer size, second byte is number of chars actually read. this function does not add '$' in the end of string. to print using INT 21h / AH=9 you must set dollar character at the end of it and start printing from address DS:DX + 2"Este vorba de un sir cu lungimea reprezentata pe un byte adica maxim 255. mai ramane varianta in care poti introduce de la tastatura un sir cu lungimea negativa. asta da problema pentru alde Spiru & Comp. :)

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines