NASA

A Handbook for Assembly | Chapter 1: Basic Assembly Language Concepts

 


Chapter 1: Basic Assembly Language Concepts


### 1.1 Introduction


Assembly language is a low-level programming language that provides a direct representation of the machine code executed by a computer's central processing unit (CPU). To effectively work with assembly language, it's essential to grasp fundamental concepts that form the building blocks of assembly programming.


### 1.2 Registers


Registers are small, fast storage locations within the CPU that are used to store data temporarily during program execution. Each processor architecture has a specific set of registers with unique purposes. Common registers include:


- **General-Purpose Registers:**

  - Used for general data storage and arithmetic operations.

  - Examples: `eax`, `ebx`, `ecx`, `edx` (x86 architecture).


- **Index Registers:**

  - Used for array indexing.

  - Example: `esi` (x86 architecture).


- **Base Pointer and Stack Pointer:**

  - `ebp`: Base Pointer, often used to reference function arguments and local variables.

  - `esp`: Stack Pointer, manages the program stack.


### 1.3 Instructions


Instructions in assembly language correspond directly to machine code instructions executed by the CPU. Each instruction performs a specific operation, such as data movement, arithmetic, or control flow.


- **MOV (Move):**

  - Transfers data from one location to another.


  ```assembly

  mov eax, 42   ; Move the value 42 into the eax register

  ```


- **ADD (Addition):**

  - Adds two values and stores the result.


  ```assembly

  add ebx, ecx  ; Add the value in ecx to the value in ebx

  ```


- **CMP (Compare):**

  - Compares two values without changing them, setting flags for conditional operations.


  ```assembly

  cmp edx, 10   ; Compare the value in edx with 10

  ```


- **JMP (Jump):**

  - Changes the flow of control by jumping to a specified location.


  ```assembly

  jmp label     ; Jump to the location labeled 'label'

  ```


### 1.4 Memory Addressing


Assembly language interacts with memory to read from or write to specific locations. Memory addresses are expressed using various addressing modes, including:


- **Immediate Addressing:**

  - Operands are constants or immediate values.


  ```assembly

  mov eax, 5     ; Move the immediate value 5 into the eax register

  ```


- **Register Addressing:**

  - Operands are stored in registers.


  ```assembly

  add ebx, ecx   ; Add the value in ecx to the value in ebx

  ```


- **Direct Addressing:**

  - Operands are specified by a memory address.


  ```assembly

  mov eax, [0x1000]  ; Move the value at memory address 0x1000 into eax

  ```


### 1.5 Conditional Branching


Assembly language supports conditional branching to alter the flow of execution based on certain conditions. Common conditional jump instructions include:


- **JE (Jump if Equal):**

  - Jumps to a specified location if the Zero Flag (ZF) is set.


  ```assembly

  cmp eax, ebx

  je  label        ; Jump to 'label' if eax is equal to ebx

  ```


- **JNE (Jump if Not Equal):**

  - Jumps to a specified location if the Zero Flag is not set.


  ```assembly

  cmp eax, ebx

  jne label       ; Jump to 'label' if eax is not equal to ebx

  ```


### 1.6 Conclusion


These basic concepts provide a foundation for understanding assembly language programming. In the next chapter, we will explore more advanced topics, including procedures, the stack, and system calls, as we continue our journey into the realm of low-level programming.


Comments

Houston We Have a Podcast

Translate