Skocz do zawartości

[Assembler]Program nie działa jak powinien.


Override

Polecane posty

Napisałem taki program w assemblerze:

 

org 100h

start:
       mov ebx, 0
       push ebx
       mov ah, 0eh
licz_i_pisz:
       mov [bufor + ebx], ebx
       mov al, [bufor + ebx]
       int 10h
       inc ebx
       cmp ebx, 100
       jb licz_i_pisz

       pop ebx
       ret
       mov ax, 4c00h
       int 21h

       bufor: times 101 db 0

 

Program miał za zadanie wypisać liczby od 0 do 100.

Działa program, ale nie tak jak powinien.

Zamiast wypisywać mi liczby, wypisuje coś takiego:

Obrazek

Używam kompilatora NASM

Link do komentarza
Udostępnij na innych stronach

  • 1 month later...

ale co chcesz zrobić z tym adresem ???

Aktualnie piszę 32 bitowy system operacyjny.

ASE2.0 100% ,DME (Dynamic Motion Engine) v2.0 10% ,32 bit PumaOS - 40%

Stick's Adventure 3 - 0%

Komp nr.1 AMD Duron 1,3 Ghz ,256 MB Ram DDR PC133 (na eBoostr mam jeszcze 1 GB) ,Nvidia GeForce FX 5500 256MB DDR

Komp nr.2 (laptop) AMD Athlon XP 2,0 Ghz , 192 MB Ram DDR PC2700 (na eBoostr mam jeszcze 3 GB) , Via S3 Unichrome IGP

Przykład programu w ASE2.0:

<?arg #CreateProcs; $i:?;

#For('$i,10,1,@Lab');@Lab;

#Sleep(100);

#Message("Ten komputer ulegnie autodestrukcji za $i sekund");

#Retf;

#Message('Dead'); arg?>

Link do komentarza
Udostępnij na innych stronach

:)

Aby skorzystać z funkcji napisanej DLL :) w Assemblerze to

na końcu pliku importujesz (tu akurat przykład FASM'a) co chcesz w odpowiedniej do tego typu sekcji '.idata' :

 section '.idata' import data readable writeable
library MojeDLL,'MyDLL.DLL'

import MojeDLL,\
FunkcjaZDLL,'FunctionFromDLL'
ż-lvęgy+s7Ęxv,Ź\"zx{-(Ź[bQ[V

To zero na końcu to parametr funkcji (parametry oddzielasz przecinkami)

 

Nie wiem jak jest w NASM :) ale polecam forum www.Osdev.pl

Są tam tacy ludzie, co Assemblera mają mocno opanowanego. :)

Prawdziwy programista wiesza sie wraz ze swoim programem.

Link do komentarza
Udostępnij na innych stronach

  • 3 months later...
  • 2 months later...

Czy może wie ktoś dlaczego w

add sp, 12 �ż�.7Ź]�g    push [p3]     ; Umieść na stosie trzeci parametr 
   push [p2]     ; Następnie drugi 
   push [p1]     ; I pierwszy 
   call foo 
   add  sp, 12   ; Usuń ze stosu parametry po wywołaniu funkcji

 

Asembler dla Windows - Podstawy

 

 

Wrzucasz na stos 3 parametry, kazdy z nich zajmuje 4 bajty, więc po wykonaniu procedury foo, należy przywrócić stan wskaźnika stosu na taki jaki był przed wykonaniem procedury. Czemu add a nie sub? bo stos jest adresowany w dół.

Link do komentarza
Udostępnij na innych stronach

  • 6 months later...

Napisałem taki program w assemblerze:

 

org 100h

start:
       mov ebx, 0
       push ebx
       mov ah, 0eh
licz_i_pisz:
       mov [bufor + ebx], ebx
       mov al, [bufor + ebx]
       int 10h
       inc ebx
       cmp ebx, 100
       jb licz_i_pisz

       pop ebx
       ret
       mov ax, 4c00h
       int 21h

       bufor: times 101 db 0

 

Program miał za zadanie wypisać liczby od 0 do 100.

Działa program, ale nie tak jak powinien.

Zamiast wypisywać mi liczby, wypisuje coś takiego:

Obrazek

Używam kompilatora NASM

 

 

 

 

no i program działa dobrze...

zwiększasz ebx - czyli 1 bajt (znak) - a chcesz zeby wyświetlił np. 99

w tym programie wyświetlasz po kolei kody znaków od 1 do 100

 

zeby wyświetlić po kolei muszisz zarezerwować 3 znaki (setki dziesiątki i jedności)

 

np tak

 

mov bh,0 - 100

mov bl,0 - 10

mov ch,1 -1

 

xxx:

mov dl,30h

add dl,bh

mov ah,2

int 21h

- setki

mov dl,30h

add dl,bl

mov ah,2

int 21h

- dziesiątki

mov dl,30h

add dl,ch

mov ah,2

int 21h

- tu pewnie powinno być jeszcze mov dl,0ah ; mov ah,2 ; int 21h mov dl,0dh ; mov ah,2 ; int 21h

 

-no i teraz pętle

inc cl -zwiększenie jedności

cmp cl,0ah

jnz xxx -skok do początku jeśli nie ma zwiększenia dziesiątek

mov cl,0

inc bl -zwiększenie jedności

cmp bl,0

jnz xxx -skok jeśli nie ma zwiększenia setek

; jeśli jest zwiększenie setek to znaczy...

 

mov dl,31h

mov ah,2

int 21h

mov dl,30h

mov ah,2

int 21h

mov dl,30h

mov ah,2

int 21h

 

-i tu wychodzisz... jak chcesz np.

mov ax,4c00h

int 21h

Link do komentarza
Udostępnij na innych stronach

Dzięki za wszystko, ale ta odpowiedź nadeszła zbyt późno. Za ten czas zdążyłem się nauczyć assemblera na dość wysokim poziomie, i wole nim zastąpić c++, z paru względów. Jednym jest to że mam większą kontrolę nad programem, nad jego wydajnością. Drugi za to, że nie muszę dbać o rodzaj zmiennej, tylko o rozmiar. A z koro już piszę, to zapytam się, dlaczego jak napisałem w assemblerze taki program, wykorzystując funkcję z bibliotek SDL LoadBMP, to podczas niej mi się program wysadzał, znaczy nie pokazywał to, co powinien, mignęło tylko okienko, a gdy sprawdziłem w GDB, to mi wskazało tę funkcję. Ten sam program w C++ działał, a błędów nie zrobiłem.

_main:
       ;SDL_Init()
       push dword SDL_INIT_EVERYTHING
       call SDL_Init
       add esp, 4

       ;SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE)
       push dword SDL_SWSURFACE
       push dword 32
       push dword 480
       push dword 640
       call SDL_SetVideoMode
       add esp, 4*4
       mov dword [ekran], eax

       ;SDL_LoadBMP("cb.bmp")
       push dword img
       call SDL_LoadBMP
       add esp, 4
       mov dword [obraz], eax

       ;SDL_BlitSurface(obraz,NULL,ekran,NULL)
       push dword 0
       push dword ekran
       push dword 0
       push dword obraz
       call SDL_BlitSurface
       add esp, 4*4

       ;SDL_Flip(ekran)
       push dword ekran
       call SDL_Flip
       add esp, 4

       ;SDL_Delay(2000)
       push dword 2000
       call SDL_Delay
       add esp, 4

       ;SDL_Quit
       call _SDL_Quit
       xor eax, eax
       ret

 

Kompilator: yasm, g++

Linker: g++

OS: Win32 (vista)

 

Próbowałem także z linkować za pomocą linkera Microsoft, ale jakiś błąd występował, w którym chciał abym wyeksportował jakąś funkcję

Kod oczywiście wymagał paru przeróbek, które wykonałem.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...