Šta je novo?

2 Asembler problema + 1 pitanje

The pocetnik

Čuven
Učlanjen(a)
05.12.2000
Poruke
1,741
Poena
649
1.Zasto se desava da kada neku pozovem proceduru posle ispisa da mi ne ispise sve sto bi trebalo, a ako je stavim ispred onda ne ispise nista:

Primer:

Kod:
.model small
.stack
.data
CR equ 13 
LF equ 10
Meni1 db CR,LF,"Poruka1$"
Meni2 db CR,LF,"Poruka2$"

.code
mov ax,@data 
mov ds,ax

Inic PROC
    ret
Inic ENDP

mov dx,OFFSET Meni1
mov ah,9 
int 21h 
mov dx,OFFSET Meni2
mov ah,9 
int 21h 
call Inic  
mov ah,4Ch
int 21h
end

Ako ovo call Inic stavim ili ispred ispisa poruka ili na samom pocetku koda meni se ove poruke ne ispisuju uopste, dok kada se stavi gde sada stoji ispisuje recimo prvu poruku dobro, dok drugu ispise do pola.

2.Zasto ne radi uopste sa nizovima kako treba.
Recimo imam sledeci deo koda:

Kod:
.data
ut1t word 11 dup (?)
ut1 dw 0

.code
mov si,1
mov ut1,1
mov ut1t[si],1
mov ax,1
cmp ax,ut1t[si]
jz skoci

E pa on nikada ne skace, tj. compare kao da ne radi, probao sam i oduzimanje pa da tako dobijem nulu, ali ni to ne pomaze.Pokusao sam da ut1t[si] stavljam u bx pa da vrsim cmp, ali ni to ne radi.

A pitanje je kako da na izlazu ispise vrednost int promenjive.
Znaci imam a koja ima vrednost recimo 23 i koju komandu da upotrebim da bi izbacio bas 23.

Recimo ako ima a=1 tada mi ovaj deo koda izbacuje:
Kod:
mov al,1
mov bl,al
mov dx,al
mov ah,02h
int 21h
I izbacuje ascii karakter sa rednim brojem 1, anigde nisam nasao da izbaci bas broj kao vrednost, a ne karakter.
 
Poslednja izmena:
1. probaj ovako

Kod:
.model small
.stack
.data
CR equ 13 
LF equ 10
Meni1 db CR,LF,"Poruka1$"
Meni2 db CR,LF,"Poruka2$"

.code
mov ax,@data 
mov ds,ax



mov dx,OFFSET Meni1
mov ah,9 
int 21h 
mov dx,OFFSET Meni2
mov ah,9 
int 21h 
call Inic  
mov ah,4Ch
int 21h
end[B][COLOR="Red"]s[/COLOR][/B]
[B][COLOR="Red"]Inic PROC
    ret
Inic ENDP[/COLOR][/B]

2.
Kod:
.data
ut1t [B][COLOR="Red"]dw[/COLOR][/B] 11 dup (?)
ut1 dw 0

.code
[B][COLOR="Red"]skoci:[/COLOR][/B] mov si,1
mov ut1,1
mov ut1t[si],1
mov ax,1
cmp ax,ut1t[si]
jz skoci

3.

da bi izbacio broj moras upisati ascii kod broja a on je od 48 (0) - 57(9) tako da ti je najlakse da dodas add al,48 nakon sto napunis vrednost koju zelis u al

toplo ti preporucujem da nadjesh emu8086 i da u njemu radis jer imas veoma koristan dibager

pozdrav
 
Hvala, probacu ovo prvo, ovo drugo sam i ranije probao i ne radi tj cmp ne izbacuje 0.
Dok za trece sam znao da moze ovako ako je broj jednocifren, ali ako je dvocifren jedino mi ostaje izdvajanje cifara i pojedinacan njihov ispis, a mislio sam da postoji neka procedura koja ce to da odradi za mene.
 
Nazalost ni prvo resenje ne radi, tj. ne prepoznaje komandu ends, ali ako ga stavim ispod end onda naravno da ne vidi proceduru i ne moze da je pozove.

Nego za drugi problem sam provalio sledece, da kao inicijalizujem jedan clan niza pre poziva procedure onda procedura ispis koja radi sa nizom radi ok, ali ako inicijalizujem makar 2 clana niza onda ispis ne radi uopste.
Znaci, ovo radi:
Kod:
.data
ut1t dw 12 dup (?)
ut1 dw 0

.code
Ispis PROC
;Radi sa ut1t i vrsi cmp
ret
Ispis ENDP

mov si,1
mov ut1,3
mov ut1t[si],1
call Ispis

Dok recimo ovo ne radi:
Kod:
.data
ut1t dw 12 dup (?)
ut1 dw 0

.code
Ispis PROC
;Radi sa ut1t i vrsi cmp
ret
Ispis ENDP

mov si,1
mov ut1,3
mov ut1t[si],1
mov si,2
mov ut1t[si],3
call Ispis

Mislim on pozove proceduru, ali kada naidje na cmp gde u zavisnosti od vrednosti treba da ispise razlicite poruke ona ne radi posao.Sama procedura radi, jer ako radi testa umesto cmp sa ut1t uradim cmp sa njihov znanim vrednostima sve radi odlicno.
 
Poslednja izmena:
Pronasao sam resenje za drugi problem:

Problem je bio u 2 stvari, a to je da posto su promenjive word si u svakoj petlji sam trebalo da uvelicavam za 2 iako sam mislio da ce to kompajler da automatski kada inc si da inkrementira adresu za 2.Problem sam resio sto sam umesto dw koristio db tj. bajtovske promenjive i sada radi kako treba.Druga stvar je bio AVG antivirus koji je povremeno zabranjivao pravljenje exe-a(nekad je obavestavao porukom, a nekada ne) i samim tim kada sam ispravio program ustvari startovao sam stariju verziju i nervirao se sto ne radi, kada me je eto avg z*zao.

Dobio sam jos neke savete kako da resim prvi problem, pa su ih isprobati i javicu koji mi je resio problem.
 
Poslednja izmena:
da, videh tvoje pitanje na mips listi 🙂
puno srece sa projektom...
 
Hvala, uspesno sam zavrsio kod, samo da ga jos malo ulepsam i da napisem dokumentaciju isl...
 
Nazad
Vrh Dno