Programming/Assembly: Difference between revisions

From Dev Wiki
Jump to navigation Jump to search
(Create AT&T vs Intel section)
(Reorder page content)
Line 1: Line 1:
== Instruction Sizes ==
== Syntax Types ==
In 64 bit assembly, some assembly instructions will have letters appended to the end of the instruction, indicating the size of data being referenced. The letters are the following:
For 32 bit (x86) assembly, there are two main syntax types. '''AT&T''' is mostly used in Unix environments, while '''Intel''' is mostly used in MS-DOS and Windows.<br>
* '''Byte''' ('''b''') - A one-byte (8 bit) value.
The differences are as follows:
* '''Word''' ('''w''') - A two-byte (16 bit) value.
{| class="wikitable" style="text-align: center;"
* '''DoubleWord''' ('''l''') - A four-byte (32 bit) value.
|-
* '''QuadWord''' ('''q''') - A eight-byte (64 bit) value.
!
! AT&T
! Intel
|-
! Signs
| Instructions need size definition suffix (see [[#Instruction Sizes]]).<br>Values need '''%''' prefix for registers, and '''$''' prefix for constants.<br>Ex:<code>%eax</code>
| Automatically detects size and type of value. Signs are not needed.<br>Ex:<code>eax</code>
|-
! Value Order
| Source first, destination second.<br>Ex:<code>mov $5, %eax</code>
| Destination first, source second.<br>Ex:<code>mov eax, 5</code>
|-
! Value Size
| Size suffix (see [[#Instruction Sizes]]) must be added to instruction.<br>Ex:<code>addl %eax, %ebx</code>
| Size automatically derived from register used. In instances where size is ambiguous, must use a size keyword ('''byte''', '''word''', '''dword''', '''qword''').<br>Ex:<code>add eax, ebx</code>
|-
! Effective Address
| Uses general memory address syntax.<br>Ex:<code>(%ebx, %ecx, 4)</code>
| Uses arithmetic expressions in square brackets.<br>Ex:<code>[ebx + ecx*4]</code>
|-
|}


== Registers ==
== Registers ==
Line 307: Line 327:
https://www.cs.princeton.edu/courses/archive/spring11/cos217/lectures/15AssemblyFunctions.pdf
https://www.cs.princeton.edu/courses/archive/spring11/cos217/lectures/15AssemblyFunctions.pdf


 
== Instruction Sizes ==
== Syntax Types ==
In 64 bit assembly, some assembly instructions will have letters appended to the end of the instruction, indicating the size of data being referenced. The letters are the following:
For 32 bit (x86) assembly, there are two main syntax types. '''AT&T''' is mostly used in Unix environments, while '''Intel''' is mostly used in MS-DOS and Windows.<br>
* '''Byte''' ('''b''') - A one-byte (8 bit) value.
The differences are as follows:
* '''Word''' ('''w''') - A two-byte (16 bit) value.
{| class="wikitable" style="text-align: center;"
* '''DoubleWord''' ('''l''') - A four-byte (32 bit) value.
|-
* '''QuadWord''' ('''q''') - A eight-byte (64 bit) value.
!
! AT&T
! Intel
|-
! Signs
| Instructions need size definition suffix (see [[#Instruction Sizes]]).<br>Values need '''%''' prefix for registers, and '''$''' prefix for constants.<br>Ex:<code>%eax</code>
| Automatically detects size and type of value. Signs are not needed.<br>Ex:<code>eax</code>
|-
! Value Order
| Source first, destination second.<br>Ex:<code>mov $5, %eax</code>
| Destination first, source second.<br>Ex:<code>mov eax, 5</code>
|-
! Value Size
| Size suffix (see [[#Instruction Sizes]]) must be added to instruction.<br>Ex:<code>addl %eax, %ebx</code>
| Size automatically derived from register used. In instances where size is ambiguous, must use a size keyword ('''byte''', '''word''', '''dword''', '''qword''').<br>Ex:<code>add eax, ebx</code>
|-
! Effective Address
| Uses general memory address syntax.<br>Ex:<code>(%ebx, %ecx, 4)</code>
| Uses arithmetic expressions in square brackets.<br>Ex:<code>[ebx + ecx*4]</code>
|-
|}


== Instructions ==
== Instructions ==
* '''mov <a>, <b>''' - Copies data location from one to the other.
* '''mov <a>, <b>''' - Copies data location from one to the other.

Revision as of 13:45, 3 February 2020

Syntax Types

For 32 bit (x86) assembly, there are two main syntax types. AT&T is mostly used in Unix environments, while Intel is mostly used in MS-DOS and Windows.
The differences are as follows:

AT&T Intel
Signs Instructions need size definition suffix (see #Instruction Sizes).
Values need % prefix for registers, and $ prefix for constants.
Ex:%eax
Automatically detects size and type of value. Signs are not needed.
Ex:eax
Value Order Source first, destination second.
Ex:mov $5, %eax
Destination first, source second.
Ex:mov eax, 5
Value Size Size suffix (see #Instruction Sizes) must be added to instruction.
Ex:addl %eax, %ebx
Size automatically derived from register used. In instances where size is ambiguous, must use a size keyword (byte, word, dword, qword).
Ex:add eax, ebx
Effective Address Uses general memory address syntax.
Ex:(%ebx, %ecx, 4)
Uses arithmetic expressions in square brackets.
Ex:[ebx + ecx*4]

Registers

The following registers exist in 64 and 32 bit assembly.

Stack Pointer Stack Base Pointer Accumulator Base Counter Data Source Destination
64 Bit RSP RBP RAX RBX RCX RDX RSI RDI
32 Bit ESP EBP EAX EBX ECX EDX ESI EDI
16 Bit SP BP AX BX CX DX SI DI
8 Bit SPL BPL AH AL BH BL CH CL DH DL SIL DIL


The following registers only exist in 64 bit assembly.

Temp 1 Temp 2 Temp 3 Temp 4 Temp 5 Temp 6 Temp 7 Temp 8
64 Bit R8 R9 R10 R11 R12 R13 R14 R15
32 Bit R8D R9D R10D R11D R12D R13D R14D R15D
16 Bit R8W R9W R10W R11W R12W R13W R14W R15W
8 Bit R8B R9B R10B R11B R12B R13B R14B R15B

In-depth details of how assembly register and function calling should work: https://www.cs.princeton.edu/courses/archive/spring11/cos217/lectures/15AssemblyFunctions.pdf

Instruction Sizes

In 64 bit assembly, some assembly instructions will have letters appended to the end of the instruction, indicating the size of data being referenced. The letters are the following:

  • Byte (b) - A one-byte (8 bit) value.
  • Word (w) - A two-byte (16 bit) value.
  • DoubleWord (l) - A four-byte (32 bit) value.
  • QuadWord (q) - A eight-byte (64 bit) value.

Instructions

  • mov <a>, - Copies data location from one to the other.