• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja powoduje crasha programu

Object Storage Arubacloud
0 głosów
239 wizyt
pytanie zadane 7 października 2016 w Assembler przez Avernis Nałogowiec (27,400 p.)

Cześć. Stworzyłem taką własną funkcję w assembly, za pomocą kompilatora NASM

[bits 32]

call func
call[ebx]

global func
func:
    call write3 ; skaczemy do write i na stos wrzucamy     db  'Hello World', 0xa, 0
    db  'Hello World', 0xa, 0 ; Hello World, '\n', konic stringu
    write3:
    call [ebx + 3 * 4] ;printf
    add esp, 4

 

Ale po dojściu do funkcji program crashuje. Crashuje całkiem normalnie, "program przestał działać" itd. Przy okazji warto by było dodać zakładkę kodu pod assembly

1 odpowiedź

+1 głos
odpowiedź 7 października 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)
wybrane 7 października 2016 przez Avernis
 
Najlepsza

Widzę, że korzystasz z kursów Gynvaela i jego asmloadera (chociaż tego nie wspomniałeś, a to może być istotne).

  1. Jak odpalasz program? Poprzez asmloader, czy bezpośrednio?
  2. Dlaczego dane są gdzieś pomiędzy liniami kodu? To może być niebezpieczne, gdyż wskaźnik instrukcji może wejść w dane, i mogą zacząć wykonywać się dziwne cuda (zdeasembluj sobie swój program i zobaczysz tę magię :D)
komentarz 7 października 2016 przez Avernis Nałogowiec (27,400 p.)
poprzez asmloadera

Jak to pomiędzy liniami kodu?
komentarz 7 października 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Z tego co widzę, to zapomniałeś o instrukcji ret na końcu tej "funkcji". Jeśli chcesz, aby funkcja po wykonaniu powróciła w miejsce wywołania, powinieneś użyć tej instrukcji.

komentarz 7 października 2016 przez Avernis Nałogowiec (27,400 p.)
A wiesz może jak zrobić funkcje z argumentami?
komentarz 7 października 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Zgodnie z konwencją cdecl, parametry wrzucasz na stos (w odwrotnej kolejności). Wartość zwracaną po prostu możesz umieścić w rejestrze akumulatora.
komentarz 7 października 2016 przez Avernis Nałogowiec (27,400 p.)
A mógłbym prosić o jakiś pseudokod?
komentarz 7 października 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Tak, https://gist.github.com/qwercik/9cc4b8698b6ebd7965caa70f6943d035 Mam nadzieję że kodzik działa, ale może nie działać, bo robiłem to na szybko i bez sprawdzenia ;)
komentarz 7 października 2016 przez Avernis Nałogowiec (27,400 p.)
A nie da się tego jakoś tak zrobić podobnie jak w np. c? Przecież np. funkcja add przyjmuje 2 parametry: rejestr, i ilość
1
komentarz 7 października 2016 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Podstawowa sprawa: add to nie jest żadna funkcja, tylko instrukcja procesora. Także nie stworzysz czegoś takiego samemu na pewno (Chyba że specjalnie w tym celu zdefiniujesz własną architekturę i napiszesz do niej emulator i asembler ;D).

Pamiętaj, że etykiety np. funkcja: nie mają nic wspólnego z architekturą procesora, są to tylko wartości, w miejsce których wstawiany jest offset miejsca oznaczonego tą etykietą względem początku pliku.

Czy da się tak jak w C - nie mam pojęcia. Nie jest to zdefiniowane w architekturze (podobnie jak wyżej wymienione etykiety), gdyż to tylko ułatwienie dla programisty - po asemblacji (tłumaczeniu kodu języka asemblera na kod maszynowy) nie ma po nich śladu. Być może niektóre asemblery (programy dokonujące asemblacji) posiadają taką możliwość, ale z tego co wiem to NASM którego używasz (i ja także) nie posiada takiego rozwiązania. Zainteresuj się HLA (High Level Assembler). Z tego co wiem, to on właśnie posiada takie wysokopoziomowe rozwiązania jak ify, pętle itd. Aczkolwiek w moim mniemaniu to już nie jest prawdziwe programowanie w języku asemblera.

komentarz 8 października 2016 przez Avernis Nałogowiec (27,400 p.)
W moim też nie jest to prawdziwy assembler, i dlatego go nie chcę

Podobne pytania

+1 głos
1 odpowiedź 147 wizyt
pytanie zadane 3 czerwca 2020 w Assembler przez niezalogowany
0 głosów
1 odpowiedź 169 wizyt
pytanie zadane 7 września 2015 w C i C++ przez patryk16 Obywatel (1,080 p.)
0 głosów
1 odpowiedź 524 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...