Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Misterija u kodu :)

[es] :: Asembler :: Misterija u kodu :)

[ Pregleda: 4183 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

--SOULMaTe--
Nemanja Skoric
Novi Sad

Član broj: 1464
Poruke: 173
*.nat-pool.nsad.sbb.co.yu.



Profil

icon Misterija u kodu :)14.04.2005. u 01:29 - pre 230 meseci
Pozdrav! DA odmah predjem na stvar...
Dakle problem je sto kad program izadje iz SQUARE procedure on se ne vrati na mesto gde je nacinjen call nego krene iz pocetka. E sad kada nisam baratao sa stackom nego kad sam davao proceduri argument preko promenljive sve je radilo, al hocu da proradi i ovako. Pratio sam i sadrzaj IP registra on se posle izvrsenja SQUARE procedure odjednom postavi na nulu i program krene iz pocetka da se izvrsava.
U cemu je stvar?

Evo i koda...

Code:

SSEG SEGMENT STACK
   db 1000h dup (?)
SSEG ENDS

DSEG SEGMENT
   x dw ?
   c db ?
   c2 db ?
   br dw ?
   rez dw ?
   cnt dw ?
DSEG ENDs

CSEG SEGMENT

MAINPROG PROC NEAR
   assume cs:CSEG,ds:DSEG, ss:SSEG, es:NOTHING
   mov ax,DSEG
   mov ds,ax   
   call DatIn
   sub sp,2
   call SQUARE
   pop ax
   mov br,2
   mul br
   sub ax,x
   mov rez,ax
   inc rez
   
   ;new line
   mov dx,10
   mov ah,02h
   int 21h
   
   ;carriage return
   mov dx,13
   mov ah,02h
   int 21h
   
   push rez
   call solve
   add sp,2
   mov ah,4ch
   int 21h
   ret
MAINPROG ENDP

DATIN PROC NEAR
 mov br,0
 mov ax,0
 start:
    add br,ax
   mov ax, br
   mov br,10
   mul br ;domnozavanje br-a
   mov br,ax

     mov ah,01h
     int 21h 
     
     mov c,al
     mov c2,al
     mov ax,0
     sub c,48 ;konvertovanje iz char u int
     
     mov ah,0
     mov al,c
     cmp c2,13
 jnz start
 mov ax,br
 mov br,10
 mov dx,0
 div br
 mov br,ax
 push br
 add sp,2
 ret
DATIN ENDP

SOLVE PROC NEAR
 pop br
   mov cnt,0
   Pocetak:
      mov ax,br
      mov dx,0
      mov br,10
      div br
      mov br,ax
      add dx,48
      inc cnt
      push dx
      cmp br,0
      jnz Pocetak
   mov cx,cnt
   Ciklus:
      pop dx
      mov ah,02h
      int 21h
   loop Ciklus
  sub sp,2
  ret
SOLVE ENDP

SQUARE PROC NEAR
 pop ax
 mul x
 push ax
 ret
SQUARE ENDP

CSEG ENDS

END MAINPROG 

Don’t do drugs, sleep deprivation is better.
 
Odgovor na temu

obranko
severna amerika

Član broj: 36599
Poruke: 152
*.cpe.net.cable.rogers.com.



+1 Profil

icon Re: Misterija u kodu :)14.04.2005. u 02:03 - pre 230 meseci
Odavno nisam radio x86 asembler ali da pokusam. U proceduri SQUARE imas pop x znaci povratnu adresu stavljas u ax. Zatim imax mul x koji izvrsi mnozenje i rezultat smesti u ax. Zatim taj rezultat vratis na vrh stack-a (a to ti je povratna adresa).
 
Odgovor na temu

--SOULMaTe--
Nemanja Skoric
Novi Sad

Član broj: 1464
Poruke: 173
*.nat-pool.nsad.sbb.co.yu.



Profil

icon Re: Misterija u kodu :)14.04.2005. u 07:03 - pre 230 meseci
Inace za sve nisam napomenuo da je ovo pocetnicki program koji racuna 2*x*x - x + 1

@obranko
Ako mi je ova tvoja poruka trebala nekako pomoci, onda te molim da budes malo jasniji.
Don’t do drugs, sleep deprivation is better.
 
Odgovor na temu

RooTeR
Rajko Nenadov
nema ga
Detelinara, NS

Član broj: 2386
Poruke: 385
*.neobee.net.



Profil

icon Re: Misterija u kodu :)14.04.2005. u 11:11 - pre 230 meseci
Chovek je hteo da kaze ovo :

Code:

square proc
   pop ax
   mov bx,ax
   .
   .
   .
   mov bx,ax ; moze i odma push bx
   push ax
   ret
square endp



Probaj pa javi ... :)
mmmmmm.. aahhhhhh..
e, nije sex nego serem!
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
194.106.165.*



+1 Profil

icon Re: Misterija u kodu :)14.04.2005. u 12:12 - pre 230 meseci
Code:

 pop ax
 mul x
 push ax
 ret


Pa on ti je pomogao, odma ti je ukazao na problem.
Prvo ta ce ti
pop ax
mul x
push ax
ret

Procedura je losa, da ne kazem ocajna.
Ili predaj vrednost preko ax registra ili preko stacka. A kad predajes preko stacka
onda moras da koristis sp registar da im pristupis.
Sve u svemu ceo tvoj kod moze da se lepo napise i da radi koristeci "__fastcall":

Drugim recima :

Code:

mov    ax, neki_broj
call     SQUARE
...

square:
          mul x
          ret

 
Odgovor na temu

--SOULMaTe--
Nemanja Skoric
Novi Sad

Član broj: 1464
Poruke: 173
*.nat-pool.nsad.sbb.co.yu.



Profil

icon Re: Misterija u kodu :)14.04.2005. u 13:02 - pre 230 meseci
@Vojislav Ja sam i napisao da mi program radi kad ne prosledjujem preko stacka sto znaci da sam vec napisao program tipa ovog tvog
Code:

mov    ax, neki_broj
call     SQUARE
...

square:
          mul x
          ret

ali sam sad zeleo da to uradim i sa stackom, ocigledno na pogresan nacin.


@obranko A na stvarnoj pomoci hvala obranku ciju sam poruku sad shvatio. :)
Don’t do drugs, sleep deprivation is better.
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.beotel.net.



+1 Profil

icon Re: Misterija u kodu :)14.04.2005. u 14:51 - pre 230 meseci
Pa onda lepo uzmeš i predaš preko steka ->
Code:


SQuar:
       mov   ax, [sp+2]      ;preskoci EIP
       mul     x
       ret


ax ce ti po izlasku imati vrednost, a program nece pasti...
 
Odgovor na temu

--SOULMaTe--
Nemanja Skoric
Novi Sad

Član broj: 1464
Poruke: 173
*.nat-pool.nsad.sbb.co.yu.



Profil

icon Re: Misterija u kodu :)14.04.2005. u 18:14 - pre 230 meseci
Skontao sam. Hvala svima u svakom slucaju.
Don’t do drugs, sleep deprivation is better.
 
Odgovor na temu

--SOULMaTe--
Nemanja Skoric
Novi Sad

Član broj: 1464
Poruke: 173
*.nat-pool.nsad.sbb.co.yu.



Profil

icon Re: Misterija u kodu :)14.04.2005. u 18:59 - pre 230 meseci
kompajler mi ne dozvoljava da tako dodelim vrednost ax: mov ax,[sp+2]

Evo sta dobijam: **Error** funk.ASM(103) Illegal indexing mode

btw. U pitanju je TASM
Don’t do drugs, sleep deprivation is better.
 
Odgovor na temu

--SOULMaTe--
Nemanja Skoric
Novi Sad

Član broj: 1464
Poruke: 173
*.nat-pool.nsad.sbb.co.yu.



Profil

icon Re: Misterija u kodu :)14.04.2005. u 19:10 - pre 230 meseci
evo sredih ovako

Code:

SQUARE
       push bp
       mov bp,sp
       mov   ax, [bp+4]
       mul     x
       pop bp
       ret



Don’t do drugs, sleep deprivation is better.
 
Odgovor na temu

Vojislav Milunovic

Član broj: 25
Poruke: 2117
*.beotel.net.



+1 Profil

icon Re: Misterija u kodu :)14.04.2005. u 19:40 - pre 230 meseci
Moguce da x86 ne dozvoljava indexiranje preko sp :)
Ali eto sa prologom radi lepo, inace svi programi pisani u C ili kom drugom HL koriste upravo taj rad ->
prolog
Code:

push ebp
mov  ebp, esp


eiplog
Code:

mov esp, ebp
pop  ebp


moj savet predji na i386 asm, jer ovo sto koristis je davno izumrelo :)
 
Odgovor na temu

[es] :: Asembler :: Misterija u kodu :)

[ Pregleda: 4183 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.