一、核心概念
-
寄存器:CPU内部的高速存储单元(如EAX、EBX、x86中的RAX、ARM中的R0等)
-
内存地址:变量存储在内存中的位置(如
0x1000
) -
指令:操作寄存器和内存的命令(如
MOV
,STR
,LDR
)
二、基础赋值场景
场景1:立即数赋值(直接赋值数字)
; x86汇编示例:将数字5赋给寄存器EAX
MOV EAX, 5
; ARM汇编示例:将数字5赋给寄存器R0
MOV R0, #5
场景2:寄存器到寄存器的赋值
; x86:将EAX的值复制到EBX
MOV EBX, EAX
; ARM:将R0的值复制到R1
MOV R1, R0
三、变量赋值的三种典型情况
1. 全局变量(存储在数据段)
; x86示例
section .data
myVar DD 0 ; 定义一个32位全局变量,初始值0
section .text
MOV EAX, 10 ; 将10存入EAX
MOV [myVar], EAX ; 将EAX的值存入myVar对应的内存地址
2. 局部变量(存储在栈中)
; x86示例:在栈上分配一个局部变量
sub esp, 4 ; 分配4字节空间(32位系统)
mov [esp], 20 ; 将20存入栈顶位置(变量赋值)
; 等效于C语言:
; int localVar = 20;
3. 静态变量(存储在数据段/BSS段)
; x86示例:未初始化的静态变量
section .bss
staticVar RESD 1 ; 保留4字节空间
section .text
MOV DWORD [staticVar], 30 ; 赋值为30
四、不同数据类型的处理
1. 整数类型
; x86:赋值32位整数
MOV DWORD [myInt], 42 ; DWORD表示4字节操作
2. 数组
; x86:访问数组元素
mov eax, [array + 4] ; 获取array[1](假设每个元素4字节)
3. 指针
; x86:指针间接赋值
mov ebx, [pointer] ; 先获取指针指向的地址
mov [ebx], 100 ; 向该地址写入100
五、关键差异总结
六、实践建议
-
使用调试工具:通过GDB或OllyDbg观察赋值过程
-
对比C代码:编写简单C程序,用
gcc -S
生成汇编代码 -
注意架构差异:x86使用
MOV
内存到寄存器需要显式操作,ARM需要LDR/STR
例如以下C代码:
int main() {
int a = 10;
int b = a;
return 0;
}
生成的x86汇编关键部分:
mov DWORD [ebp-4], 10 ; a = 10
mov eax, DWORD [ebp-4] ; 将a的值加载到eax
mov DWORD [ebp-8], eax ; b = eax中的值
高级语言的变量赋值本质上是 通过寄存器中转,在内存和CPU之间传递数据 的过程。