220 lines
11 KiB
Markdown
220 lines
11 KiB
Markdown
# AMD64 NASM Cheatsheet
|
||
|
||
## Sizes
|
||
| Size (bits) | Size (bytes) | Name | NASM Mnemonics / Directives |
|
||
|-------------|--------------|--------|----------------------------------------|
|
||
| 8 | 1 | byte | DB, RESB |
|
||
| 16 | 2 | word | DW, RESW |
|
||
| 32 | 4 | dword | DD, RESD |
|
||
| 64 | 8 | qword | DQ, RESQ |
|
||
| 80 | 10 | tword | DT, REST |
|
||
| 128 | 16 | oword | DO, RESO, DDQ, RESDQ |
|
||
| 256 | 32 | yword | DY, RESY |
|
||
| 512 | 64 | zword | DZ, RESZ |
|
||
|
||
## Registers
|
||
|
||
| Register (32, 16, 8H, 8L)-Bit | Usage | Preserved Across Function Calls |
|
||
|--------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------|---------------------------------|
|
||
| %rax (eax, ax, ah, al) | Temporary register; with variable arguments passes information about the number of vector registers used; 1st return register | No |
|
||
| %rbx (ebx, ax, ah, al) | Callee-saved register; optionally used as base pointer | Yes |
|
||
| %rcx (ecx, cx, ch, cl) | Used to pass 4th integer argument to functions | No |
|
||
| %rdx (edx, dx, dh, dl) | Used to pass 3rd argument to functions; 2nd return register | No |
|
||
| %rsp (esp, sp, N/A, spl) | Stack pointer | Yes |
|
||
| %rbp (ebp, bp, N/A, bpl) | Callee-saved register; optionally used as frame pointer | Yes |
|
||
| %rsi (esi, si, N/A, sil) | Used to pass 2nd argument to functions | No |
|
||
| %rdi (edi, di, N/A, dil) | Used to pass 1st argument to functions | No |
|
||
| %r8 (r8d, r8w, N/A, r8b) | Used to pass 5th argument to functions | No |
|
||
| %r9 (r9d, r9w, N/A, r9b) | Used to pass 6th argument to functions | No |
|
||
| %r10 (r10d, r10w, N/A, r10b) | Temporary register, used for passing a function’s static chain pointer | No |
|
||
| %r11 (r11d, r11w, N/A, r11b) | Temporary register | No |
|
||
| %r12–%r15 (r12-15d, r12-15w, N/A, r12-15b) | Callee-saved registers | Yes |
|
||
| %xmm0–%xmm1 | Used to pass and return floating point arguments | No |
|
||
| %xmm2–%xmm7 | Used to pass floating point arguments | No |
|
||
| %xmm8–%xmm15 | Temporary registers | No |
|
||
| %mmx0–%mmx7 | Temporary registers | No |
|
||
| %st0, %st1 | Temporary registers; used to return long double arguments | No |
|
||
| %st2–%st7 | Temporary registers | No |
|
||
| %fs | Reserved for system (as thread specific data register) | No |
|
||
| mxcsr | SSE2 control and status word | Partial |
|
||
| x87 SW | x87 status word | No |
|
||
| x87 CW | x87 control word | Yes |
|
||
|
||
|
||
## Instructions
|
||
|
||
### Conditional JUMP Instructions
|
||
|
||
<table class="standard">
|
||
<thead>
|
||
<tr>
|
||
<th> Instruction </th>
|
||
<th> Description </th>
|
||
<th> signed-ness </th>
|
||
<th> Flags </th>
|
||
<th> short <br> jump <br> opcodes </th>
|
||
<th> near <br> jump <br> opcodes </th>
|
||
</tr>
|
||
</thead>
|
||
|
||
<tr>
|
||
<td class="insn"> JO </td>
|
||
<td class="descr"> Jump if overflow </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> OF = 1 </td>
|
||
<td class="hex"> 70 </td>
|
||
<td class="hex"> 0F 80 </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JNO </td>
|
||
<td class="descr"> Jump if not overflow </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> OF = 0 </td>
|
||
<td class="hex"> 71 </td>
|
||
<td class="hex"> 0F 81 </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JS </td>
|
||
<td class="descr"> Jump if sign </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> SF = 1 </td>
|
||
<td class="hex"> 78 </td>
|
||
<td class="hex"> 0F 88 </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JNS </td>
|
||
<td class="descr"> Jump if not sign </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> SF = 0 </td>
|
||
<td class="hex"> 79 </td>
|
||
<td class="hex"> 0F 89 </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JE <br> JZ </td>
|
||
<td class="descr"> Jump if equal
|
||
<br> Jump if zero </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> ZF = 1 </td>
|
||
<td class="hex"> 74 </td>
|
||
<td class="hex"> 0F 84 </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JNE
|
||
<br> JNZ </td>
|
||
<td class="descr"> Jump if not equal
|
||
<br> Jump if not zero </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> ZF = 0 </td>
|
||
<td class="hex"> 75 </td>
|
||
<td class="hex"> 0F 85 </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JB
|
||
<br> JNAE
|
||
<br> JC </td>
|
||
<td class="descr"> Jump if below
|
||
<br> Jump if not above or equal
|
||
<br> Jump if carry </td>
|
||
<td class="signed"> unsigned </td>
|
||
<td class="flags"> CF = 1 </td>
|
||
<td class="hex"> 72 </td>
|
||
<td class="hex"> 0F 82 </td> </tr>
|
||
|
||
<tr>
|
||
<td class="insn"> JNB
|
||
<br> JAE
|
||
<br> JNC </td>
|
||
<td class="descr"> Jump if not below
|
||
<br> Jump if above or equal
|
||
<br> Jump if not carry </td>
|
||
<td class="signed">unsigned </td>
|
||
<td class="flags">CF = 0 </td>
|
||
<td class="hex">73 </td>
|
||
<td class="hex">0F 83 </td> </tr>
|
||
|
||
<tr>
|
||
<td class="insn"> JBE
|
||
<br> JNA </td>
|
||
<td class="descr"> Jump if below or equal
|
||
<br> Jump if not above </td>
|
||
<td class="signed"> unsigned </td>
|
||
<td class="flags"> CF = 1 or ZF = 1 </td>
|
||
<td class="hex"> 76 </td>
|
||
<td class="hex"> 0F 86 </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JA
|
||
<br> JNBE </td>
|
||
<td class="descr"> Jump if above
|
||
<br> Jump if not below or equal </td>
|
||
<td class="signed"> unsigned </td>
|
||
<td class="flags"> CF = 0 and ZF = 0 </td>
|
||
<td class="hex"> 77 </td>
|
||
<td class="hex"> 0F 87 </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JL
|
||
<br> JNGE </td>
|
||
|
||
<td class="descr"> Jump if less
|
||
<br> Jump if not greater or equal </td>
|
||
<td class="signed"> signed </td>
|
||
<td class="flags"> SF <> OF </td>
|
||
<td class="hex"> 7C </td>
|
||
<td class="hex"> 0F 8C </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JGE
|
||
<br> JNL </td>
|
||
<td class="descr"> Jump if greater or equal
|
||
<br> Jump if not less </td>
|
||
<td class="signed"> signed </td>
|
||
<td class="flags"> SF = OF </td>
|
||
<td class="hex"> 7D </td>
|
||
<td class="hex"> 0F 8D </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JLE
|
||
<br> JNG </td>
|
||
<td class="descr"> Jump if less or equal
|
||
<br> Jump if not greater </td>
|
||
<td class="signed"> signed </td>
|
||
<td class="flags"> ZF = 1 or SF <> OF </td>
|
||
<td class="hex"> 7E </td>
|
||
<td class="hex"> 0F 8E </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JG
|
||
<br> JNLE </td>
|
||
<td class="descr"> Jump if greater
|
||
<br> Jump if not less or equal </td>
|
||
<td class="signed"> signed </td>
|
||
<td class="flags"> ZF = 0 and SF = OF </td>
|
||
<td class="hex"> 7F </td>
|
||
<td class="hex"> 0F 8F </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JP
|
||
<br> JPE </td>
|
||
<td class="descr"> Jump if parity
|
||
<br> Jump if parity even </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> PF = 1 </td>
|
||
<td class="hex"> 7A </td>
|
||
<td class="hex"> 0F 8A </td> </tr>
|
||
<tr>
|
||
<td class="insn"> JNP
|
||
<br> JPO </td>
|
||
<td class="descr"> Jump if not parity
|
||
<br> Jump if parity odd </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> PF = 0 </td>
|
||
<td class="hex"> 7B </td>
|
||
<td class="hex"> 0F 8B </td> </tr>
|
||
|
||
<tr>
|
||
<td class="insn"> JCXZ
|
||
<br> JECXZ </td>
|
||
<td class="descr"> Jump if %CX register is 0
|
||
<br> Jump if %ECX register is 0 </td>
|
||
<td class="signed"> </td>
|
||
<td class="flags"> %CX = 0
|
||
<br> %ECX = 0 </td>
|
||
<td class="hex"> E3 </td>
|
||
<td class="hex"> </td> </tr>
|
||
</table>
|
||
Source: <a href=http://unixwiz.net/techtips/x86-jumps.html>Intel x86 JUMP quick reference</a>
|
||
|
||
## additional resources
|
||
[Linux syscalls](https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/)
|
||
[System V AMD64 ABI](https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf)
|
||
[Getting arguments](https://github.com/tonyOreglia/argument-counter/wiki/x86-64-Linux-Assembly-Part-1:-Printing-Command-Line-Arguments)
|
||
[x86 and amd64 instruction reference](https://www.felixcloutier.com/x86/) |