2025-07-07 13:23:36 +00:00

220 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 | Usage | Preserved Across Function Calls |
|------------------|-------------------------------------------------------------------------------------------|-------------------------------|
| %rax | Temporary register; with variable arguments passes information about the number of vector registers used; 1st return register | No |
| %rbx | Callee-saved register; optionally used as base pointer | Yes |
| %rcx | Used to pass 4th integer argument to functions | No |
| %rdx | Used to pass 3rd argument to functions; 2nd return register | No |
| %rsp | Stack pointer | Yes |
| %rbp | Callee-saved register; optionally used as frame pointer | Yes |
| %rsi | Used to pass 2nd argument to functions | No |
| %rdi | Used to pass 1st argument to functions | No |
| %r8 | Used to pass 5th argument to functions | No |
| %r9 | Used to pass 6th argument to functions | No |
| %r10 | Temporary register, used for passing a functions static chain pointer | No |
| %r11 | Temporary register | No |
| %r12%r15 | 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"> &nbsp; </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"> &nbsp; </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"> &nbsp; </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"> &nbsp; </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"> &nbsp; </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"> &nbsp; </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 &lt;&gt; 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 &lt;&gt; 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"> &nbsp; </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"> &nbsp; </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"> &nbsp; </td>
<td class="flags"> %CX = 0
<br> %ECX = 0 </td>
<td class="hex"> E3 </td>
<td class="hex"> &nbsp; </td> </tr>
</table>
Source: [Intel x86 JUMP quick reference](http://unixwiz.net/techtips/x86-jumps.html)
## 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/)