文章目录

  • 一、通用寄存器
  • 1、通用寄存器简介
  • 2、寄存器结构关系
  • 3、DTdebug验证
  • 二、内存读写
  • 1.寄存器与内存
  • 2.内存写入/读取数据


一、通用寄存器

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

其功能和上面差不多。

devmem读寄存器_devmem读寄存器


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位寄存器之间都存在一定关系。

devmem读寄存器_寄存器_02


上图中0—32表示32位cpu通用寄存器,0—15表示16位cpu通用寄存器,同理0—7表示8位cpu通用寄存器。

devmem读寄存器_操作数_03

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

再看后半部分

devmem读寄存器_编程语言_04


由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界面

devmem读寄存器_操作数_05


开始验证:

打开一个exe程序

devmem读寄存器_通用寄存器_06


在第一行输入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

devmem读寄存器_寄存器_07


F8,开始验证,第一次F8,EAX由00000000变成AAAAAAAA

devmem读寄存器_devmem读寄存器_08


第二次F8,EAX由AAAAAAAA变成AAAABBBB,验证了EAX的前一部分为AX

devmem读寄存器_编程语言_09


第三次F8,EAX由AAAABBBB变成AAAADDBB,验证了AX后半部分即高位为AH

devmem读寄存器_操作数_10


第四次F8,EAX由AAAADDBB变成AAAADDEE,验证了AX前半部分即低位为AL

devmem读寄存器_寄存器_11

二、内存读写

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.内存写入/读取数据

devmem读寄存器_编程语言_12


写入:

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中。