街机模拟游戏逆向工程(HACKROM)教程:[1]数据的存储与读取

本文主要是介绍街机模拟游戏逆向工程(HACKROM)教程:[1]数据的存储与读取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

在计算机中,数据存储的介质一直在变化,从最早的穿孔纸带,到现在的固态硬盘。但存储的原理是一直没有变化的,在计算机中,我们所存储的数据,一直都是以二进制的形式被存储存在不同的介质中。

计算机用位 (bits) 来存储数据,每一位可以是两种状态之一:0或1,这就是二进制数字。而这种形式十分不方便记忆,所以,为了方便记忆,每个二进制数字,都可以转换为十六进制数字或十进制数字。

二进制十六进制十进制
0001$011
0010$022
0011$033
0100$044
0101$055
0110$066
0111$077
1000$088
1001$099
1010$0A10
1011$0B11
1100$0C12
1101$0D13
1110$0E14
1111$0F15

数据长度

在计算机中,最小的长度为位(bits),也是计算机中用来存储的基本单位。

当我们把8个位(bits),放到一起,那我们就得到了一个单字节(byte)的长度。

把两个单字节长度放到一起,就可以得到一个字 (word)的长度,或者叫双字节。

我们把两个字(word)放到一起,就可以得到一个长字 (long-word),或者叫四字节。

在街机游戏的逆向研究中,我们通常使用一个名为M68K的汇编语言,在这个汇编语言中,我们常用的数据长度就是这三种,分别用B,W,L来表示这三种数据的长度。而位的形式,在这个汇编中,也常常会使用。

长度二进制十六进制
字节0010 11002C
0010 1100 1111 01012C F5
长字0010 1100 1111 0101 1001 1101 0111 01102C F5 9D 76

二进制存储原理

我们以最早的穿孔纸带为例,来说明数据是如何存储的:

位(bits)76543210
10进制16进制值
1$01
2$02
3$03
4$04
5$05
6$06
7$07
8$08
9$09
10$0A
11$0B
12$0C
13$0D
14$0E
15$0F
16$10
32$20
128$80
255$FF

 我们把纸带的每一行看成是一个字节的长度,在纸带中,用1来表示该位置已穿孔,代表该位为1。用0来表示该位置未穿孔,代表该位为0。这样,我们就把这些数据保存在了一个纸带上面。

而对于现代的比如硬盘,光盘,它们的存储原理是一样的,只是存储的介质发生了变化,硬盘是用磁性物质的S和N极代表示该位置为0和1,光盘是用一个个凹凸来表示该位置的0和1。

当然,因为二进制数值难于阅读和记忆,我们用各种工具软件,从中读出来的数据是已经被转换为了16进制数值。

助记符

因为我们从计算机中所读取到的数据都是二进制,我们基本上很难去阅读和记忆,所以,这时我们需要一个翻译器,把他们翻译成人类方便理解的方式。比如在m68K汇编中,会把读取到的比如:

0011 1101 0111 1100 0000 0000 0000 0101 0000 0000 1111 1100
3D             7C            00               05              00              FC

 如果只查看二进制或十六进制数值,我们很难理解,这段数据有什么作用。所以,M68K把他翻译为一段方便阅读和记忆的助记符:

move.w  #5,$FC(a6)

 我们把这段助记符分成四个部份:

1、命令:                - move ,代表了这句代码在程序中的作用

2、操作长度:         - 指定该指令想要操作的数值长度,以B(字节),W(字),L(长字)表示

3、源操作数:        - 表示了数据的从哪里读取

4、目的操作数:    - 表示了数据在运算后会哪里会被修改或者操作

这篇关于街机模拟游戏逆向工程(HACKROM)教程:[1]数据的存储与读取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/607016

相关文章

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地