Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- int main(void)
- {
- /*
- Piccolo appunto personale: se fai una somma che sfora (esempio con ADC) il bit di troppo te lo memorizza nel Carry Flag!! Esiste anche il duale (borrow) per la sottrazione.
- <length keyword> ptr [<address>]
- ptr dice "occhio che questo è un puntatore", mentre dword è una keyword (fissa nella sintassi della deferenziazione dei puntatori) che serve per dirgli di leggere quattro byte a partire dall'indirizzo di memoria passato.
- le length keyword sono dword (4 byte), word (2 byte) e byte (1 byte). Quindi se faccio mov al, byte ptr [000h] sto prendendo dalla memoria i primi 8 bit (occhio alla dimensione degli operandi). Puoi fare anche mov eax, dword ptr [ebx] per leggere tot roba dai vai registri.
- Attenzione: non si può andare in memoria due volte con questa tecnica. Questo perchè i registri utilizzati per deferenziare i puntatori e contenerne i dati sono due (MAR e MDR) sono solo due, ne servirebbero 4 per gestire un'istruzione del genere!
- Questo è importante e vale per qualsiasi istruzione.
- */
- char a[50] = { "Peppa pig" };
- char *b = &(a[0]);
- char c;
- __asm
- {
- mov ebx, b
- //b = a+b - c
- /*add ebx, eax
- sub ebx, ecx //si sarebbe potuto anche negare ecx con neg ecx e poi aggiungerlo invece che sottrarlo
- mov b, ebx*/
- //b += a
- //add ebx, eax
- //mov b, ebx
- //terzo elemento di a
- mov esi, 4 //indice
- mov cl, byte ptr [ebx + esi * 1] //non puoi farlo direttamente con c, ricorda che sarebbe come fare mov dword ptr [c], dword ptr [ebx + 8] che NON SI PUO' FARE, MAR E MDR NON SI SDOPPIANO CAZZO
- mov c, cl
- }
- printf("%c", c);
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment