Jump to content
xTremeSurfer

ASM ! IA 32 ! Basic shit !

Recommended Posts

Tocmai ce am invatat si eu putin ASM pe la facultate si m-am gandit sa scriu un mic tutorial (basic shit in asm) poate e cineva interesat.

Let's begin.

Pentru inceput partea de cod din ASM o putem scrie in C/C++


#include<iostream>
using namespace std;
int main()
{
_asm{
//codul asm
}
return 0;
}

Registrii

Toate operatiile aritmetice/logice/acces la memorie se fac prin intermediul registrilor. Registrii microprocesorului sunt asemanatori variabilelor (pot fi initializati cu anumite valori, se pot efectua operatii asupra lor, pot fi accesati (cititi/modificati)).

registri de uz general : eax, ebx, ecx, edx si subregistrii lor;

registri segment : cs (code segment), ds (data segment), es (extra segment), ss (stack segment) - sunt folositi pentru adresarea memoriei in cazul modelului de memorie segmentat

registrii index : esi, edi (source index, destination index);

registri speciali : ebp, esp, ip;

In prima parte vom lucra doar cu registrii de uz general.

eax - numit si "accumulator" - acesta este cel mai folosit in executarea operatiilor aritmetice (adunare, scadere, inmultire, impartire);

ebx - numit si "base" - acesta registru este folosit pentru adresarea indirecta a memoriei;

ecx - numit si "count" - acest registru este folosit mai ales in cadrul "buclelor" (in instructiunile repetitive : for/ while do/ do while/ repeat until);

edx - numit si "data" - retine anumite variabile, si este folosit impreuna cu eax in executarea operatiei "div", impartire intreaga (avand rolul de a retine restul impartirii).

Instructiuni

mov - instructiunea copiaza o valoare dintr-o locatie in alta locatie. Aceasta locatie poate fi zona de memorie, variabila, registru. De retinut este ca nu exista variante ale instructiunii care copiaza direct dintr-o zona de memorie in alta.

add - instructiunea este folosita pentru a aduna 2 valori

Exemplu:

 add eax,ebx // aduna valorea lui ebx cu eax si rezultatul se pastreaza in eax
este echivalenta cu a=a+b

sub - scadere

Exemplu:

 sub eax,ebx // este echivalenta cu a=a-b 

div - imparte eax. catul este pastrat in eax si restul in edx

Exemplu:

 
mov eax,10 //eax = 10
mov ebx,5 //ebx = 5
mov edx,0 //edx = 0
div ebx // 10/5
eax = 2
edx = 0


mul - se inmulteste eax.

Exemplu:


mov eax,10 // eax = 10
mov ebx,5 // ebx = 5
mul ebx // 10*5

eax = 50

inc & dec - echivalentul a i++ / i--. pentru aceste instructiuni in mare parte din cazuri se foloseste registrul ecx care este registrul "contor"

Exemplu:


mov ecx,0 // ecx = 0
inc ecx // ecx = ecx + 1
ecx = 1

Tutorialul de unde m-am inspirat

Introducere in asamblare

Basic shit is here. Cand o sa am timp ( zilele urmatoare ) daca sunteti interesati o sa scriu un tutorial si despre cum faci un IF // FOR // WHILE // DO WHILE in ASM sau in link-ul de mai sus gasiti toate informatiile necesare.

Thanks :)

  • Upvote 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...