Override Napisano Lipiec 3, 2009 Zgłoś Share Napisano Lipiec 3, 2009 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: Używam kompilatora NASM Link do komentarza Udostępnij na innych stronach More sharing options...
Blind Napisano Lipiec 3, 2009 Zgłoś Share Napisano Lipiec 3, 2009 Bo wpisujesz do buffora ekranowego liczby które w ASCII tak właśnie wyglądają. Musisz najpierw zamienić liczbe na odpowiadający jej ciag ASCII i dopiero to wypisywac na ekranie. www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
Override Napisano Sierpień 24, 2009 Autor Zgłoś Share Napisano Sierpień 24, 2009 Czy wie ktoś jak pobrać adres zmiennej w assemblerze dla kompilatorów NASM? Link do komentarza Udostępnij na innych stronach More sharing options...
Dexarz Napisano Sierpień 24, 2009 Zgłoś Share Napisano Sierpień 24, 2009 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 More sharing options...
Override Napisano Sierpień 24, 2009 Autor Zgłoś Share Napisano Sierpień 24, 2009 Chcę sprawdzić strukturę pliku, sprawdzić jak działa disassembler, zapisać do pliku, napisać wirusa, itd. Link do komentarza Udostępnij na innych stronach More sharing options...
Override Napisano Sierpień 24, 2009 Autor Zgłoś Share Napisano Sierpień 24, 2009 A tak z innej beczki. Wie może ktoś jak używać bibliotek lib z c++ pod assemblerem i z assemblera pod c++? W szczególności z c++ pod assemblerem. Link do komentarza Udostępnij na innych stronach More sharing options...
DevPort Napisano Sierpień 24, 2009 Zgłoś Share Napisano Sierpień 24, 2009 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 More sharing options...
Override Napisano Grudzień 11, 2009 Autor Zgłoś Share Napisano Grudzień 11, 2009 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 Link do komentarza Udostępnij na innych stronach More sharing options...
Budrys Napisano Luty 16, 2010 Zgłoś Share Napisano Luty 16, 2010 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 More sharing options...
redsx Napisano Sierpień 27, 2010 Zgłoś Share Napisano Sierpień 27, 2010 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: 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 More sharing options...
Override Napisano Sierpień 27, 2010 Autor Zgłoś Share Napisano Sierpień 27, 2010 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 More sharing options...
Toster Napisano Sierpień 27, 2010 Zgłoś Share Napisano Sierpień 27, 2010 sprawdz konwencje wywolania funkcji do ktorej sie odwolujesz. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.