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