Difference between revisions of "Assembler"
(→Opcodes) |
(→Flags) |
||
| Line 30: | Line 30: | ||
There are 32 bits available for the 17 EFlags. Missing bits in this list are not a mistake, some flags temporarily use their neighbours.<br> | There are 32 bits available for the 17 EFlags. Missing bits in this list are not a mistake, some flags temporarily use their neighbours.<br> | ||
ID, VIP, VIF, AC, VM, RF, NT, IOPL, OF, DF, IF, TF, SF, ZF, AF, PF, CF<br> | ID, VIP, VIF, AC, VM, RF, NT, IOPL, OF, DF, IF, TF, SF, ZF, AF, PF, CF<br> | ||
| − | + | ||
| − | Bit | + | {| class="gallery" style="background-color:#f4f4f4" |
| − | 00 | + | |+ Flags |
| − | 02 | + | ! Bit !! Flag !! Description |
| − | 04 | + | |- |
| − | 06 | + | |00 |
| − | 07 | + | |'''CF''' Carry Flag |
| − | 08 | + | |Becomes one if an addition, multiplication, AND, OR, etc results in a value larger than the register meant for the result. |
| − | 09 | + | |- |
| − | 10 | + | |02 |
| − | 11 | + | |'''PF''' Parity Flag |
| − | 12-13 | + | |Becomes 1 if the lower 8-bits of an operation contains an even number of 1 bits. |
| − | 14 | + | |- |
| − | 16 | + | |04 |
| − | 17 | + | |'''AF''' Auxiliary Flag |
| − | 18 | + | |Set on a carry or borrow to the value of the lower order 4 bits. |
| − | 19 | + | |- |
| − | 20 | + | |06 |
| − | 21 | + | |'''ZF''' Zero Flag |
| + | |Becomes 1 if an operation results in a 0 writeback, or 0 register. | ||
| + | |- | ||
| + | |07 | ||
| + | |'''SF''' Sign Flag | ||
| + | |Is 1 if the value saved is negative, 0 for positive. | ||
| + | |- | ||
| + | |08 | ||
| + | |'''TF''' Trap Flag | ||
| + | |Allows for the stopping of code within a segment (allows for single stepping/debugging in programming). | ||
| + | |- | ||
| + | |09 | ||
| + | |'''IF''' Interrupt Flag | ||
| + | |When this flag is set, the processor begins 'listening' for external interrupts. | ||
| + | |- | ||
| + | |10 | ||
| + | |'''DF''' Direction Flag | ||
| + | |Determines the direction to move through the code (specific to repeat instructions). | ||
| + | |- | ||
| + | |11 | ||
| + | |'''OF''' Overflow Flag | ||
| + | |Becomes 1 if the operation is larger than available space to write (eg: addition which results in a number >32-bits). | ||
| + | |- | ||
| + | |12-13 | ||
| + | |'''IOPL''' I/O Privilege Level | ||
| + | |2-bit register specifying which privilege level is required to access the IO ports | ||
| + | |- | ||
| + | |14 | ||
| + | |'''NT''' Nested Task | ||
| + | |Becomes 1 when calls within a program are made. | ||
| + | |- | ||
| + | |16 | ||
| + | |'''RF''' Resume Flag | ||
| + | |Stays 1 upon a break, and stays that way until a given 'release' or resume operation/command occurs. | ||
| + | |- | ||
| + | |17 | ||
| + | |'''VM''' Virtual Machine 8086 | ||
| + | |Becomes a 1 if the processor is to simulate the 8086 processor (16-bit). | ||
| + | |- | ||
| + | |18 | ||
| + | |'''AC''' Alignment Check | ||
| + | |Checks that a file or command is not breaking its privilege level. | ||
| + | |- | ||
| + | |19 | ||
| + | |'''VIF''' Virtual Interrupt Flag | ||
| + | |Almost always set in protected mode, listening for internal and assembling interrupts. | ||
| + | |- | ||
| + | |20 | ||
| + | |'''VIP''' Virtual Interrupt Pending | ||
| + | |1 if a virtual interrupt is yet to occur. | ||
| + | |- | ||
| + | |21 | ||
| + | |'''ID''' ID Flag | ||
| + | |Is set if a CPU identification check is pending (used in some cases to ensure valid hardware). | ||
| + | |} | ||
| + | |||
Revision as of 12:02, 12 March 2017
| This entry needs a lot of work. Please contribute if you can. Check this page to see if there are some suggestions for adding to Assembler. |
To describe:
- Flags
- Segments
- CPL/DPL
- IDT/GDT(/LDT)
Segments
Segment registers: cs,es,ds,ss,fs,gs
Bits 0,1 describe the RPL , request privilege level
Bit 2 describes if the LDT is used or not
Bits 3 to 15 contain the offset into the GDT or LDT table (when shifted left by 3)
example:
CS of 8 = 1000b = 1 0 00 : RPL=0, LDT=0, so GDT is used, offset in GDT table is (1 << 3) = 8
CS of 0x23 = 100011b = 100 0 11 : RPL=3, LDT=0 (GDT), offset in GDT table is 100b=4, (4 << 3) = 32
Note that even though 64-bit mode is used, bits 3 to 15 still only need to be shifted by 3 to point to the proper offset
GDT
The gdt is a table of descriptors that describe what should happen when entering a specific segment and setting it's rights. (What access rights, the limits, if it's data or code, etc...)
IDT
The IDT is a table of descriptors that describe what should happen when an interrupt occurs. It contains the used code segment, and the EIP/RIP address to call, but also information like the DPL of the interrupt and if it's a callgate, taskgate or interrupt gate
Useful interrupts in regards of game hacking: Interrupt 1(Single step), 3(breakpoint),13(General protection fault) and 14 (Page fault)
Flags
There are 32 bits available for the 17 EFlags. Missing bits in this list are not a mistake, some flags temporarily use their neighbours.
ID, VIP, VIF, AC, VM, RF, NT, IOPL, OF, DF, IF, TF, SF, ZF, AF, PF, CF
| Bit | Flag | Description |
|---|---|---|
| 00 | CF Carry Flag | Becomes one if an addition, multiplication, AND, OR, etc results in a value larger than the register meant for the result. |
| 02 | PF Parity Flag | Becomes 1 if the lower 8-bits of an operation contains an even number of 1 bits. |
| 04 | AF Auxiliary Flag | Set on a carry or borrow to the value of the lower order 4 bits. |
| 06 | ZF Zero Flag | Becomes 1 if an operation results in a 0 writeback, or 0 register. |
| 07 | SF Sign Flag | Is 1 if the value saved is negative, 0 for positive. |
| 08 | TF Trap Flag | Allows for the stopping of code within a segment (allows for single stepping/debugging in programming). |
| 09 | IF Interrupt Flag | When this flag is set, the processor begins 'listening' for external interrupts. |
| 10 | DF Direction Flag | Determines the direction to move through the code (specific to repeat instructions). |
| 11 | OF Overflow Flag | Becomes 1 if the operation is larger than available space to write (eg: addition which results in a number >32-bits). |
| 12-13 | IOPL I/O Privilege Level | 2-bit register specifying which privilege level is required to access the IO ports |
| 14 | NT Nested Task | Becomes 1 when calls within a program are made. |
| 16 | RF Resume Flag | Stays 1 upon a break, and stays that way until a given 'release' or resume operation/command occurs. |
| 17 | VM Virtual Machine 8086 | Becomes a 1 if the processor is to simulate the 8086 processor (16-bit). |
| 18 | AC Alignment Check | Checks that a file or command is not breaking its privilege level. |
| 19 | VIF Virtual Interrupt Flag | Almost always set in protected mode, listening for internal and assembling interrupts. |
| 20 | VIP Virtual Interrupt Pending | 1 if a virtual interrupt is yet to occur. |
| 21 | ID ID Flag | Is set if a CPU identification check is pending (used in some cases to ensure valid hardware). |
Opcodes
Most commonly used opcodes:
- MOV destination, source
- Sets a register or address to a specified value.
- INC destination
- Increases a register or address with 1.
- DEC destination
- Decreases a register or address with 1.
- ADD destination, source
- Adds the source to the destination.
- SUB destination, source
- Subtracts the source from the destination.
- NOP
- No Operation.
- Usually used when removing original code.
- OR destination, source
- The OR instruction is used for supporting logical expression by performing bitwise OR operation.
- The bitwise OR operator returns 1, if the matching bits from either or both operands are one.
- It returns 0, if both the bits are zero.
- Example:
destination: 0101
source: 0011
----------------------------
After OR -> destination: 0111
- XOR destination, source
- The XOR instruction implements the bitwise XOR operation.
- The XOR operation sets the resultant bit to 1, if and only if the bits from the operands are different.
- If the bits from the operands are same (both 0 or both 1), the resultant bit is cleared to 0.
- Example:
destination: 0101
source: 0011
----------------------------
After XOR -> destination: 0110
- AND
- The AND instruction is used for supporting logical expressions by performing bitwise AND operation.
- The bitwise AND operation returns 1, if the matching bits from both the operands are 1, otherwise it returns 0.
- Example:
destination: 0101
source: 0011
----------------------------
After AND -> destination: 0001
- TEST destination, source
- The TEST instruction works same as the AND operation, but unlike AND instruction, it does not change the first operand.
- NOT operand
- The NOT instruction implements the bitwise NOT operation.
- NOT operation reverses the bits in an operand.
- The operand could be either in a register or in the memory.
- Example:
operand: 0101 0011 After NOT -> operand: 1010 1100