170 likes | 265 Views
P rogramování v asembleru - instrukce. Jakub Yaghob. Datové typy I. Celočíselné typy Bezznaménkové Rozsah <0, 2 n -1> Znaménkové Dvojkový doplněk Rozsah < -2 n-1 , 2 n-1 -1> Velikosti Byte, word, doubleword, quadword. Datové typy II. Ukazatele „Pakované“ BCD. Podmínky.
E N D
Programování v asembleru - instrukce Jakub Yaghob
Datové typy I. • Celočíselné typy • Bezznaménkové • Rozsah <0, 2n-1> • Znaménkové • Dvojkový doplněk • Rozsah < -2n-1, 2n-1-1> • Velikosti • Byte, word, doubleword, quadword
Datové typy II. • Ukazatele • „Pakované“ BCD
Podmínky Bezznaménkové Znaménkové
Přesuny MOV, CMOVcc Výměny XCHG, BSWAP Zásobník PUSH, POP PUSHA, POPA PUSH oper ESPESP-4 [SS:ESP]oper Vstup/výstup IN, OUT Konverze CWD, CDQ CWD:DX:AXS(AX) CBW, CWDE CBW:AXS(AL) Přesuny s rozšířením MOVSX, MOVZX Přesuny
Sčítání ADD, ADC Odčítání SUB, SBB Inkrement/dekrement INC, DEC Negace NEG Porovnání CMP Celočíselná aritmetika I.
Násobení MUL, IMUL MUL src:AXAL*src DX:AXAX*src EDX:EAXEAX*src IMUL rx,rmx IMUL rx,rmx,imm8 IMUL rx,imm8 IMUL rx,rmx,immx IMUL rx,immx Dělení DIV, IDIV DIV src:ALAX/src AHAX%src AXDX:AX/src DXDX:AX%src EAXEDX:EAX/src EDXEDX:EAX%src Celočíselná aritmetika II.
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: OP CF CF OP OP CF 0 0 OP CF CF OP Logické instrukce, posuvy, rotace I.
Rotace s přenosem RCL, RCR RCL: RCR: Velké posuvy SHLD, SHRD SHLD: SHLD rmx,rx,imm8 SHLD rmx,rx,CL Možnosti posuvů RCL rm,imm8 RCL rm,CL CF CF OP OP CF DST SRC 0 Logické instrukce, posuvy, rotace II.
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 EIPdst RET imm16:POP EIP ESPESP+imm16 Přerušení INT, INTO, IRET Podpora VPJ BOUND ENTER, LEAVE Skoky
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]: ALAL+AH*i AH0 AAM [i]: AHAL/i ALAL%i Bitové a BCD operace
„Semaforové“ operace XADD CMPXCHG XADD r/m,r tempsrc+dst srcdst dsttemp CMPXCHG r/m,r if ACC==dst { ZF1;dstsrc; } else { ZF0;ACCdst; } „Semaforové“ operace
„Semaforové“ operace • Velké semaforové operace • CMPXCHG8B, CMPXCHG16B if vDX:vAX==dst { ZF1;dstvCX:vBX; } else { ZF0;vDX:vAXdst; }
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] Ostatní
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 ECXa nelze to změnit Směr Podle DF Instrukce samy posouvají cíl/zdroj podle šířky a směru Řetězcové operace I.
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 II.
Ř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