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

news2024/11/14 21:23:15

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

    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 here
    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)

    SIMHALT             ; halt simulator

* Put variables and constants here

    END    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 here
    movea.l   #$325, a0
    move.b    #$01, (a0)
    move.b    #$02, $01(a0)
    move.b    #$03, $02(a0)
    jmp       $1000
    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 here

    END    START        ; last line of source

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

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

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

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

相关文章

【软件测试常见Bug清单】

软件测试中,bug的类型有很多种,比如:代码错误、界面优化、设计缺陷、需求补充和用户体验等; 一般情况下,需求补充和设计缺陷比较好区分,但是代码错误、界面优化和用户体验区分不是很明显; 下面…

主动轮廓——计算机视觉中的图像分割方法

​ 一、说明 简单来说,计算机视觉就是为计算机提供类似人类的视觉。作为人类,我们很容易识别任何物体。我们可以很容易地识别山丘、树木、土地、动物等,但计算机没有眼睛,也没有大脑,因此它很难识别任何图像。计算机只…

PostgreSQL 的对象层次

所有的数据库离开数据量来谈性能都是耍流氓。 就你那几万条的数据库,用啥都行,典型的就是怎么方便怎么来。 不过 PostgreSQL 上手确实比 MySQL 概念更多。 PostgreSQL 比 MySQL 多了一层。 PostgreSQL 是从PostgreSQL 是从 Database,到 S…

RK3568平台 LT9211转接芯片调试笔记

一.简介 龙讯LT9211是一个高性能转换器,支持MIPI LVDS TTL两两之间转换。 使用此款芯片大部分为MIPI与LVDS进行互相转换。 下图为LT9211的典型应用图: 二.LT9211原理图 三.车载显示器和摄像头系统 四.调试LT9211输出 MIPI数据 (1&#xf…

【Linux install】Ubuntu和win双系统安装及可能遇到的所有问题

文章目录 1.前期准备1.1关闭快速启动和安全启动1.1.1 shell命令行进入BIOS1.1.2 windows设置中高级启动1.1.3 在开机时狂按某个键进入BIOS1.1.4 关闭Fast boot和Secure boot 1.2 制作启动盘1.3 划分磁盘空间1.3.1 查看目前的虚拟内存大小 2.开始安装2.1 使用启动盘启动2.1.1 法…

洛谷NOIP2002 普及组 选数 +NOIP1999普及组 回文数

两道日常的练习题&#xff0c;废话不多说&#xff0c;直接上题上代码&#xff1a; 这道题目的难点在于怎样去根据一个不同的k值&#xff0c;通过代码来实现将所有符合题目要求的数字相加并且不重复的功能。下面请看代码&#xff0c;会有详细的讲解&#xff1a; #include<io…

又聊代码重构

今天有幸和一位朋友聊了一下代码的重构。回来之后感觉不够尽兴&#xff0c;所以决定再来输出一篇。 代码来至于今天下午的提交。 重构是对代码的觉知和业务的逻辑的进一步归纳总结 只有开发者对代码的不断觉察和理解&#xff0c;才会产生重构代码的念头。因此&#xff0c;驱动…

GO 中如何防止 goroutine 泄露

文章目录 概述如何监控泄露一个简单的例子泄露情况分类chanel 引起的泄露发送不接收接收不发送nil channel真实的场景 传统同步机制MutexWaitGroup 总结参考资料 今天来简单谈谈&#xff0c;Go 如何防止 goroutine 泄露。 概述 Go 的并发模型与其他语言不同&#xff0c;虽说它…

小白水平理解面试经典题目LeetCode 121 Best Time to Buy and Sell Stock

121 Best Time to Buy and Sell Stock (买卖股票的最佳时机) 你好&#xff0c;2024年的第一个月&#xff0c;又是秋风萧瑟天气凉&#xff0c;草木摇落露为霜。.。。在这个特殊的时代&#xff0c;作为我们普通的一个打工人&#xff0c;我们用这道题&#xff0c;开启对这个不符合…

菜鸟关于做前、后端的整理(html、js),以及疑问

涉及到后端的接口py&#xff0c;前端html和js 这三部分就按照如下格式放到server项目主路径下&#xff0c;这样后端机可以作为一个前端server main.pystaticmain.jsmain.htmlhtml 首先是html要设定网页的显示 <!DOCTYPE html> <html> <head><title>…

小米,我请你不要将卖手机那套话术带进汽车圈

文 | AUTO芯球 ​作者 | 雷歌 当你们用卖手机时那一套营销话术玩汽车&#xff0c;整个汽车圈都被你们逗乐了。 这不&#xff0c;在被用户问到“贵公司汽车有哪些驾驶模式”时&#xff0c;你们声称自己有16.8亿种驾驶模式。 你小米说这话的逻辑&#xff0c;不就是将加速、转…

网络安全最大的威胁:洞察数字时代的风险之巅

在数字化时代&#xff0c;网络安全问题越发突显&#xff0c;企业和个人都面临着来自多方面的威胁。究竟网络安全领域的最大威胁是什么&#xff1f;本文将深入探讨这一问题&#xff0c;揭示数字空间中最为严重的威胁。 1. 恶意软件的肆虐&#xff1a; 恶意软件一直是网络安全的…

29、WEB攻防——通用漏洞SQL注入增删改查盲注延迟布尔报错

文章目录 盲注增删改查 盲注 概念&#xff1a;在注入过程中&#xff0c;获取的数据不能回显至前端页面&#xff0c;此时我们需要利用一些方法进行判断或尝试&#xff0c;这个过程被称为盲注。 解决&#xff1a;常规的联合查询注入不行的情况。 分类&#xff1a; 基于布尔的SQ…

Leetcode2957. 消除相邻近似相等字符

Every day a Leetcode 题目来源&#xff1a;2957. 消除相邻近似相等字符 解法1&#xff1a;遍历 分类讨论 遍历字符串 word&#xff0c;比较相邻的 3 个元素 word[i - 1]、word[i] 和 word[i 1]&#xff0c;记 left_distance abs(mid - left)&#xff0c;right_distance…

739.每日温度 496.下一个更大元素 I

739.每日温度 496.下一个更大元素 I 739.每日温度 力扣题目链接(opens new window) 请根据每日 气温 列表&#xff0c;重新生成一个列表。对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位…

(初研) Sentence-embedding fine-tune notebook

由于工作需要&#xff0c;需要对embedding模型进行微调&#xff0c;我调用了几种方案&#xff0c;都比较繁琐。先记录一个相对简单的方案。以下内容并不一定正确&#xff0c;请刷到的大佬给予指正&#xff0c;不胜感激&#xff01;&#xff01;&#xff01; 一.对BGE模型&…

OpenHarmonyOS-gn与Ninja

GN语法及在鸿蒙的使用 [gnninja学习 0x01]gn和ninja是什么 ohos_sdk/doc/subsys-build-gn-coding-style-and-best-practice.md GN 语言与操作 一、gn简介 gn是generate ninja的缩写&#xff0c;它是一个元编译系统&#xff08;meta-build system&#xff09;,是ninja的前端&am…

Python入门到精通(三)——Python循环语句

Python循环语句 一、while 循环 1、基础语法 2、嵌套应用 二、for 循环 1、基础语法 2、嵌套应用 三、循环中断&#xff1a;break 和 continue 1、break 2、continue 四、综合案例 一、while 循环 1、基础语法 while的条件需得到布尔类型&#xff0c;True表示继续循环…

linux C语言socket函数send

在Linux中&#xff0c;使用C语言进行网络编程时&#xff0c;send函数是用于发送数据到已连接的套接字的重要函数之一。它通常用于TCP连接&#xff0c;但也可以用于UDP&#xff08;尽管对于UDP&#xff0c;通常更推荐使用sendto&#xff0c;因为它允许你指定目标地址和端口&…