Programování v asembleru - instrukce Jakub Yaghob
Datové typy I. Celočíselné typy Bezznaménkové Rozsah Znaménkové Dvojkový doplněk Rozsah Velikosti Byte, word, doubleword, quadword
Datové typy II. Ukazatele „Pakované“ BCD
Podmínky A/NBECF or ZF=0> AE/NBCF=0>= B/NAECF=1< BE/AECF or ZF=1<= CCF=1Carry E/ZZF=1== NCCF=0Not carry NE/NZZF=0!= NP/POPF=0Lichá parita P/PEPF=1Sudá parita G/NLE(SF xor OF) or ZF=0> GE/NLSF xor OF=0>= L/NGESF xor OF=1< LE/NG(SF xor OF) or ZF=1<= NOOF=0Not over NSSF=0>=0 OOF=1Overflow SSF=1<0 BezznaménkovéZnaménkové
Přesuny MOV, CMOVcc Výměny XCHG, BSWAP Zásobník PUSH, POP PUSHA, POPA PUSH oper ESP ESP-4 [SS:ESP] oper Vstup/výstup IN, OUT Konverze CWD, CDQ CWD: DX:AX S(AX) CBW, CWDE CBW: AX S(AL) Přesuny s rozšířením MOVSX, MOVZX
Celočíselná aritmetika I. Sčítání ADD, ADC Odčítání SUB, SBB Inkrement/dekrement INC, DEC Negace NEG Porovnání CMP
Celočíselná aritmetika II. Násobení MUL, IMUL MUL src: AX AL*src DX:AX AX*src EDX:EAX EAX*src IMUL rx,rmx IMUL rx,rmx,imm8 IMUL rx,imm8 IMUL rx,rmx,immx IMUL rx,immx Dělení DIV, IDIV DIV src: AL AX/src AH AX%src AX DX:AX/src DX DX:AX%src EAX EDX:EAX/src EDX EDX:EAX%src
Logické instrukce, posuvy, rotace I. Logické instrukce AND, OR, XOR, NOT Logické porovnání TEST Aritmetický posuv SAL(=SHL), SAR SAR: SAL: Logický posuv SHL(=SAL), SHR SHR: Rotace ROL, ROR ROL: ROR: OPCF OPCF 0 OPCF 0 OPCFOPCF
Logické instrukce, posuvy, rotace II. Rotace s přenosem RCL, RCR RCL: RCR: Velké posuvy SHLD, SHRD SHLD: SHLD rmx,rx,imm8 SHLD rmx,rx,CL OPCFOPCF DSTCF 0 SRC Možnosti posuvů RCL rm,imm8 RCL rm,CL
Skoky JMP, Jcc Cykly JCXZ, JECXZ JECXZ:IF ECX=0 GOTO LOOP LOOP:IF --ECX GOTO LOOPZ/LOOPE LOOPZ:IF ZF --ECX GOTO LOOPNZ/LOOPNE Podprogramy CALL, RET CALL dst:PUSH EIP EIP dst RET imm16:POP EIP ESP ESP+imm16 Přerušení INT, INTO, IRET Podpora VPJ BOUND ENTER, LEAVE
Bitové a BCD operace Operace s bity BT, BTS, BTR, BTC BTo rmx,rx BTo rmx,imm8 Hledání bitu BSF, BSR BSo rx,rmx Podmíněné nastavení SETcc Desítkové opravy DAA, DAS ASCII opravy AAA, AAS, AAM, AAD AAD [i]: AL AL+AH*i AH 0 AAM [i]: AH AL/i AL AL%i
„Semaforové“ operace XADD CMPXCHG XADD r/m,r temp src+dst src dst dst temp CMPXCHG r/m,r if ACC==dst { ZF 1;dst src; } else { ZF 0;ACC dst; }
„Semaforové“ operace Velké semaforové operace CMPXCHG8B, CMPXCHG16B if vDX:vAX==dst { ZF 1;dst vCX:vBX; } else { ZF 0;vDX:vAX dst; }
Ostatní Operace s CF STC, CLC, CMC Operace s DF STD, CLD Operace s IF STI, CLI Operace s EFLAGS LAHF, SAHF PUSHF, POPF Dlouhé ukazatele LDS, LES, LFS, LGS, LSS Ostatní LEA, NOP, XLATB, CPUID XLATB: AL [EBX+AL]
Řetězcové operace I. Různé šířky Byte, Word, Doubleword Zdroj DS:ESI Lze změnit DS prefixem instrukce Nelze změnit ESI Cíl ES:EDI Nelze změnit ES:EDI Opakování Počet v ECX a nelze to změnit Směr Podle DF Instrukce samy posouvají cíl/zdroj podle šířky a směru
Řetězcové operace II. Přesun MOVSs [ES:EDI] [DS:ESI] Porovnání CMPSs [DS:ESI] – [ES:EDI] Hledání SCASs ACC – [ES:EDI] Načtení LODSs ACC [DS:ESI] Uložení STOSs [ES:EDI] ACC Vstup INSs [ES:EDI] [DX] Výstup OUTSs [DX] [DS:ESI] Prefixy REP REPZ/REPE, REPNZ/REPNE
Řetězcové operace III. Je ECX==0? Pokud ano, konec. Nenastavuje příznaky Obsluha přerušení Vykonání instrukce posun cíle a zdroje nastaví příznaky pokud je porovnání ECX = ECX – 1 Nenastaví příznaky Pokud souhlasí podmínka nebo REP, jdi na začátek