汇编(三)存储模式和指令拓展

2021/4/22 22:56:09

本文主要是介绍汇编(三)存储模式和指令拓展,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

存储模式和汇编指令

文章目录

  • 存储模式和汇编指令
  • 前言
  • 存储模式
  • 利用DTdebug判断程序存储模式
  • movs指令与stos指令
    • MOVS指令
    • STOS指令
    • REP指令
  • 自评

前言

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

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

存储模式

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

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

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

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

地址低位地址高位
0x110x120x130x14

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

通过实例来看一下:

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

MOV DWORD PTR DS:[0x00000011]
地址低位地址高位
0x110x120x130x14
1A2B3C4D
数据高位数据低位

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

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

DTdebug使用

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

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

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

db 18FF9C                  //db就是字节,查看也是以一个字节查看
                           //两个字节就是dw
                           //四个字节就是dd

利用DTdebug判断程序存储模式

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

MOV DWORD PTR DS:[3DFFD88],1234567

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

db 3dffd88

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

3DFF883DFF893DFF8A3DFF8B
6 74 52 301

在这里插入图片描述

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

movs指令与stos指令

MOVS指令

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

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指令存入。

此刻堆栈中数据:

在这里插入图片描述

F8执行此行命令后结果:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

两字节,就是图中的5678.

STOS指令

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

在这里插入图片描述

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

STOS BYTE PTR ES:[EDI]

STOS WORD PTR ES:[EDI]

STOS DWORD PTR ES:[EDI]

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

在这里插入图片描述

REP指令

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

MOV ECX,4                          //将4存入ECX,即rep指令执行次数

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

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

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

在这里插入图片描述

自评

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

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

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

目标:堆栈

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



这篇关于汇编(三)存储模式和指令拓展的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程