逆向学习03(通用寄存器-内存读写)

一、通用寄存器

1、通用寄存器简介

通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。通用寄存器的长度取决于机器字长,汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。

16位cpu通用寄存器共有8个:AX,CX,DX,BX,BP,SP,SI,DI.
八个寄存器都可以作为普通的数据寄存器使用。

但有的有特殊的用途:AX为累加器,CX为计数器,BX,BP为基址寄存器,SI,DI为变址寄存器,BP还可以是基指针,SP为堆栈指针。

除16位cpu通用寄存器外,目前还有8位cpu通用寄存器和32位cpu通用寄存器。
8位cpu通用寄存器共有8个:AL,CL,DL,BL,AH,CH,DH,BH:
32位cpu通用寄存器共有8个:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
其功能和上面差不多。
在这里插入图片描述
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

2、寄存器结构关系

观察32位于16位通用寄存器对应名称,例如32位通用寄存器中EAX于16位通用寄存器中AX对比可以看出来,两则在名称上仅差一个“E”,那么除名称外,实际上两者是否存在一定的关系呢?

答案是:存在,而且不仅在32位寄存器于16位寄存器之间存在关系,在16位于8位之间,32位于8位寄存器之间都存在一定关系。
在这里插入图片描述
上图中0—32表示32位cpu通用寄存器,0—15表示16位cpu通用寄存器,同理0—7表示8位cpu通用寄存器。
在这里插入图片描述

观察这一部分可以发现,EAX被分为两部分,整个EAX包括0—31,在这其中0—15表示就是AX,没错,AX就在EAX里面,简单来说EAX的前一部分就是AX,同样的,ECX的前一部分是CX,EDX的前一部分就是DX等等。

再看后半部分
在这里插入图片描述
由32位cpu通用寄存器与16位cpu通用寄存器的关系可以推测16位cpu通用寄存器与8位cpu通用寄存器的关系。

看图可以发现,16位cpu通用寄存器的上半部分就是8位cpu通用寄存器,即AX是由AH与AL组成,CX是由CH与CL组成,DX是由DH与DL组成。

所以我们由以上关系可以推测,32位cpu通用寄存器与8位cpu通运寄存器的关系,那么我们还可以推测,64位cpu通用寄存器包括以后可能会出现128位cpu通用寄存器,256位cpu通用寄存器之间的关系。

3、DTdebug验证

首先先介绍DTdebug界面
在这里插入图片描述
开始验证:
打开一个exe程序
在这里插入图片描述
在第一行输入MOV指令

MOV EAX,0xAAAAAAAA

在第二行输入MOV指令

MOV AX,0xBBBB

在第三行输入MOV指令

MOV AH,0xDD
在第四行输入MOV指令
```c
MOV AL,0xEE

MOV指令语法格式

MOV 目标操作数,源操作数

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

(指令要求目标操作数与源操作数宽度需要保持一致,所以不同的目标操作数对应源操作数位数不同。)
在MOV指令中:
1)源操作数可以是立即数,通用寄存器,段寄存器,或者内存单元
2)目标操作数可以是通用寄存器,段寄存器或者内存单元
3)操作数的宽度必须一样
4)源操作数和目标操作数不能同时位内存单元

除MOV指令外,常用汇编指令
SUB 相减指令
ADD 相加指令
AND 相与指令
OR 或指令
XOR 异或指令
NOT 非指令
LEA 取地址

输入完成之后,此时EAX的数值还是00000000
在这里插入图片描述
F8,开始验证,第一次F8,EAX由00000000变成AAAAAAAA
在这里插入图片描述
第二次F8,EAX由AAAAAAAA变成AAAABBBB,验证了EAX的前一部分为AX
在这里插入图片描述
第三次F8,EAX由AAAABBBB变成AAAADDBB,验证了AX后半部分即高位为AH
在这里插入图片描述
第四次F8,EAX由AAAADDBB变成AAAADDEE,验证了AX前半部分即低位为AL
在这里插入图片描述

二、内存读写

1.寄存器与内存

寄存器与内存的区别:

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

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

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

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

5、计算机中的几个常用计量单位: BYTE WORD DWORD

BYTE   字节
1BYTE = 8 BIT
WORD   字
1WORD = 16 BIT
DWORD  双字
1DWORD = 32 BIT

6、计算机内存的每一个字节都会有一个编号,即内存编号的单位是字节
例如32位的电脑把内存编号从0x00000000编号到0xFFFFFFFF

0x 00000000
0x 00000001
0x 00000002
……
0x FFFFFFFF

一共有2^32+1次方个编号

因为32位计算机它的编号可以有2^32次方个,也就是说可以寻址到2的32次方个内存快,一个内存快为一个字节,所以最多可以识别4G的内容

并且几位电脑就代表寻址能力,也就是支持的内存大小能力,64位系统最多可以支达128 GB的内存,而32位系统最多只可以支持4G内存。

2.内存写入/读取数据

在这里插入图片描述
写入:
mov 容器(byte,word,dword) ptr ds:[内存地址编号],0x数据

读取:
mov 要被读入的容器,读取的数据宽度 ptr ds:[地址编号]

例如

mov dword ptr ds:[0x0012EF34],0x12345678 //把立即数0x12345678写入内存地址编号为0x0012EF34的内存中。
mov eax,dword ptr ds:[0x0012EF34] //读取内存编号为0x0012EF34里面的值到寄存器eax中。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值