Skip to content

Instantly share code, notes, and snippets.

@janisz
Created April 15, 2015 11:48
Show Gist options
  • Save janisz/88571a28dc6ce2e81a59 to your computer and use it in GitHub Desktop.
Save janisz/88571a28dc6ce2e81a59 to your computer and use it in GitHub Desktop.
## 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