街机模拟游戏逆向工程(HACKROM)教程:[12]68K汇编-程序流控制

本文主要是介绍街机模拟游戏逆向工程(HACKROM)教程:[12]68K汇编-程序流控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在之前的文章中,我们测试过一些简短的一小段程序,这些程序都有一个共同的程序运行流程,就是一句一句地向下执行,比如:

    movea.l   #$325, a0            * ↓move.b    #$01, (a0)           * ↓move.b    #$02, $01(a0)        * ↓move.b    #$03, $02(a0)        * ↓move.b    #$04, $03(a0)        * ↓move.b    #$05, $04(a0)        * ↓move.b    #$06, $05(a0)        * ↓move.b    #$07, $06(a0)        * ↓

也就是程序从第一句开始,按照顺序执行,这里就要了解一个特别的寄存器:

PC (Program Counter) 程序计数器寄存器

PC寄存器也是M68K的一个寄存器,他的作用是存储当前运行程序的位置,我们在之前的所有测试程序,都是存在“只读存储器”中的,也就是常常说到的ROM。ROM可以把数据固化在存储器中,只可读出,但无法改写。ROM的特点是把信息写入存储器以后能长期保存,不会因电源断电而丢失信息。当然,我们可以通过一些手段来改写ROM中的数据,这个在之后的文章中会是主要的知识点。

和内存一样,所保存的每个数据,都有一个地址指向这个数据,我们来看看上面这段程序的例子:

*-----------------------------------------------------------
* Title      :
* Written by :
* Date       :
* Description:
*-----------------------------------------------------------ORG    $1000
START:                  ; first instruction of program* Put program code heremovea.l   #$325, a0move.b    #$01, (a0)move.b    #$02, $01(a0)move.b    #$03, $02(a0)move.b    #$04, $03(a0)move.b    #$05, $04(a0)move.b    #$06, $05(a0)move.b    #$07, $06(a0)SIMHALT             ; halt simulator* Put variables and constants hereEND    START        ; last line of source

我们同时打开内存窗口查看

可以发现两者的数据是一模一样的。我们查看当前的PC寄存器:

也就是说,当前PC寄存器的值为$1000,也就是说,程序将要执行的指令地址为$1000。我们点击步进按钮一次,同时观察PC寄存器的变化:

可以看到,PC寄存器的值变成了$1006,那么,为什么该值是增加了$6呢,我们来查看上一句执行的代码:

我们可以看到,在地址$1000的位置,数据分为两个部分:

地址             |           机器码            |          指令码

0000 1000   |  207C 0000 0325     |          movea.l     #$325, a0

我们可以看到指令码部份,是我们输入的程序指令代码,我们可以称呼这部份为助记符,我们输入的这部份指令,经过编译器的编译,会把这一句代码翻译为计算机可以识别的机器码:

207C 0000 0325

那么,也就是说,这句我们输入的指令,经过编译器的翻译,生成了一段长度为6个字节的16进制的数值。当然,并非所有的指令都会生成长度为6个字节的数值,生成的长度因指令不同而不同。比如该段代码的第二句,是生成了长度为4个字节的数值

地址             |           机器码   |          指令码

0000 1006   |  10BC 0001     |          move.b  #$01,(a0)

那么,如果我们再次步进,PC寄存器的值应该就会增加$4,我们再次步进,观察PC值的变化:

可以观察到,步进后PC寄存器的值变为了$1006 + $4 = $100a。

我们可以尝试改变PC的值,我们在PC寄存器的输入框中把寄存器的值更改为$1000,并再次步进来观察程序的运行情况:

 

可以观察到,程序并未运行应该运行的下一句$100A,而是回到$1000重新运行了一次。

这里需要注意,我们PC值的选择必须为指令的开始,如果设置了比如$1002,那么机器会执行:0000 0325这段指令,这种情况下,计算机不会正常运行完整的指令,这会造成两种情况,运行错误或者不能实现指令的功能。我们把程序重置,来测试一下:

步进,并观察A0寄存器,如果正常运行该指令,A0寄存器会变为$325:

这时,我们可以观察到,A0并未发生变化,也就是说当设定了一个错误的地址,会造成程序的运行错误。

在M68K中,有部份指令可以在程序的运行中,更改PC寄存器的值:比较常用的有jmp,bra,jsr等:

jmp指令

jmp        - 该指令会把目的操作数传递到PC寄存器

我们可以测试一下该指令:

*-----------------------------------------------------------
* Title      :
* Written by :
* Date       :
* Description:
*-----------------------------------------------------------ORG    $1000
START:                  ; first instruction of program* Put program code heremovea.l   #$325, a0move.b    #$01, (a0)move.b    #$02, $01(a0)move.b    #$03, $02(a0)jmp       $1000move.b    #$04, $03(a0)move.b    #$05, $04(a0)move.b    #$06, $05(a0)move.b    #$07, $06(a0)SIMHALT             ; halt simulator* Put variables and constants hereEND    START        ; last line of source

这段代码在之前的测试代码中间加入了一句jmp  $1000,也就是说,当运行完这一句代码后,我们的PC寄存器会被更改为$1000,也就是程序会跳回到$1000,我们来测试一下:

我们步进到jmp指令处,当我们再次步进,就可以发现,程序回到了$1000

这篇关于街机模拟游戏逆向工程(HACKROM)教程:[12]68K汇编-程序流控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

MySQL zip安装包配置教程

《MySQLzip安装包配置教程》这篇文章详细介绍了如何使用zip安装包在Windows11上安装MySQL8.0,包括下载、解压、配置环境变量、初始化数据库、安装服务以及更改密码等步骤,感兴趣的朋... 目录mysql zip安装包配置教程1、下载zip安装包:2、安装2.1 解压zip包到安装目录2.2

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

Java使用Tesseract-OCR实战教程

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代... 目录Java使用Tesseract-OCRTesseract-OCR安装配置中文训练库引入依赖代码实

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创