Jump to content
xTremeSurfer

ASM ! IA 32 ! Basic shit !

Recommended Posts

Posted

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

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...