汇编(三)存储模式和指令拓展
存储模式和汇编指令
前言
本文涉及计算机存储模式,DTdebug对存储方式的实验。
以及MOVS、STOS、REP指令的介绍和演示;
存储模式
分为:大端模式和小端模式;
大端模式:数据低位在高位,数据高位在低位;
详细解释就是,数据的高位字节存放在内存的低地址端,数据的高位字节存放在内存的高地址端;
内存地址的低位到高位位就是从小到大;比如下面四个地址就是从低位到高位:
地址低位 | 地址高位 | ||
---|---|---|---|
0x11 | 0x12 | 0x13 | 0x14 |
小端模式;数据低位在低位,数据高位在高位;
通过实例来看一下:
假设,要将0x1A2B3C4D以大端模式存入上例,那么结果就是:
1 | CODE |
地址低位 | 地址高位 | ||
---|---|---|---|
0x11 | 0x12 | 0x13 | 0x14 |
4D | 3C | 2B | 1A |
数据高位 | 数据低位 |
以上就是大端存储的示范。
至于为什么存放是从1A开始而不是1开始。是因为以字节为单位进行的,1A是16进制,刚好是二进制的八位,也就是一字节。
DTdebug使用
在上一篇文章里只简单介绍了DTdebug的不同窗口,并没有做详细使用介绍。
在dTdebug的主界面左下角,有一个命令栏,可以进行一系列操作,比如查询一个地址当前的状态:
并不是所有的地址都可以访问,只有已经被分配的地址才可以通过这个方式查看。也就是说,在栈窗口中出现的地址都是可以访问的。
1 | CODE |
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 | CODE |
2、使用命令查找内存,以字节搜索
1 | CODE |
3、将内存位和数据对比:
3DFF88 | 3DFF89 | 3DFF8A | 3DFF8B |
---|---|---|---|
6 7 | 4 5 | 2 3 | 01 |
经过实验可以得出,这个程序是使用小端存储模式,实际上基本所有的pc端都采用的是小端存储,手机大部分采用的是大端存储。
movs指令与stos指令
MOVS指令
movs:实现内存与内存之间的数据传递,mov指令只能实现寄存器与内存的数据传递无法实现内存与内存。
1 | CODE |
movs指令存储一字节:
提前更改好了ESI(数据来源)和EDI(存储地址),当然也可以用mov指令存入。
此刻堆栈中数据:
F8执行此行命令后结果:
因为movs指令中指定的宽度是byte,所以只复制了一字节内容。即图中的78。
下面再放一张两字节(WORD)的效果图,其余就不放了,占篇幅。
两字节,就是图中的5678.
STOS指令
stos:将寄存器EAX中的数值传递到EDI所指的地址中,并且受标志寄存器EFL中DF位(第 十位)的影响,edi中的地址也会随之改变。具体变化与传递数值宽度有关。这个放 在后面单独写一篇。
上图为标志寄存器不同位的意义。
1 | CODE |
和movs一样,能对不同宽度的数据进行复制移动。效果如下图:
REP指令
REP:rep指令常和串传送指令搭配使用
功能:根据寄存器ECX的值(十六进制),重复执行后面的指令。10就是执行16次.
1 | CODE |
这三条指令的效果如图,为了更加清晰我将EAX中数据改为了123456789;
自评
学习总耗时:两天零散时间以及空课。
学习效率80分吧,总体上还不错,应该继续努力。
接下来要让自己静下来,提高效率。
目标:堆栈
加油!即使是如此愚蠢的我,也能够成为神明!