Created
April 15, 2015 11:48
-
-
Save janisz/88571a28dc6ce2e81a59 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## OPERACJE NA DANYCH ## | |
MOV arg1, arg2 - przesyla arg2 do arg1 | |
XCHG arg1, arg2 - zamienia wartości argumentów arg1 z arg2 | |
PUSH arg - umieszcza arg na stosie | |
POP arg - pobiera element ze stosu i umieszcza go w arg | |
PUSHA/POPA - umieszczenie/pobranie na stosie wszystkich rejestrów uniwersalnych | |
MOVZX/MOVSX rej, arg2 - rozciagniecie bez/ze znakiem arg2 i umieszczenie go w rej | |
BSWAP rej32 - odwrócenie kolejności bajtów | |
MOVBE arg1, arg2 - odwr. kolejnosci bajtow arg2 i przeslanie wyniku do arg1 | |
CMOV*** arg1, arg2 - warunkowe przeslanie arg2 do arg1 | |
SET*** arg8 - warunkowe ustawienie bajtu | |
ADD arg1, arg2 - dodaje arg1 do arg2 i zapisuje wynik do arg1 | |
XADD arg1, arg2 - arg1 = początkowa wartość arg1 + początkowa wartość arg2 | |
arg2 = początkowa wartość arg1 | |
ADC arg1, arg2 - dodaje arg1 do arg2 z przeniesieniem CF zapisuje wynik do arg1 | |
SUB arg1, arg2 - odejmuje arg2 od arg1 i zapisuje do arg1 (SBB uwzglednia wart CF) | |
MUL arg - mnoży arg przez akumulator i zapisuje w rozsz. akumulatorze (BEZ ZNAKU) | |
* Argument 8-bitowy: akumulator = AL, rozsz. akumulator = AX | |
* Argument 16-bitowy: akumulator = AX, rozsz. akumulator = DX:AX | |
* Argument 32-bitowy: akumulator = EAX, rozsz. akumulator = EDX:EAX | |
## Mnożenia za znakiem: ## | |
IMUL arg - rozszerzony_akumulator = akumulator * arg | |
IMUL arg1, arg2 - arg1 = arg1 * arg2 | |
IMUL arg1, arg2, arg3 - arg1 = arg2 * arg3 | |
## Dzielenie ## | |
DIV arg - bez znaku | |
IDIV arg - ze znakiem | |
* akumulator = rozszerzony_akumulator / arg | |
* starsza_połowa_rozszerzonego_akumulatora = rozszerzony_akumulator % arg | |
INC arg - inkrementacja: arg = arg + 1 | |
DEC arg - dekrementacja: arg = arg - 1 | |
NEG arg - negacja arytmetyczna: arg = -arg | |
## Rozciaganie danych ## | |
CBW - AX = "rozciągnięte ze znakiem" AL | |
CWD - para DX:AX = "rozciągnięte ze znakiem" AX | |
CWDE - EAX = "rozciągnięte ze znakiem" AX | |
CDQ - para EDX:EAX = "rozciągnięte ze znakiem" EAX | |
TEST arg1, arg2 - ustawia znaczniki zgodnie z wynikiem arg1 & arg2 | |
SHR arg1, arg2 - przesumiecie bitowe w prawo na bit najstarszy wchodzi 0 natomiast to co wyszlo wchodzi co rej CF | |
SAR arg1, arg2 - przesuniecie arytmetyczne (to co wyszlo rowniez wchodzi do rej CF) ale wchodzi niekoniecznie 0 | |
SHL arg1, arg2 - przesuniecie bitowe w lewo na najmlodszy wchodzi 0 a najstarszy wyrzucany jest do rej CF | |
SAL arg1, arg2 - przesuniecie arytmetyczne w lewo (analogicznie do SHL) | |
ROR arg1, arg2 - X->|_|_______-->______|X|->CF obrot w prawo... mamy jeszcze obrot taki w lewo ROL | |
RCR arg1, arg2 - CF->|_|____-->_____|_|->CF obrot w prawo... mamy jeszcze obroty w lewo RCL | |
## Testowanie bitu ## | |
BT arg1, arg2 - testowany jest bit o nr arg2 z arg1 i wpisywany do CF | |
BTS arg1, arg2 - dodatkowo ustawia bit na 1 | |
BTR arg1, arg2 - dodatkowo ustawia bit na 0 | |
BTC arg1, arg2 - dodatkowo neguje bit | |
POPCNT arg1, arg2 - umieszcza w arg1 ilosc bitow równych 1 z arg2 | |
## SKOKI ## | |
- bezwarunkowy | |
JMP arg | |
- warunkowe | |
JC - skocz gdy CF=1 | |
JZ - skocz gdy ZF=1 | |
JS - skocz gdy SF=1 | |
JO - skocz gdy OF=1 | |
JP/JPE - skocz gdy PF=1 | |
JNC - skocz gdy CF=0 | |
JNZ - skocz gdy ZF=0 | |
JNS - skocz gdy SF=0 | |
JNO - skocz gdy OF=0 | |
JNP/JPO - skocz gdy PF=0 | |
JE - skocz gdy argumenty są równe | |
JNE - skocz gdy argumenty nie są równe | |
JG/JNLE - skocz gdy arg1 jest większy niż arg2 / nieprawda, że arg1 jest mniejszy lub równy arg2 | |
JGE/JNL - skocz gdy arg1 jest większy lub równy arg2 / nieprawda, że arg1 jest mniejszy niż arg2 | |
JL/JNGE - skocz gdy arg1 jest mniejszy niż arg2 / nieprawda, że arg1 jest wiekszy lub równy arg2 | |
JLE/JNG - skocz gdy arg1 jest mniejszy lub równy arg2 / nieprawda, że arg1 jest wiekszy niż arg2 | |
## PETLE ## (Licznikiem jest rejestr ECX!) | |
LOOP etykieta - licznik = licznik - 1; if ( licznik!=0 ) goto etykieta; | |
LOOPZ etykieta - licznik = licznik - 1; if ( licznik!=0 and ZF=1 ) goto etykieta; | |
LOOPNZ etykieta - licznik = licznik - 1; if ( licznik!=0 and ZF=0 ) goto etykieta; | |
JCXZ etykieta - skok gdy licznik (rej. CX) == 0 | |
JECXZ etykieta - skok gdy licznik (rej. ECX) == 0 | |
## PROCEDURY ## | |
CALL arg - wywołanie procedury arg | |
RET - powrót z procedury | |
RET arg - dodatkowo usuniecie arg bajtów ze stosu | |
## OPERACJE NA ZNACZNIKACH ## | |
STC - CF=1 | |
CLC - CF=0 | |
CMC - CF=~CF | |
STD - DF=1 | |
CLD - DF=0 | |
STI - IF=1 | |
CLI - IF=0 | |
## INNE ## | |
RDTSC - licznik taktów zegara. Zapisuje do EDX:EAX | |
RDRAND rej - generuje losowa liczbe do rejestru | |
#include <iostream> | |
extern "C" { | |
//deklaracja zewnetrznej funkcji dolinkowanej z asemblera | |
void funkcja(int* z, int x,int y); | |
} | |
int main() | |
{ | |
int x=10; | |
int y=21; | |
int z; | |
funkcja(&z,x,y); | |
cout << z; endl; | |
system("PAUSE"); | |
return 0; | |
} | |
.386 | |
.MODEL FLAT, C | |
.CODE | |
funkcja PROC | |
; trzeci argument - przekazywany przez wartosc | |
mov eax, [esp+12] | |
; drugi argument - przekazywany przez wartosc | |
mov ebx, [esp+8] | |
add eax, ebx | |
; pierwszy argument - przekazywany przez referencje tak by mozna bylo go zmodyfikowac | |
mov ebx, [esp+4] | |
mov [ebx], eax | |
ret | |
funkcja ENDP | |
END |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment