Ves al contingut principal

Entrades

S'estan mostrant les entrades d'aquesta data: febrer, 2013

Primer programa en asm

No vaig a escriure un tutorial en asm, ja que trobe que no val la pena... ;) Però anem a veure el primer programa "Hola món" típic als tutorials de programació.
Tal i com contava en un post anterior, anem a gastar Visual Asm (easy code). Seleccionem crear i li diguem crear un nou projecte, com aplicació de consola:

I ara anem a veure com escrivim en pantalla, la forma més fàcil  que he trobat és trovar l'identificador de l'arxiu pantalla (handle), i escriure uns caràcters en eixa pantalla. Per obtindre l'identificador gastarem la funció del sistema GetStdHandle, i per escriure en eixe identificador, WriteFile. Ho escrivim amb els paràmetres corresponents en la secció main, pareguda a la funció main de C:

Main:
 Push - 11D               ;STD_OUTPUT_HANDLE estàndard output, pel dispositiu què preguntem
CALL GetStdHandle       ;en EAX tindrem el handle
Push 0, Addr buff      ; variable on guardem coses, no val per a res en este cas
Push 9, 'Hola món!'    ;9 …

Programació en assemblador

Com em torna a picar el cuquet de programar en assemblador (asm a partir d'ara), i sempre la gent em preguta per què? quina utilitat té... doncs bé, la justificació teòrica (dels llibres) què donen, és què tens un major control de la màquina, pots optimitzar codi... Fent una analogia mecànica, sempre comparen un canvi de marxes manual (asm) i  un automàtic (C++),  no vull ni pensar que seria el VB.NET actual... potser conduir amb la ment.
Anem a posar un exemple, si tinguem este programa en C:


#include <stdio.h>
void main(){
     int i;
     int vector[10];
     for(i=0;i<=9;i++) vector[i]=0;
}

fem una compilació per veure que s'executa realment (gcc -S) i obtenim el següent codi en asm:
        .file   "prova.c"
        .text
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $48, %esp
        movl    $0, -4(%ebp)
        jmp     .L2
.L3:
        movl    -4(%ebp), %eax
        movl    $0, -44(%ebp,%eax,4)
        …