汇编基础-----常见命令基本使用
MOV:将数据从一个位置复制到另一个位置。
MOV destination, source
例如:
MOV RAX, RBX ; 将RBX寄存器中的值复制到RAX寄存器中
ADD/SUB:将两个操作数相加或相减。
ADD destination, source
SUB destination, source
例如:
ADD RAX, RBX ; 将RAX寄存器中的值加上RBX寄存器中的值,并将结果存储回RAX
INC/DEC:递增或递减操作数的值。
bash
INC operand
DEC operand
例如:
bash
INC RCX ; 将RCX寄存器中的值加1
CMP:比较两个操作数的值。
CMP operand1, operand2
例如:
bash
CMP RAX, RBX ; 比较RAX和RBX寄存器中的值
JMP:无条件跳转到指定位置执行。
bash
JMP destination
例如:
bash
JMP label1 ; 跳转到标签为label1的位置执行
JE/JNE:条件跳转,当相等或不相等时跳转。
bash
JE destination
JNE destination
例如:
bash
JE label1 ; 如果上一次比较结果为相等,则跳转到标签为label1的位置执行
CALL/RET:调用和返回子程序。
bash
CALL subroutine
RET
例如:
bash
CALL some_function ; 调用名为some_function的子程序
PUSH/POP:将数据推入堆栈或从堆栈中弹出数据。
bash
PUSH operand
POP operand
例如:
bash
PUSH RAX ; 将RAX寄存器中的值推入堆栈
LEA (Load Effective Address):加载有效地址,将一个内存地址加载到一个寄存器中,而不是加载内存中的值。
LEA RDI, [RAX + 8] ; 将RAX寄存器中的值加上8的偏移量的地址加载到RDI中
AND/OR/XOR/NOT:按位逻辑运算。
AND RAX, RBX ; RAX寄存器和RBX寄存器的值进行按位与运算
OR RDX, RCX ; RDX寄存器和RCX寄存器的值进行按位或运算
XOR RSI, RDI ; RSI寄存器和RDI寄存器的值进行按位异或运算
NOT RAX ; 对RAX寄存器的值进行按位取反
SHL/SHR/SAR:逻辑左移、逻辑右移、算术右移。
SHL RAX, 3 ; 将RAX寄存器中的值向左逻辑移位3位
SHR RCX, 1 ; 将RCX寄存器中的值向右逻辑移位1位
SAR RDX, 2 ; 将RDX寄存器中的值向右算术移位2位
LOOP:循环指令,根据CX/ECX/RCX寄存器中的计数值执行循环。
LOOP label1 ; 循环执行,直到CX/ECX/RCX寄存器中的值减为0
NOP:空操作,不执行任何操作,通常用于填充代码或调试。
NOP ; 空操作
HLT:停机指令,停止CPU执行。
HLT ; 停止CPU执行
CDQ/CQO:将双字扩展为四字或将四字扩展为八字。
rubyCDQ ; 将EAX中的有符号数扩展到EDX:EAX中
CQO ; 将RAX中的有符号数扩展到RDX:RAX中
REP:重复指令前缀,用于重复执行字符串操作等。
ruby
REP MOVSB ; 重复执行将字节从DS:SI移动到ES:DI的操作
CMOV:条件移动指令,根据条件码执行条件移动。
CMOVZ RAX, RBX ; 如果ZF标志位为1(表示相等),则将RBX的值移动到RAX
BSWAP:字节顺序交换指令,用于交换32位或64位寄存器中的字节顺序。
BSWAP EAX ; 交换EAX寄存器中的字节顺序
BSF/BSR:查找最低/高位设置位的指令。
BSF RCX, RAX ; 将RAX寄存器中的值的最低设置位的索引加载到RCX中
BSR RDX, RBX ; 将RBX寄存器中的值的最高设置位的索引加载到RDX中
CPUID:CPU信息指令,用于获取CPU相关信息。
CPUID ; 执行CPUID指令,返回CPU相关信息
RDTSC/RDTSCP:时间戳计数器指令,用于获取时间戳计数器的当前值。
RDTSC ; 将时间戳计数器的当前值加载到EDX:EAX中
RDTSCP ; 类似于RDTSC,但返回值包括了CPU核心编号
XCHG:交换指令,用于交换寄存器或内存中的值。
XCHG RAX, RBX ; 交换RAX和RBX寄存器中的值
XCHG [RDI], RSI ; 交换RDI寄存器指向的内存地址和RSI寄存器中的值
MUL/IMUL/DIV/IDIV:无符号乘法、有符号乘法、无符号除法、有符号除法指令。
MUL RBX ; 无符号乘法,将RAX和RBX中的值相乘,结果存放在RDX:RAX中
IMUL RCX, RDX, 5 ; 有符号乘法,将RDX和5相乘,结果存放在RCX中
DIV RBX ; 无符号除法,将RDX:RAX中的值除以RBX,商存放在RAX中,余数存放在RDX中
IDIV RBX ; 有符号除法,将RDX:RAX中的值除以RBX,商存放在RAX中,余数存放在RDX中
FPU指令:用于浮点数运算的指令集,如加载浮点数、加减乘除等。
FLD real_value ; 将实数值加载到FPU栈顶
FADD ST(0), ST(1) ; 将栈顶和次栈顶的浮点数相加,并将结果存放在栈顶
SIMD指令:用于向量化操作的指令集,如SSE、AVX等。
MOVAPS XMM1, XMM2 ; 将XMM2中的值复制到XMM1中
ADDPS XMM1, XMM2 ; 将XMM1和XMM2中的浮点数向量相加
控制指令:用于程序流程控制的指令,如条件跳转、循环等。
JCXZ label ; 如果CX寄存器为0,则跳转到指定标签
LOOP label ; 循环执行,直到CX寄存器为0
内存访问指令:用于访问内存的指令,如加载、存储等。
MOV [address], EAX ; 将EAX中的值存储到指定内存地址
MOV EAX, [address] ; 将指定内存地址中的值加载到EAX中
系统调用指令:用于与操作系统进行交互的指令,如Linux中的int 0x80、syscall等。
INT 0x80 ; 发起系统调用
SYSCALL ; 发起系统调用(在x86-64 Linux中)
辅助指令:用于辅助调试和优化的指令,如NOP、HLT、PAUSE等。
NOP ; 空操作,不执行任何操作
HLT ; 停止CPU执行
PAUSE ; 暂停CPU执行,用于优化