小端存储
大端存储模式就是在存储数据时,高地址存放低位数据,低地址存放高位数据
比如:0x11223344 大端存储如下:
内存地址 | 数据 |
00000000 | 11 |
00000001 | 22 |
00000002 | 33 |
00000003 | 44 |
小端存储与大端存储刚好相反,高位地址存放数据的高位,低位地址存放数据的地位,如:
内存地址 | 数据 |
00000000 | 44 |
00000001 | 33 |
00000002 | 22 |
00000003 | 11 |
常用非跳转汇编指令
指令 | 含义 | 类型 |
mov | 数据移动 | 数据复制指令 |
add | 两数相加 | 运算指令 |
sub | 两数相减 | 运算指令 |
and | 逻辑与运算 | 位运算指令 |
or | 逻辑或运算 | 位运算指令 |
xor | 逻辑异或运算 | 位运算指令 |
not | 逻辑或运算 | 位运算指令 |
movs | 内存复制 | 数据复制指令 |
stos | 累计器中数据复制到【EDI】中 | 数据复制指令 |
rep | 重复执行指令,和其他指令搭配使用 | 特殊指令 |
注:
r8/16/32表示8/16/32位通用寄存器
m8/16/32 代表8/16/32位内存
imm8/16/32 代表8/16/32位立即数
mov指令:
mov 参数1,参数2
将参数2的值放到参数1中,参数1只能是寄存器或内存,不能是立即数
指令格式:
MOV r/m8,r8
MOV r/m16,r16
MOV r/m32,r32
MOV r8,r/m8
MOV r16,r/m16
MOV r32,r/m32
MOV r8, imm8
MOV r16, imm16
MOV r32, imm32
mov指令不支持从内存到内存的数据移动
在使用mov指令时要前后两个参数的宽度要保持一致
add指令:
add 参数1,参数2
将参数2的值+参数1的值,存入参数1的存储空间中
参数1只能是内存或寄存器,不能是立即数
指令格式:
ADD r/m8, imm8
ADD r/m16,imm16
ADD r/m32,imm32
ADD r/m16, imm8
ADD r/m32, imm8
ADD r/m8, r8
ADD r/m16, r16
ADD r/m32, r32
ADD r8, r/m8
ADD r16, r/m16
ADD r32, r/m32
sub 参数1,参数2
将参数1的值-参数2的值存入参数1的位置。
参数1不能是立即数
指令格式:
SUB r/m8, imm8
SUB r/m16,imm16
SUB r/m32,imm32
SUB r/m16, imm8
SUB r/m32, imm8
SUB r/m8, r8
SUB r/m16, r16
SUB r/m32, r32
SUB r8, r/m8
SUB r16, r/m16
SUB r32, r/m32
MOVS指令
MOVS指令将[ESI]的数据存放到[EDI]的中。
BYTE/WORD/DWORD
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] 简写为:MOVSB
MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] 简写为:MOVSW
MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] 简写为:MOVSD
//MOVS指令只要执行一次,ESI和EDI的值会变化,根据BYTE/WORD/DWORD和寄存器EFL中DF位的值的变化,DF为0时加,由低地址向高地址复制。DF为1时减,由高地址向低地址复制。EDI和ESI分别加减1/2/4
例:以地址0x0019ff84为基址将数据复制到0x0019ffac为起始目标地址的内存中,由低位向高位复制。
复制结果如下:
STOS指令
将Al/AX/EAX的值存储到[EDI]指定的内存单元,AL/AX/EAX取决于数据宽度。
标志寄存器DF为0时每次执行后EDI + 数据宽度,
标志寄存器DF为1时每次执行后EDI - 数据宽度
STOS BYTE PTR ES:[EDI] 简写为STOSB
STOS WORD PTR ES:[EDI] 简写为STOS
STOS DWORD PTR ES:[EDI] 简写为STOSD
例:将0x11111111存入EAX,使用STOS指令将其存入EDI为始地址的内存中,代码如下:
结果如下:
REP指令
按计数寄存器 (ECX) 中指定的次数重复执行字符串指令
例:
mov eax,0x22222222
mov edi,0x0019ff98
mov ecx,8
rep stos
执行结果: