汇编基础-----mov与常见寻址方式
64位通用寄存器
- RAX:累加器。在算术和逻辑运算中常用作临时数据存储,也用于函数返回值。
- RBX:基址寄存器。在内存寻址中作为基址,通常用于存储指向数据的指针。
- RCX:计数寄存器。通常用于循环计数、控制流程、输入/输出端口操作等。
- RDX:数据寄存器。与RCX类似,用于存放数据或指针。
- RSI:源索引寄存器。通常用于字符串操作中的源数据地址。
- RDI:目的索引寄存器。通常用于字符串操作中的目标数据地址。
- RBP:基址指针寄存器。通常用于建立堆栈帧。
- RSP:堆栈指针寄存器。指向当前栈顶,用于管理函数调用和局部变量。
- R8-R15:扩展寄存器。用于扩展寄存器数量,扩展操作数的寻址范围。
Mov指令
在汇编语言中,mov(move)是一条基本的指令,用于将数据从一个位置移动到另一个位置。其功能可以总结如下:
数据传输: mov 指令用于将数据从一个位置(寄存器、内存或立即数)复制到另一个位置(寄存器、内存)。
赋值操作: 最常见的用途是将一个数值或数据对象(如寄存器、内存中的值)赋给另一个位置,可以是寄存器、内存或立即数。
移动数据: 虽然名字是“move”,但实际上 mov 指令并不是真正意义上的“移动”数据,而是复制数据。原始数据仍然保留在原位置。
寄存器之间的数据传递: mov 指令可用于在寄存器之间传递数据,这对于数据处理和算术逻辑操作非常重要。
内存和寄存器之间的数据传递: mov 指令也允许在内存和寄存器之间传递数据。这对于从内存中加载数据到寄存器或将寄存器中的数据存储回内存非常有用。
基本的 mov 语法如下:
mov destination, source
其中 destination 是目标操作数,source 是源操作数。数据从源操作数复制到目标操作数。可以是寄存器、内存地址或立即数。
下面是一些示例:
将一个立即数(常数)移动到寄存器中:
mov rax, 10 ; 将10移动到rax寄存器
将一个寄存器的值移动到另一个寄存器中:
mov rbx, rax ; 将rax寄存器中的值移动到rbx寄存器
将内存中的值移动到寄存器中:
mov rdx, qword [rsi] ; 将rsi寄存器中的地址处的qword(64位)值移动到rdx寄存器
将寄存器中的值移动到内存中:
mov qword [rdi], rbx ; 将rbx寄存器中的值移动到rdi寄存器中的地址处
在这些示例中,rax, rbx, rdx, rsi, 和 rdi 是通用寄存器。qword 是64位数据类型的标识符,表示"quadword"。
常见寻址方式
在64位汇编语言中,常见的寻址方式包括以下几种:
立即数寻址(Immediate Addressing):
使用立即数作为操作数。例如:
mov rax, 10 ; 将立即数10移动到rax寄存器
寄存器寻址(Register Addressing):
使用寄存器中的值作为操作数。例如:
mov rbx, rax ; 将rax寄存器中的值移动到rbx寄存器
直接寻址(Direct Addressing):
直接访问内存地址中的数据。例如:
mov rdx, qword [0x1000] ; 将内存地址0x1000处的qword值移动到rdx寄存器
间接寻址(Indirect Addressing):
使用寄存器中的值作为内存地址,间接访问内存中的数据。例如:
mov rax, rbx ; 将rbx寄存器中的值(地址)移动到rax寄存器
mov rdx, qword [rax] ; 将rax寄存器中的地址处的qword值移动到rdx寄存器
基址寻址(Base Addressing):
使用基址寄存器加上一个偏移量作为内存地址。例如:
mov rsi, qword [rbx + 8] ; 将rbx寄存器中的值加上8作为地址,访问其中的qword值,并移动到rsi寄存器
变址寻址(Index Addressing):
使用变址寄存器加上一个偏移量作为内存地址。例如:
mov rdi, qword [rbp + rcx * 4] ; 将rbp寄存器中的值加上rcx寄存器中的值乘以4作为地址,访问其中的qword值,并移动到rdi寄存器
基址加变址寻址(Base plus Index Addressing):
同时使用基址寄存器和变址寄存器加上一个偏移量作为内存地址。例如:
mov rax, qword [rbx + rsi * 2 + 16] ; 将rbx寄存器中的值加上rsi寄存器中的值乘以2再加上16作为地址,访问其中的qword值,并移动到rax寄存器
这些是在64位汇编语言中常见的寻址方式。通过这些方式,程序可以有效地访问内存中的数据。