通用寄存器和汇编指令以及内存的读写

滴水逆向之4月17日日记

  1. CPU是如何计算2+3的?(涉及内容:逻辑运算、移位、数据宽度)

2+3=5                      

X:0010    R:0001       

Y:0011                 

                            

       0010

   Xor 0011

       0001

  

 0010

&  0011

   0010

左移:0010<<1==0100

X:0001

Y:0100         R:0101

0001                     0001

Xor     0100                  &  0100

        0101                     0000

 左移:0000<<1==0000

     当最终结果为0000时,结果为第二次计算出的R,即此题答案为0101十进制数为5

  1. 如果想获取某个值的第N位的值是多少?

  想获取第几位,就将第几位用1来表示,其余位用0表示

  如:8F  获取第四位的值

       10001111

And    00001000

       00001000

即可得出第四位的值为1

  1. 最简单的加密算法:

  要加密的数据:2015

密钥:54

加密后的结果:7441

  因数据是四位,密钥为两位,即可将数据分为两位一组进行加密

    00100000 (代表20)          00010101 (代表15)

^   01010100  (代表54)       ^  01010100  (代表54)

    01110100   (74)            01010001  (41)

解密后的结果:2015

    01110100 (74)            01010001(41)

^   01010100  (54)          ^  01010100(54)

    00100000(20)               00000101 (15)

   

  • 通用寄存器

32位通用寄存器的指定用途

寄存器

   主要用途

编号

存储数据的范围

EAX

累加器

0

0-0xFFFFFFFF

ECX

计数

1

0-0xFFFFFFFF

EDX

I/O指针

2

0-0xFFFFFFFF

EBX

DS段的数据指针

3

0-0xFFFFFFFF

ESP

堆栈指针

4

0-0xFFFFFFFF

EBP

SS段的数据指针

5

0-0xFFFFFFFF

ESI

字符串操作的原指针:SS段的数据指针

6

0-0xFFFFFFFF

EDI

字符串操作的目标指针:ES段的数据指针

7

0-0xFFFFFFFF

1>. 通用寄存器

通用寄存器

寄存器

编号(二进制)

编号(十进制)

32位

16位

8位

EAX

AX

AL

000

0

ECX

CX

CL

001

1

EDX

DX

DL

010

2

EBX

BX

BL

011

3

ESP

SP

AH

100

4

EBP

BP

CH

101

5

ESI

SI

DH

110

6

EDI

DI

BH

111

7

MOV 第一个数 第二个数

MOV:操作码    第一个数:目标操作数   第二个数:源操作数

MOV:将源操作数存放到目标操作数中

要求:目标操作数与源操作数的数据宽度相同

MOV的语法:(重要的汇编指令)

  1. MOV r/m8,r8              r:通用寄存器
  2. MOV r/m16,r16            m:代表内存
  3. MOV r/m32,r32            imm:代表立即数
  4. MOV r8,r/m8            r8:代表8位通用寄存器
  5. MOV r16,r/m16            m8:代表8位内存
  6. MOV r32,r/m32            imm8:代表8位立即数
  7. MOV r8,imm8

2>.MOV 目标操作数,源操作数

作用:拷贝源操作数到目标操作数

  1. 源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元。
  2. 目标操作数可以是通用寄存器、段寄存器或者时内存单元。
  3. 操作数的宽度必须一致。
  4. 源操作数的目标操作数不能同时为内存单元。*
  1. .ADD指令
  1. ADD AL,imm8
  2. ADD AX,imm16
  3. ADD EAX,imm32
  4. ADD r/m8,imm8
  5. ADD r/m16,imm16
  6. ADD r/m32,imm8
  7. ADD r/m8,r8
  8. ADD r/m16,r16
  9. ADD r/m32,r32
  10. ADD r8,r/m8
  11. ADD r16,r/m16
  12. ADD r32,r/m32
  1. .SUB指令
  1. SUB AL,imm8
  2. SUB AX,imm16
  3. SUB EAX,imm32
  4. SUB r/m8,imm8
  5. SUB r/m16,imm16
  6. SUB r/m32,imm32
  7. SUB r/m16,imm8
  8. SUB r/m32,imm8
  9. SUB r/m8,r8
  10. SUB r/m16,r16
  11. SUB r/m32,r32
  12. SUB r8,r/m8
  13. SUB r16,r/m16
  14. SUB r32,r/m32
  1. .  AND指令(与)

    1&1==1,1&0==0,0&0==0

  1. .  OR指令(或)

     1|1==1,1|0==1,0|0==0

  1. .  XOR指令(异或)

     1^1==0,0^0==0,1^0==1,0^1==1

  1. .  NOT指令(非)

五.内存的读写

1>.寄存器与内存的区别

1.寄存器位于CPU内部,执行速度快,但比较贵。

2.内存速度相对较慢,但成本较低,所以可以做的很大。

3.寄存器和内存没有本质区别,都是用于存储数据结构的容器,都是定宽的。

4.寄存器常用的有8个:EAX,BCX,EDX,EBX,ESP,EBP,ESI,EDI

5.计算机中的几个常用计量单位:byte word dword

Byte 字节= 8(BIT)

Word 字  =16(bit)

Dword 双字=32(bit)

1KB =1024 BYTE

1MB =1024 KB

1GB =1024 MB

每一块内存都会有一个编号

6.内存的数量特别庞大,无法为每个内存单元都起一个名字,所以用编号来代替,我们称计算机CPU是32位或者64位,有很多书上之所以叫32位计算机是因为寄存器的宽度是32位的,是不准确的,因为还有很多寄存器是大于32位的。

计算机内存的每一个字节都会有一个编号(即内存编号的单位是字节)

0x00000000

0x00000001

0x00000002

……

……

0xFFFFFFFF

32位计算机的编号最大是32位,也就是32个1,换成16进制位FFFFFFFF,也就是说,32位计算机内存寻址的最大范围是4G.

内存的单位是字节,那内存中能存储的信息最多为:FFFFFFFF+1字节,即4G。

2>.内存

1.内存格式:

① 每个内存单元的宽度为8

② [编号]称为地址

③ 地址的作用:从内存中读入数据

2.从指定内存中写入/读入数据

Mov dword ptr ds:[0x0012FF34]

Mov eax,dword ptr ds:[0x0012FF34]

Dword :要读/写多少 此时是4字节 byte==1字节

 word==2字节

Prt:point 代表后面是一个指针(指针的意思是里面存的不是普通的值,而是个地址)

Ds:段寄存器

0x0012FF34:内存编号,必须是32位的,前面0可以省略

注意:地址编号不要随便写,因为内存是有保护的,并不是所有的内存都可以直接读写(需要特别处理)

建议地址编号写成esp的值

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值