存储模式和汇编指令

前言

本文涉及计算机存储模式,DTdebug对存储方式的实验。

以及MOVS、STOS、REP指令的介绍和演示;

存储模式

分为:大端模式和小端模式;

大端模式:数据低位在高位,数据高位在低位;

详细解释就是,数据的高位字节存放在内存的低地址端,数据的高位字节存放在内存的高地址端;

内存地址的低位到高位位就是从小到大;比如下面四个地址就是从低位到高位:

地址低位 地址高位
0x11 0x12 0x13 0x14

小端模式;数据低位在低位,数据高位在高位;

通过实例来看一下:

假设,要将0x1A2B3C4D以大端模式存入上例,那么结果就是:

1
2
CODE
MOV DWORD PTR DS:[0x00000011]
地址低位 地址高位
0x11 0x12 0x13 0x14
4D 3C 2B 1A
数据高位 数据低位

以上就是大端存储的示范。

至于为什么存放是从1A开始而不是1开始。是因为以字节为单位进行的,1A是16进制,刚好是二进制的八位,也就是一字节。

DTdebug使用

在上一篇文章里只简单介绍了DTdebug的不同窗口,并没有做详细使用介绍。

在dTdebug的主界面左下角,有一个命令栏,可以进行一系列操作,比如查询一个地址当前的状态:

并不是所有的地址都可以访问,只有已经被分配的地址才可以通过这个方式查看。也就是说,在栈窗口中出现的地址都是可以访问的。

1
2
3
4
CODE
db 18FF9C //db就是字节,查看也是以一个字节查看
//两个字节就是dw
//四个字节就是dd

date: 2021-03-11 14:42:35
cover: https://s3.ax1x.com/2021/03/11/6NaG8J.png
tags: 汇编语言
top_img: https://s3.ax1x.com/2021/03/11/6NawVK.png

利用DTdebug判断程序存储模式

1、使用mov指令往内存中存入数据:

1
2
CODE
MOV DWORD PTR DS:[3DFFD88],1234567

2、使用命令查找内存,以字节搜索

1
2
CODE
db 3dffd88

3、将内存位和数据对比:

3DFF88 3DFF89 3DFF8A 3DFF8B
6 7 4 5 2 3 01

6dugjU.png

经过实验可以得出,这个程序是使用小端存储模式,实际上基本所有的pc端都采用的是小端存储,手机大部分采用的是大端存储。

movs指令与stos指令

MOVS指令

movs:实现内存与内存之间的数据传递,mov指令只能实现寄存器与内存的数据传递无法实现内存与内存。

1
2
3
4
5
6
CODE
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] //移动一个字节也就是八位

MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI] //移动两个字节,十六位

MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] //移动四个字节,三十二位

movs指令存储一字节:

6tzR7d.png

提前更改好了ESI(数据来源)和EDI(存储地址),当然也可以用mov指令存入。

此刻堆栈中数据:

6tzTc8.png

F8执行此行命令后结果:

6tzI9P.png

因为movs指令中指定的宽度是byte,所以只复制了一字节内容。即图中的78。

6tz20H.png

下面再放一张两字节(WORD)的效果图,其余就不放了,占篇幅。

6tz20H.png

两字节,就是图中的5678.

STOS指令

stos:将寄存器EAX中的数值传递到EDI所指的地址中,并且受标志寄存器EFL中DF位(第 十位)的影响,edi中的地址也会随之改变。具体变化与传递数值宽度有关。这个放 在后面单独写一篇。

6Jxnat.png

上图为标志寄存器不同位的意义。

1
2
3
4
5
6
CODE
STOS BYTE PTR ES:[EDI]

STOS WORD PTR ES:[EDI]

STOS DWORD PTR ES:[EDI]

和movs一样,能对不同宽度的数据进行复制移动。效果如下图:

6tz4ht.png

REP指令

REP:rep指令常和串传送指令搭配使用
功能:根据寄存器ECX的值(十六进制),重复执行后面的指令。10就是执行16次.

1
2
3
4
5
6
CODE
MOV ECX,4 //将4存入ECX,即rep指令执行次数

MOV EDI,0AFF9F0 //将目标地址存入EDI

REP STOS DWORD PTR ES:[EDI] //将EAX数据复制到EDI指向地址

这三条指令的效果如图,为了更加清晰我将EAX中数据改为了123456789;

6tzo1f.png

自评

学习总耗时:两天零散时间以及空课。

学习效率80分吧,总体上还不错,应该继续努力。

接下来要让自己静下来,提高效率。

目标:堆栈

加油!即使是如此愚蠢的我,也能够成为神明!