Debug
W kolejności chronologicznej.
Podseria | Odcinek | Opis |
---|---|---|
Podstawy | #1: Assembly x86, mity | - |
Podstawy | #2: Asmloader | - |
Podstawy | #3: Hell World | - |
Podstawy | #4: Where am I? | - |
Podstawy | #5: Debugger | - |
Podstawy | #6: Flagi ZF i SF, Porównania (teoria) | - |
Podstawy | #7: Flagi ZF i SF, Porównania (praktyka) | - |
Dygresja | #1: in/out i int 12h vs Linux | - |
Podstawy | #8: Flagi OF i CF | - |
Podstawy | #9: Flaga PF, rejestr EFLAGS | - |
Podstawy | #10: Jcc, SETcc, CMOVcc | - |
Dygresja | #2: Lista opkodów i Manuale Intela | - |
Dygresja | #3: Rejestry x86 | - |
Podstawy | #11: Arytmetyka unsigned | - |
Podstawy | #12: Arytmetyka signed | - |
Podstawy | #13: CDQ, MOVSX, MOVZX | - |
Podstawy | #14: Funkcje. Konwencje wywołania. | - |
Podstawy | #15: Stack frame. | - |
Podstawy | #16: Wielkość stosu | - |
Podstawy | #17: XOR AND OR NOT | - |
Podstawy | #18: LOOP i LOOPcc | - |
Podstawy | #19: BT(C/S/R), BSF/BSR | - |
Podstawy | #20: Operacje na stringach (REP/Z/NZ, MOVS/etc, STD/CLD) | - |
Podstawy | #21: NEG BSWAP RDTSC X* | - |
Podstawy | #22: UD2 CPUID | - |
Podstawy | #23: ROR ROL SHLD SHRD | - |
Podstawy | Kompilacja nasm+ld do .exe | - |
Materiały dodatkowe
Tu będą linki.
Comments:
(gdb) run d
Starting program: C:\Program Files (x86)\NASM\asmloader.exe d
[New Thread 4936.0x13e8]
Simplified Assembly Loader v.0.0.1 by gynvael.coldwind//vx
error: could not open input file
[Inferior 1 (process 4936) exited with code 02]
Zakładam, że jest to zabezpieczone, ale co by było gdyby za pomocą pushf wyciągnąć rejestr flag, następnie zmodyfikować iopl na inny tryb i wrzucic z powrotem do eflags za pomoca popf ??
Ma sens?
Sens ma!
Ale tak jak mówisz, to jest zabezpieczone :)
Na operację dane-->EFLAGS jest nakładana maska, a więc tylko niektóre bity można ustawić. To jak konkretnie popf działa zależy od tego czy Twój kod jest w ring0 (kernel-mode), czy w ring3 (user-mode). W kernel-mode popf może ustawić więcej flag.
W tomie 2gim Intel Manuals w pseudokodzie POPF jest zaznaczone które flagi można modyfikować, a które nie :)
Jeżeli mamy funkcję bez argumentow to czy mamy retn X gdzie X = 0 czy ret bez X ? Oraz w tej sytuacji czy ma znaczenie czy jest stdcall czy cdecl ?
Ponad to pytanie :
jak wywołałeś funkcję asdf po czym zdjales ze stosu stringa i za pomoca ret skoczyles pod adres call to dlaczego ten call sie nie wykonal tylko nastapil skok do exita?
Według mojego rozumowania powinno być tak, że ten printf powinien się wykonywać w nieskończoność, jednak tak się nie stało, co robi ten call w tej funkcji, że wraca do pierwszego calla? Może to ret to powoduje?
Chodzi o odcinek 14.
Co do pierwszego pytania, to ret wystarczy (retn 0 też może być, ale ret krótsze ;>).
Dla tego przypadku nie ma znaczenia czy to jest stdcall czy cdecl czy fastcall.
Mam problem ogólnie rzecz biorąc z liczbami rzeczywistymi, a konkretnie z ich wczytywanie i z powrotem wypisywaniem na ekran. Próbowałem użyć do tego funkcji printf i scanf, albo są nie odpowiednie albo nie potrafię ich w odpowiedni sposób użyć. Jak to można zrobić ?
I jeszcze jedno, czy obliczenia i działania na liczbach rzeczywistych oprócz przejścia na inne instrukcje
jak fdivp i korzystania z rejestrów stosu wymagają jakiś specjalnych deklaracji w kodzie czy czegoś innego ?
Add a comment: