Lekcja Assemblera 4

in #polish7 years ago (edited)

Lekcja 4.



Img 1. obrazek dla wyglądu

Środowisko uruchomieniowe.

Odpalimy sobie przykładowy program, i to będzie w zasadzie tyle. Po pierwsze potrzebujesz komputer z Linuxem.
I tu pierwszy problem też, linux ma tendencje do odpalania na KURWA WSZYSTKIM więc upewnij się że twój komputer ma procesor zgodny z Intel Pentium, a najlepiej by był w architekturze AMD64 (NIE I64 BO TO INTEL ITANIUM O KTÓRYM NIE BĘDZIEMY MÓWIĆ)

NIE BĘDĄ SIĘ NADAWAĆ:

  • wszystkie dziwne terminale (nie każdy miał intela)
  • Mega stare PC bo może i owszem będziemy potrzebować i386 z koprocesorem 8087 ale to tylko na początek
  • RassberyPi i wszystkie jego klony (tu mamy architekturę ARM o której będzie potem)
  • Arduino (TAK JEST DA SIĘ NA TYM INTO LINUX XD) tu procek to AVR
  • Serwery Sun, tu bardzo ciekawe procesory SPARC
  • MainFrame od IBM tu mamy PowerPC
  • Amigi PowerPC/Motorolla
  • Stare Apple też się nie nada bo miały kolejno Motorolle a potem PowerPC i dopiero tak od 2008? Intel
  • Wszystko inne czego nie wymieniałem a nie jest zgodne z x86 albo AMD64

Jak nie mamy linuxa na PC dobrym pomysłem będzie zastosowanie maszyny wirtualnej. IMO 512MB ramu spokojnie starczy do śmieszkowania w trybie tekstowym a graficznego i tak nie potrzebujesz kolejną zaletą maszyny wirtualnej nad fizycznym PC jest to że wygodniej dać takiemu dysk (będziemy tego potrzebować).Jeśli nie jesteś pewien czy twój procesor jest odpowiedni daj mi wyjście polecenia
lscpu
ale w skrócie wszystko co odpala windowsa desktopowego się nada.
Tak więc masz już PC.
teraz zainstaluj na tym linuxa. Jak to zrobić pisały już tłumy ludzi. Następnie na tym linuxie proponuje zainstalować i skonfigurować SSH, bo tak będzie nam wygodniej na nim pracować przy pomocy putty.exe z windowsa albo ssh z linuxa.
Na tak przygotowanym systemie potrzebujemy jeszcze troszkę oprogramowania.

nasm -> interpreter asemblera
gcc -> kompilator C ale bardzo wygodny do linkowania (co to jest potem)
vi/emasc/nano/pico -> jedno z tych jako nasz edytor tekstu ?
make -> do budowania programów, wygodnej niż klepać z palca
gdb -> debugger, pozwoli wykonywać nasz program krok po kroku.
tmux-> takie magiczne coś do robienia "okien" w trybie tekstowym.

programy te w linuxie zasadniczo instaluje się menadżerem pakietów. Dla wszystkich klonów debiana starczy wykonać z prawami roota

apt-get install nasm gcc vi nano make gdb tmux

teraz zrób sobie katalog do śmieszkowania

mkdir lekcja4

i przejdź tam
cd lekcja4

teraz odpalić można tmuxa ctrl+b % dzieli nam w pionie
ctrl+b " w poziomie
ctrl+b <strzałka> przejście z okna do okna
ctrl+b alt+<strzałka> zmiana rozmiaru okna
po więcej szczegółów zachęcam do man tmux
Teraz przy pomocy edytora tekstu przepisz ten kod, jest to o tyle ważne że pozwoli Ci to lepiej zrozumieć co się dzieje

 ;  hello.asm  nasz pierwszy program w assemblerze :D
 ; znak ; znaczy początek komentarza


        SECTION .data           ; Sekcja danych
msg:    db "Michchal bialek",10,"nie ma jajek",10     ; zdefiniowaliśmy właśnie kilka bajtów (db znaczy define byte)
len:    equ $-msg               ; equ $-msg jest ciekawie $ to licznik lokacji i patrzy jak daleko W CZASIE assemblacji dotarliśmy
                                ; equ wpisuję tą wartość na sztywno w to miejce gdzie leży więc 
                                ; każde wystąpienie napisu len w kodzie w czasie assemblacji zostanie zastąpione na policzoną wartosć

        SECTION .text           ; sekcja kodu i to w niej będziemy klepać kod
        global main             ; etykieta main staje się globalna, a że linker myśli że linkuje kod z C to zacznie wykonanie własnie od tej etykiety
main:                           ; POCZĄTEK  KODU WYKONA SIĘ WSZYSTKO ZA NIM
                                ; konwencja wywoałań funkcji systemowych w linuxie jest taka że w odpowienie rejestry wkłada się            odpowiednie dane
                                ; aby wykonać zapisać na ekran należy
        mov     edx,len         ; w ostatnim argumencie podajemy jak długi ma być to string
        mov     ecx,msg         ; w przedostatnim (2) podajemy adres tego stringa
        mov     ebx,1           ; argument pierwszy to informacja dla funkcji write gdzie ma pisać 1-> na standardowe wyjście (ekran)
        mov     eax,4           ; funkcja write ma numer 4 więc podajemy go do znowu odpowiedniego rejestru
        int     0x80            ; przy pomocy przerwania 0x80 wołamy krenel by zrobił robotę. Nie ma praktycznie innej drogi do wykonania funkcji systemowej niż właśnie callgate.
                                ; do tego miejsca napisaliśmy write(1,msg,len);
                                ; z dokładnie tą samą logiką powstanie return 0;
        mov     ebx,0           ; kod wyjścia, można niby dowolny, ale jak jest OK zwraca się 0
        mov     eax,1           ; exit czyli polecenie zwalniające program ma kod 1 
        int     0x80            ; wołamy krenel i myk program jest usuwany z pamięci

; na koniec o rozkazach z tego pliku
; mov <cel>, <źródło>  ; przenosi ze źródła do celu  to jest jasne, należy wiedzieć że nie zawsze rozmiary argumentów są dla niego jasne więc trzeba uprecyzawiać. Jedyne czego nie możesz zrobić to mov <adres_Pamięci>,<adres_pamięci> resztę można spokojnie zrobić.
; proponuje pobawić się z tym a jak działa MOV będzie osobno
; int to udawanie przerwania o odpowienich parametrach`

Ja jako chory pojeb użyje vima

vim hello.S

ważne jest rozszerzenie .S które oznacza assemblera, de fakto linux ma w to wyjebane ale reszta naszej konfiguracji na tym opierać się będzie następnie trzeba wyjaśnić linuxowi jak zbudować ten plik do pliku Makefile (koniecnie z wielkiej litery):

all : hello
hello : hello.o
    gcc -o hello hello.o
hello.o : hello.s
    nasm -f elf  -l hello.lst hello.s -o hello.o

że w sumie nie wiem jak się robi komentarze w Makefile opiszę tu:
aby uzyskać {cel} spełń wszystkie {wymagania} i następnie wykonaj {polecenie}

{cel}:{wymagania} {wymagania}
{tab}{polecenie}
{tab}{polecenie}
{cel}:{wymagania} ....

Więc aby mieć gotowy program trzeba zlinkować plik obiektowy .o aby zlinkować plik .o trzeba go mieć a wykonuje się go procesie assemblacji pliku .S a jak uzyskać plik .S ? no trzeba go napisać
w taki przygotowanym środowisku wydaj polecenie

make

i wreszcie odpalmy nasz program
./hello

tadam właśnie wykonałeś swój pierwszy program w assemlerze
Szczegółami "co się odjebało i jak badać co się odjebuje " zajmiemy się w następnej lekcji.
jeśli jednak nie możesz spać odpal man gdb i gdb hello Ja natomiast zostawiam Cię z zadaniem domowym:
Przerób zadany program tak by wyświetlił zamiast Michal Bialek twoją ksywkę
Oraz spróbuj bez przerabiania napisu msg wyświetlić tylko twoją ksywkę (czy tam Michal Bialek)
NO I WIADOMKA ZAPRASZAM DO ZADAWANIA PYTAŃ
=============================================================
na koniec linkuje dość ciekawą dyskusję z mirkobloga
https://www.wykop.pl/wpis/22041159/no-to-lecimy-z-tematem-wytrzeszczoweasemblery-tego/

Sort:  

Spoko, ale nie musisz przeklinać :P I popraw formatowanie

masz na myśli takie entery z dupy czy jeszcze co inne.
W sumie nie wiem dlaczego ta lekcja ma taki język

Tak, te entery i te inne :P

jakie te te inne?
moje pojęcie estetyki nie umie tego zrozumieć

Zamiast linii możesz dać tag hr

Możesz dawać większe odstępy moim zdaniem

Coin Marketplace

STEEM 0.17
TRX 0.16
JST 0.031
BTC 61904.94
ETH 2583.24
USDT 1.00
SBD 2.57