精简汇编语言笔记(四) ——非跳转指令和小端存储

小端存储

        大端存储模式就是在存储数据时,高地址存放低位数据,低地址存放高位数据

比如:0x11223344    大端存储如下:

                     

内存地址数据
0000000011
0000000122
0000000233
0000000344

 

小端存储与大端存储刚好相反,高位地址存放数据的高位,低位地址存放数据的地位,如:

内存地址数据
0000000044
0000000133
0000000222
0000000311

常用非跳转汇编指令

  

指令含义类型
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

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值