xTremeSurfer Posted February 2, 2014 Report Posted February 2, 2014 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;}RegistriiToate 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 segmentatregistrii 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).Instructiunimov - 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 valoriExemplu: add eax,ebx // aduna valorea lui ebx cu eax si rezultatul se pastreaza in eaxeste echivalenta cu a=a+b sub - scadereExemplu: sub eax,ebx // este echivalenta cu a=a-b div - imparte eax. catul este pastrat in eax si restul in edxExemplu: mov eax,10 //eax = 10mov ebx,5 //ebx = 5mov edx,0 //edx = 0 div ebx // 10/5eax = 2edx = 0mul - se inmulteste eax.Exemplu:mov eax,10 // eax = 10mov ebx,5 // ebx = 5mul ebx // 10*5eax = 50inc & 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 = 0inc ecx // ecx = ecx + 1ecx = 1Tutorialul de unde m-am inspiratIntroducere in asamblareBasic 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 1 Quote
parazitul29 Posted February 2, 2014 Report Posted February 2, 2014 Daca vrei ceva mai "hardcore" incearca nasm sau masm , c-ul nu e prea potrivit pentru asamblare Quote
xTremeSurfer Posted February 2, 2014 Author Report Posted February 2, 2014 Stiu dar am pus asa ca o introducere Quote
BatranuSpliff Posted June 19, 2014 Report Posted June 19, 2014 Frumos, mai a?tept tutoriale de genu pentru t?nt?l?ii ca mine! Quote