汇编学习之《指针寄存器大小端学习》

什么是指针寄存器?

操作栈的寄存器

栈: 保存函数里面传递的参数,局部变量等。

EBP: 指向栈底的指针

ESP: 指向栈顶的指针。

计算入栈地址变化规则

通过OllDbg查看

有可能点击安装的时候栈区域第一次查看会没有显示上面的标题区域,可以通过右键点击栈区域

选择Appearanzhix选择show bar 就有了,其他几个区域一样的。

现在我们尝试通过F8执行一次push 命令来看栈顶指针寄存器的地址和数据变化。

首先我们需要通过F8执行让CPU执行到push 命令处停下来,并记录相关信息。 比如我这里。

(如果要和我一样,先修改EAX 累加寄存器的值为 00000022,修改指令为push EAX,栈顶寄存器值可能不一样。其实也没必要,大家可以看自己的数据,按照下面的规则算就可以了)

执行推送前信息:

当前CUP位置是待执行的push 指令 :  push EAX;  推送累加寄存器的值到栈顶。

当前 EAX 的值是: 00000022

当前ESP栈顶的地址是:  0199F7D4

当前ESP栈顶地址的对应的值是: 15F58E65

执行推送后,我们期望的信息:

当前 EAX 的值是: 00000022  不变

当前ESP栈顶的地址是:  0199F7D0

当前ESP栈顶地址的对应的值是: 00000022

备注: 这里要说明下,为啥栈顶地址从0199F7D4变成了0199F7D0,这个是因为栈顶插入了4个字节,所以内存地址向高位偏移了4个字节。

我们尝试执行下,看看数据是否是我们预期的。

最终确认,以上数据符合预期

练习题

我们上章节学习了 16位寄存器, 高八位寄存器,低八位寄存器。假如我们的指令是

push ax指令,那么数据又会怎么变化呢?  这里我们尝试一次。

先修改下数据,EAX 寄存器的值修改位 00001100

按F8执行语句,查看EAX的值,可以看到已经改变。

修改当前CPU执行位置的命令是: push ax

现在我们开始记录执行后续命令前的数据:

当前CUP位置是待执行的push 指令 :  push ax;  推送累加寄存器的值到栈顶。

当前 EAX 的值是:00001100

当前ESP栈顶的地址是:  0199FA78

当前ESP栈顶地址的对应的值是: 76987BA9

执行推送后,我们期望的信息:

当前 EAX 的值是: 00001100 不变

当前ESP栈顶的地址是: 0199FA76

当前ESP栈顶地址的对应的值是:7BA91100

F8执行语句后查看数据

执行后的结果:

当前 EAX 的值是: 00001100 不变

当前ESP栈顶的地址是: 0199FA76

当前ESP栈顶地址的对应的值是:7BA91100

以上为啥结果我会标记为红色?

其实在这结果运行之前,我的预期运行结果是

当前 EAX 的值是: 00001100 不变

当前ESP栈顶的地址是: 0199FA76

当前ESP栈顶地址的对应的值是:76981100

为啥会犯这样的错误?

先说结果我忽略了数据是小端数据存储的。x86 架构采用小端字节序所以,其实我们通过OllDbg看到的数据并不是真实的内存展示的数据,也不是想当然的直接替换后面两个字节的数据。

当然如果你对这以上没有疑问,完全可以跳过后面的章节。接下来我会详细描述下大小端的概念,以及为啥运行 push ax 后ESP栈顶的值是7BA91100,而不是76981100。

大端和小端?

比如有一个数据: 0x76 98 7B A9

在解释大端和小端之前,我先说几个概念。

低位字节,高位字节概念:

比如数据  0x76 98 7B A9

0x76 就是最高位字节,  0xA9就是最低位字节。

高位字节 ---------------------------低位字节

0x76         0x98           0x7B          0xA9

为了帮忙你记住,你就按照家里你的兄弟排位来,第一个生的就是老大,排位最高,后面依次老二,老三。

低地址,高地址概念:

就是内存地址序,比如运行指令之前ESP栈顶0x0199FA78

连续四个字节那么它们的地址就依次是

低地址---------------------------------------------------------高地址

0x0199FA78,0x0199FA79,0x0199FA7A,0x0199FA7B

以上概念清楚后,我们就来说说大端和小端的内存数据是如何存储的。

大端:高位字节数据存入低地址,低位字节数据存入高地址。

小端:低位字节数据存入低地址,高位字节数据存入高地址。

基于X86架构平台都是小端,无论是win,linux 还是其他系统。 有的设备平台可能是大端。另外就是网络通信中,基于TCP/IP标准,网络字节序就是大端的。

有了上面概念后,就可以接受为什么我们执行push ax后结果为啥是7BA91100。

执行命令前,我们看看当时数据在内存中是怎么样的。

执行命令 push ax; 将数据1100写入ESP栈顶, ax 是十六进制,所以需要在0x0199FA78进制向左移动两个字节。变成从0x0199FA76开始

以上就是内存存储情况,将上面内存中的数据 OllDbg展示的数据就是 0x7BA91100。

如果有问题欢迎大家指出来,有疑问也可以一起讨论。

上一篇:汇编学习之《数据寄存器》

下一篇:汇编学习之《变址寄存器》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库数据编程SQL<3.7 PL/SQL 触发器(Trigger)>

触发器是Oracle数据库中的一种特殊存储过程,它会在特定数据库事件发生时自动执行。触发器通常用于实现复杂的业务规则、数据验证、审计跟踪等功能。 目录 一、触发器基本概念 1. 触发器特点 2. 触发器组成要素 二、触发器类型 1. DML触发器 2. DDL触发器 3.…

2025年渗透测试面试题总结-某 携程旅游-基础安全工程师(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 携程旅游-基础安全工程师 反序列化原理 核心原理 扩展分析 SQL注入本质 核心原理 扩展分析 SQL注…

CSS 边框(Border)样式详解

CSS 边框(Border)样式详解 CSS 提供了多种边框样式,使我们能够控制元素的外观。本文将详细介绍 CSS 边框的各种属性及应用示例。 1. 基本边框属性 CSS 主要使用 border 相关属性定义边框,基本语法如下: border: [边…

SpringCould微服务架构之Docker(6)

容器的基本命令: 1. docker exec :进入容器执行命令 2. docker logs: -f 持续查看容器的运行日志 3. docker ps:查看所有运行的容器和状态 案例:创建运行一个容Nginx容器 docker run--name myNginx -p 80:80 -d nginx 命…

unity3d端监听 uri scheme

一、消息监听 1.创建一个脚本命名为 “URISchemeListener” ,用于接收URI消息(代码如下)。 using System; using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.UI;public class URISchemeListener : MonoBehavio…

网络信息安全应急演练方案

信息安全应急演练方案 总则 (一)编制目的 旨在建立并完善应对病毒入侵、Webshell 攻击以及未授权访问等信息安全突发事件的应急机制,提升组织对这类事件的快速响应、协同处理和恢复能力,最大程度降低事件对业务运营、数据安全和…

电商场景下高稳定性数据接口的选型与实践

在电商系统开发中,API接口需要应对高并发请求、动态数据更新和复杂业务场景。我将重点解析电商场景对数据接口的特殊需求及选型方案。 一、电商API必备的四大核心能力 千万级商品数据实时同步 支持SKU基础信息/价格/库存多维度更新每日增量数据抓取与历史版本对比…

Android R adb remount 调用流程

目的:调查adb remount 与adb shell进去后执行remount的差异 调试方法:添加log编译adbd,替换system\apex\com.android.adbd\bin\adbd 一、调查adb remount实现 关键代码:system\core\adb\daemon\services.cpp unique_fd daemon_service_to…

多模态大语言模型arxiv论文略读(二)

Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representation Space ➡️ 论文标题:Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representat…

【运维】负载均衡

老规矩,先占坑,后续更新。 开头先理解一下所谓的“均衡”,不能狭义地理解为分配给所有实际服务器一样多的工作量,因为多台服务器的承载能力各不相同,这可能体现在硬件配置、网络带宽的差异,也可能因为某台…

大型语言模型Claude的“思维模式”最近被公开解剖

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Ubuntu环境安装

1. 安装gcc、g和make sudo apt update sudo apt install build-essential 2. 安装cmake ubuntu安装cmake的三种方法(超方便!)-CSDN博客 3. 安装ssh sudo apt-get install libssl-dev

【力扣hot100题】(028)删除链表的倒数第N个节点

链表题还是太简单了。 怕越界所以先定义了一个头结点的头结点,然后定义快慢指针,快指针先走n步,随后一起走,直到快指针走到头,删除慢指针后一个节点即可。 /*** Definition for singly-linked list.* struct ListNod…

C/C++回调函数实现与std::function和std::bind介绍

1 概述 回调函数是一种编程模式,指的是将一个函数作为参数传递给另一个函数,并在某个特定事件发生时或满足某些条件时由该函数调用。这种机制允许你定义在特定事件发生时应执行的代码,从而实现更灵活和模块化的程序设计。 2 传统C/C回调实现…

【蓝桥杯】单片机设计与开发,速成备赛

一、LED模块开看,到大模板 二、刷第零讲题目(直接复制模板) 三、空降芯片模板直接调用部分(听完再敲代码) 四、第十三讲开刷省赛题(开始自己背敲模板) 五、考前串讲刷一遍 b连接&#xff1…

Java 基础-28- 多态 — 多态下的类型转换问题

在 Java 中,多态(Polymorphism)是面向对象编程的核心概念之一。多态允许不同类型的对象通过相同的方法接口进行操作,而实际调用的行为取决于对象的实际类型。虽然多态提供了极大的灵活性,但在多态的使用过程中&#xf…

Epub转PDF软件Calibre电子书管理软件

Epub转PDF软件:Calibre电子书管理软件 https://download.csdn.net/download/hu5566798/90549599 一款好用的电子书管理软件,可快速导入电脑里的电子书并进行管理,支持多种格式,阅读起来非常方便。同时也有电子书格式转换功能。 …

在 Ubuntu 22.04 上安装 Docker Compose 的步骤

1. 确保已安装 Docker Docker Compose 需要 Docker 作为依赖,请先安装 Docker: sudo apt update sudo apt install docker.io sudo systemctl enable --now docker2. 下载 Docker Compose 二进制文件 推荐安装最新稳定版的 Docker Compose&#xff08…

Mysql-数据库、安装、登录

一. 数据库 1. 数据库:DataBase(DB),是存储和管理数据的仓库。 2. 数据库管理系统:DataBase Management System(DBMS),操纵管理数据库的大型软件 3. SQL:Structured Query Language&…

基于SpringAOP面向切面编程的一些实践(日志记录、权限控制、统一异常处理)

前言 Spring框架中的AOP(面向切面编程) 通过上面的文章我们了解到了AOP面向切面编程的思想,接下来通过一些实践,去更加深入的了解我们所学到的知识。 简单回顾一下AOP的常见应用场景 日志记录:记录方法入参、返回值、执…