x86-64 Memory Architecture and mov Instructions: Deep Dive into Addressing Mechanisms, Stack Operati

x86-64 Memory Architecture and mov Instructions: Deep Dive into Addressing Mechanisms, Stack Operati

本文为纯手打原创硬核干货,适合学习计算机组成汇编CSAPP 的同学,欢迎真实阅读、交流。


Based on the x86-64 architecture, this article starts with the matrix-based physical implementation of main memory, systematically breaks down the memory addressing mechanism, the family of data transfer instructions, and the logic of stack operations. It will help you fully grasp the underlying principles of CPU-memory interaction and thoroughly understand the essence of the mov instruction.


I. Physical Implementation of Main Memory and Addressing

1.1 Matrix-Based Storage Structure

Modern main memory is implemented using a matrix structure, rather than a simple linear arrangement. The core motivation behind this design is to avoid the physical wiring challenges caused by “extremely long memory address lines.”

Core Idea: Map a one-dimensional address into a two-dimensional physical space through row and column decoding, significantly reducing the complexity of address decoding circuits.

1.2 Memory Model in x86-64

In the x86-64 architecture, the memory system has the following key characteristics:

FeatureDescription
Address SpaceTheoretically supports 2642^{64}264 distinct memory addresses
Address LengthEach memory address requires 64 bits in binary representation
Addressing GranularityEach address points to a single byte (1 byte = 8 bits)
Byte OrderLittle-Endian
Although the architecture supports a 2642^{64}264 address space, actual implementations typically use only 48 bits (256 TB) to avoid excessively large page tables.

II. Data Formats and mov Instruction Rules

x86-64 Data Types

x86-64 assembly instructions use a single-character suffix to explicitly indicate the operand size. This is fundamental to understanding instruction behavior:

SuffixFull NameSizeExample Instruction
bbyte1 byte (8 bits)movb
wword2 bytes (16 bits)movw
llong/double word4 bytes (32 bits)movl
qquad word8 bytes (64 bits)movq

2.1 Data Movement Instructions (mov)

InstructionEffect
movbmove byte
movwmove word
movlmove double word
movqmove quad word
InstructionEffect
movbmove byte
movwmove word

2.2 Special Transfer Instruction: movabsq

When handling 64-bit immediate values, the standard movq may cause truncation (sign extension). In such cases, movabsq must be used:

; Incorrect: immediate is truncated to 32 bits and then sign-extended movq $0x0011223344556677, %rax ; %rax = 0x0000000044556677 ❌ ; Correct: full 64-bit immediate transfer movabsq $0x0011223344556677, %rax ; %rax = 0x0011223344556677 ✓ 

III. x86-64 Register System

3.1 Hierarchical Structure of General-Purpose Registers

x86-64 registers support partial access, which is a key design for backward compatibility with 32/16/8-bit code:

Common x86-64 Registers

Data Consistency of Registers:
As shown above, these registers of different sizes are physically nested accesses to the same underlying storage unit.

This means registers of the same type completely share their contents:

  • Write synchronization: Writing to a lower-sized register (such as %eax) will also affect the corresponding 64-bit register (%rax).
  • Partial read: No matter which size alias you operate on, you are accessing the same data. If you write a 64-bit integer into %rax, you can later read its lower 32 bits through %eax or its lowest byte through %al.
In the x86-64 specification, writing to a 32-bit register (such as %eax) will automatically zero the upper 32 bits.

3.2 Common Registers Overview

64-bit32-bit16-bit8-bitUsage
%rax%eax%ax%alAccumulator, return value
%rbx%ebx%bx%blBase register
%rcx%ecx%cx%clCounter, loop variable
%rdx%edx%dx%dlData register
%rsi%esi%si%silSource index
%rdi%edi%di%dilDestination index
%r8-%r15%r8d-%r15d%r8w-%r15w%r8b-%r15bExtended registers

In functions, %rdi generally represents the first argument, %rsi the second argument, and %rcx often corresponds to the C-language index “i”.
Note that these are 64-bit registers corresponding to the long type. If the parameter type is different, the corresponding register variant must be used. For example, if the parameter is int, use %edi and %esi.


IV. Operand Addressing Modes

x86-64 provides flexible addressing methods, which can be divided into three categories: Immediate, Register, and Memory.
Memory refers to the value stored at the address contained in a register, which may be a value or another address.

4.1 Addressing Mode Quick Reference

TypeFormOperand ValueName
Immediate$ImmImmImmImmImmediate
RegisterraR[ra]R[ra]R[ra]Register
AbsoluteImmM[Imm]M[Imm]M[Imm]Absolute
Indirect(ra)M[R[ra]]M[R[ra]]M[R[ra]]Indirect
Base + displacementImm(rb)M[Imm+R[rb]]M[Imm + R[rb]]M[Imm+R[rb]]Base + displacement
Indexed(rb, ri)M[R[rb]+R[ri]]M[R[rb] + R[ri]]M[R[rb]+R[ri]]Indexed
Scaled indexed(rb, ri, s)M[R[rb]+R[ri]⋅s]M[R[rb] + R[ri] \cdot s]M[R[rb]+R[ri]s]Scaled indexed
📝 Scale factor s: can only be 1, 2, 4, 8 (convenient for array element access)

4.2 Address Calculation Example

Assume the following register and memory state:

AddressValueRegisterValue
0x1000xFF%rax0x100
0x1040xAB%rcx0x1
0x1080x13%rdx0x3
0x10C0x11--

Then the operand values are:

OperandCalculationResult
%raxR[%rax]0x100
0x104M[0x104]0xAB
$0x1080x1080x108
(%rax)M[0x100]0xFF
4(%rax)M[0x100 + 4]0xAB
9(%rax, %rdx)M[0x100 + 0x3 + 9]0x11
260(%rcx, %rdx)M[0x1 + 0x3 + 0x104]0x13
(%rax, %rdx, 4)M[0x100 + 0x3 * 4]0x11
  • Common scenario: %rdi is the array A in parameters, %rcx represents offset i
    • Registers and addressing logic
      %rdi = A (array base address/pointer)
      %rcx = i (index/offset)
    • Addressing mapping for different data types
      int *A: (%rdi, %rcx, 4) -> A[i]
      char *A: (%rdi, %rcx, 1) -> A[i]
      long *A: (%rdi, %rcx, 8) -> A[i]

V. Data Extension Transfer Instructions

5.1 Zero Extension

Extend smaller data to larger data, filling high bits with zero:

InstructionSourceDestinationEffect
movzbw8-bit16-bitzero-extend to word
movzbl8-bit32-bitzero-extend to double word
movzbq8-bit64-bitzero-extend to quad word
movzwl16-bit32-bitzero-extend to double word
movzwq16-bit64-bitzero-extend to quad word
  • Special equivalence: movzlq %ecx, %rax is equivalent to movl %ecx, %eax, because a 32-bit move automatically zero-extends to 64 bits.

5.2 Sign Extension

Extend smaller data to larger data, copying the sign bit into higher bits:

InstructionSourceDestination
movsbw8-bit16-bit
movsbl8-bit32-bit
movsbq8-bit64-bit
movswl16-bit32-bit
movswq16-bit64-bit
movslq32-bit64-bit
cltq%eax%rax(abbreviation of movslq %eax, %rax)
  • cltq = movslq %eax, %rax => %rax = sign-extend(%eax)

5.3 Extension Instruction Comparison Experiment

movq $0x0011223344556677, %rax ; %rax = $0x0000000044556677 (only low 8 bytes modified) movabsq $0x0011223344556677, %rax ; %rax = 0x0011223344556677 movb $0xAA, %dl ; %dl = 0xAA (10101010) movb %dl, %al ; %rax = 0x00112233445566AA (only lowest byte modified) movsbq %dl, %rax ; %rax = 0xFFFFFFFFFFFFFFAA (sign-extended, 1-filled) movzbq %dl, %rax ; %rax = 0x00000000000000AA (zero-extended, 0-filled) 

VI. Stack Operations: Push and Pop

In the x86-64 architecture, the stack is not merely a data structure; it is a hardware-encoded memory region maintained by the %rsp register. Its core logic lies in the reverse growth of addresses synchronized with pointer dereferencing.

6.1 Core Concept: Counterintuitive “Downward Growth”

The stack is a special region of memory used for temporarily storing data (such as local variables and saved register states).

  • Stack pointer: The %rsp register always stores the starting address of the current top element of the stack.
  • Downward growth: A push operation causes %rsp to move toward lower addresses. In other words, as more data is pushed, the numerical value in %rsp becomes smaller.
  • Operation unit: In x86-64 systems, the standard stack operation unit is a Quadword (8 bytes / 64 bits).

6.2 Instruction Decomposition: Micro-Operation Equivalence

push and pop are highly encapsulated instructions. Their execution flow can be decomposed into pointer arithmetic and memory access:

  • Push
    Executing pushq %rax causes the CPU to perform:
  1. Pointer decrement: subtract 8 from %rsp (move downward by 8 bytes to allocate space).
  2. Memory write: store the data in %rax into the new address pointed to by %rsp.
pushq %rax is fully equivalent to: subq $8, %rsp ; 1. stack pointer moves downward (address decreases) movq %rax, (%rsp) ; 2. write data to new top address 
  • Pop
    Executing popq %rax performs the reverse sequence:
  1. Memory read: copy the value pointed to by %rsp into %rax.
  2. Pointer increment: add 8 to %rsp (reclaim the 8-byte space).
popq %rax is fully equivalent to: movq (%rsp), %rax addq $8, %rsp 

6.3 State Trace: Register and Memory Instantaneous States

Below is a trace analysis assuming %rsp initially equals 0x8000:

Instruction%rax Value%rsp (Stack Top Address)Memory StateDescription
movq $0x123, %rax0x1230x8000M[0x8000] = ?Initialize register
pushq %rax0x1230x7FF8M[0x7FF8] = 0x123Pointer moves down 8 bytes and writes
movq $0x22, %rax0x220x7FF8M[0x7FF8] = 0x123Register overwritten, memory unchanged
pushq %rax0x220x7FF0M[0x7FF0] = 0x22Pointer moves down again and writes
popq %rax0x220x7FF8M[0x7FF8] = 0x123、M[0x7FF0] = 0x22Data loaded into register, pointer restored
Observe the last row popq %rax:
The pop operation only changes the %rsp pointer; it does not clear or erase old data in memory!
The 0x22 at address 0x7FF0 is not physically erased. Until overwritten by a future push, it is considered garbage data.

VII. Common Errors and Notes

7.1 Illegal Operand Combinations

Incorrect InstructionReasonCorrect Form
movb $0xF, (%ebx)Cannot use %ebx (32-bit) as address registermovb $0xF, (%rbx)
movl %rax, (%rsp)Suffix l does not match 64-bit register raxmovq %rax, (%rsp)
movw (%rax), 4(%rsp)Source and destination cannot both be memoryUse register as intermediary
movb %al, %sl%sl register does not existmovb %al, %sil
movq %rax, $0x123Immediate cannot be destination operandmovq $0x123, %rax
movl %eax, %dxDestination operand size incorrectmovl %eax, %edx
movb %si, 8(%rbp)Suffix b does not match 16-bit register simovw %si, 8(%rbp)

7.2 Key Principles

  1. mov is just a copy: No persistent link is established between source and destination; it is only a value copy.
  2. Memory-to-memory prohibited: x86-64 does not allow a single instruction to directly transfer data between two memory locations.
  3. Immediate constraints: Immediate values cannot be destination operands, and their size is limited by the instruction suffix.

VIII. Practice: C Code and Assembly Comparison

8.1 Swap Function

voidswap(long*xp,long*yp){long t0 =*xp;long t1 =*yp;*xp = t1;*yp = t0;}

Corresponding x86-64 assembly:

swap: movq (%rdi), %rax ; t0 = *xp (xp in %rdi) movq (%rsi), %rdx ; t1 = *yp (yp in %rsi) movq %rdx, (%rdi) ; *xp = t1 movq %rax, (%rsi) ; *yp = t0 ret 

Execution trace:

  • Initial: %rdi=0x120 (stores 123), %rsi=0x100 (stores 456)
  • After execution: 0x120 becomes 456, 0x100 becomes 123

8.2 Array Addressing

Assume long long array[8] base address is in %rdx and index 4 is in %rcx.
Goal: store array[4] into %rax

movq (%rdx, %rcx, 8), %rax # 1. Compute address %rdx + 4*8 # 2. Move 8 bytes from that memory address into %rax 

IX. Summary and Outlook

Starting from the matrix implementation of main memory, this article systematically reviewed the following aspects of the x86-64 architecture:

  1. Addressing system: 2642^{64}264 byte address space, byte-level addressing
  2. Data formats: b/w/l/q sizes with explicit instruction suffixes
  3. Register design: hierarchical partial access mechanism
  4. Flexible addressing: 9 memory addressing modes with scaled indexing
  5. Data extension: precise control of zero and sign extension
  6. Stack mechanism: push/pop operations growing toward lower addresses

Understanding these low-level mechanisms forms a solid foundation for subsequent study of arithmetic logic instructions, control flow, procedure calls, and memory hierarchy structures. Main memory is not only a container for data but also the core interface between the CPU and software. Mastering its working principles is essential to truly understanding the complete picture of computer systems.


References

  • “Computer Organization” course notes
  • Computer Systems: A Programmer’s Perspective (CS:APP), Chapter 3
  • Intel 64 and IA-32 Architectures Software Developer’s Manual

Last updated: 2026-02-26

Read more

FPGA(一)Quartus II 13.1及modelsim与modelsim-altera安装教程及可能遇到的相关问题

FPGA(一)Quartus II 13.1及modelsim与modelsim-altera安装教程及可能遇到的相关问题

零.前言         在学习FPGA课程时,感觉学校机房电脑用起来不是很方便,想着在自己电脑上下载一个Quartus II 来进行 基于 vhdl 语言的FPGA开发。原以为是一件很简单的事情,没想到搜了全网文章发现几乎没有一个完整且详细的流程教学安装(也可能是我没搜到,,ԾㅂԾ,,)【视频b站上有,搞完才发现T.T】,因此想做一个纯小白式安装教程,将网上分享的几位大佬关于安装部分的流程都总结到一文当中,包括软件及软件配套仿真和芯片库的安装,让大家花最少的时间完成安装。相关文章链接在文末。 多图预警 一.Quartus安装 1.首先需要先去百度网盘下载相关资料 下载链接:百度网盘 请输入提取码 提取码:qomk  2.下载的是压缩包,解压后可以看到13个文件 先打开QuartusSetup-13.1.0.162.exe文件开始安装。 3.安装流程 (1)打开后点击next (2)选择第一个accept,再点击next (3)选择文件夹可以自定义安装的位置,尽量建立一个新的文件夹(

【优质开源项目】AIGC开源推荐-全球情报监控平台worldmonitor

【优质开源项目】AIGC开源推荐-全球情报监控平台worldmonitor

1.概述 World Monitor 是一个开源的实时情报/监测仪表盘,聚合多类数据源(新闻、地理/卫星、航运/空中、财经、威胁情报等),提供交互式地理视图、AI 摘要、事件聚合与报警,支持 Web / PWA / Tauri 桌面三种运行方式,并可通过变体(WORLD / TECH / FINANCE)切换功能集。 2. 总体技术架构(分层视角) 客户端层(Browser / PWA / Tauri desktop) * • React + TypeScript + Vite 构建。 * • 地图/可视化:deck.gl(WebGL 3D globe)、MapLibre GL、D3

【VSCode Copilot登录失败终极指南】:9大常见问题与高效解决方案

第一章:VSCode Copilot登录失败的典型表现 当使用 VSCode 中的 GitHub Copilot 插件时,用户在尝试登录过程中可能会遇到多种异常现象。这些表现不仅影响代码补全功能的正常使用,还可能干扰开发流程。以下是常见的登录失败典型表现。 认证窗口无法加载 部分用户在点击“Sign in to GitHub”后,浏览器或内置认证弹窗长时间停留在加载状态,最终显示空白页面或提示网络错误。这通常与本地网络策略、代理设置或防火墙规则有关。 登录成功但插件无响应 尽管认证流程显示已完成,Copilot 图标仍显示未登录状态,且不提供任何代码建议。此时可在命令面板(Ctrl+Shift+P)中执行以下命令检查状态: # 检查 Copilot 当前会话状态 Developer: Reload With Extensions Disabled # 重新启用后再次尝试 GitHub Copilot: Sign in to GitHub 错误提示信息汇总

如何部署本地 stable diffusion 本地使用大模型Z Image Turbo

🛠️ 部署 Stable Diffusion 详细步骤(以 Automatic1111 WebUI 为例) 1. 准备工作(系统和硬件要求) * 操作系统: Windows 10/11, macOS (Apple Silicon 芯片), 或 Linux。NVIDIA: 推荐使用 NVIDIA 显卡(RTX 系列为佳),显存 (VRAM) 最好在 8GB 或以上。这是 Windows 上运行 SD 性能最好的选择。 * 显卡 (GPU): * AMD: 也可以,但设置可能更复杂,且性能通常不如 NVIDIA。 * Apple Silicon (M系列芯片): 在 macOS 上性能优秀,