街机模拟游戏逆向工程(HACKROM)教程:[13]68K汇编-jmp指令

在68K汇编中,有多个可以改变PC寄存器的指令:

jmp

该指令在之前的章节已经介绍,该指令可以把目的操作数传递到PC寄存器,实现程序的流程控制。

bra

该指令的作用与jmp几乎相同,同样可以把目的操作数传递到PC寄存器,实现程序的流程控制。但是这两个指令有一定的区别,他们的区别是,bra比jmp占用的存储空间更少,运行更快。但是,bra虽然有这些优势,但bra的寻址范围有一定的限制。所以,bra不能像jmp一样,可以跳到程序中的任何位置。bra的寻址范围最大为$10000,因为bra可能向前或向后跳转,所以,在向前跳和向后跳分别可以跳转的最大距离为$8000。我们可以用编译器进行测试:

    *向后跳转
    ORG     $10000        *程序存储地址
    bra.w   $18000        *从10000跳转到18000不会出现编译错误
    ORG     $20000        *程序存储地址
    bra.w   $28002        *从20000跳转到28002时会出现编译错误

    *向前跳转
    ORG     $30000        *程序存储地址
    bra.w   $28002        *从30000跳转到28002不会出现编译错误
    ORG     $40000        *程序存储地址
    bra.w   $38000        *从40000跳转到38000时会出现编译错误

 出现的错误指示为

ERROR:Branch instruction displacement is out of range or invalid 

 分支指令位移超出范围或无效

所以,虽然bra有速度快的优势,但有的时候,我们也需要按照条件来选择使用jmp还是bra

jsr & rts

jsr        -跳到子程序指令,该指令可以把目的操作数传递到PC寄存器,并把下一句指令的地址传递到"堆栈"。

我们要理解该指令的作用,先要理解堆栈(stack),堆栈是一块可以用来临时存储重要信息的内存空间,你可以指定 m68k 的堆栈的地址在哪,也可以随时地修改堆栈的地址。堆栈的操作有入栈和出栈,入栈是指把数据传递到栈的最顶处,而出栈是读取栈顶中的数据。

在M68K中,地址寄存器A7被用作栈顶的指针,我们可以通过对A7进行设置来指定栈顶的地址:

movea.l    #$10000,a7
*或
movea.l    #$10000,SP

 在栈里面,数据是反向存储的,我们可以把数据传递到栈的指令是

    movea.l    #$10000,a7
    move.w     #$12,d0
    move.l     #$ff001234,d1


    move.w     d0, -(sp)    *入栈
    move.l     d1, -(sp)    *入栈

    move.l     (sp)+,d3     *出栈
    move.w     (sp)+,d4     *出栈

 这里我们需要注意,当入栈时,栈指针会先减少操作长度的值,再把数据传递到栈中。如:move.w   d0,-(sp),执行时,sp寄存器的值会先减少.w长度,也就是2个字节,这时,sp的值为$10000 - $2 = $FFFE,然后才会把数据传递到sp所指向的地址。而出栈正好相反,出栈时会先读取栈顶的数据,然后才会把sp的值增加对应操作长度的值。在操作栈时,我们还需要尊守先入后出,后入先出的规则,就是说,我们要读取栈的数据时,必须先读取最后传递到栈的数据。

所以,jsr指令会把下一句指令的地址入栈,那么就需要一句指令来执行出栈操作

rts        -从子程序返回,该指令会从栈里读取返回地址,并把读取到的地址传递到PC寄存器

我们用一段程序来测试jsr和rts的作用原理:


   ORG     $100
START:
    move.w  #$01,d0
    jsr     $180
    move.w  #$04,d3
    move.w  #$05,d4

    ORG     $180
    move.b  #$02,d1
    move.b  #$03,d2
    rts
    
    END    START

bsr & rts

bsr与jsr指令的关系,和jmp和bra的关系是一样的,bsr与jsr指令的作用基本相同,不同之处和bra指令一样,bsr指令的寻址范围是有限制的。这个限制和bra是一样的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】ControlNet、文章作者 github 上的 discussions

文章目录 IntroductionMethodControlNetControlNet for Text-to-Image DiffusionTrainingInference Experiments消融实验定量分析 在作者 github 上的一些讨论消融实验更进一步的探索Precomputed ControlNet 加快模型推理迁移控制能力到其他 SD1.X 模型上其他 Introduction 提…

贪心算法 ——硬币兑换、区间调度、

硬币兑换: from book:挑战程序设计竞赛 思路:优先使用大面额兑换即可 package mainimport "fmt"func main() {results : []int{}//记录每一种数额的张数A : 620B : A//备份cnts : 0 //记录至少需要多少张nums : []int{1, 5, 10, 5…

idea中使用git提交代码报 Nothing To commit No changes detected

问题描述 在idea中右键,开始将变更的代码进行提交的时候,【Commit Directory】点击提交的时候 报 Nothing To commit No changes detected解决方案 在这里点击Test 看看是不是能下面显示git版本,不行的话 会显示一个 fix的字样,行…

专业130+总分380+哈尔滨工程大学810信号与系统考研经验水声电子信息与通信

今年专业课810信号与系统130,总分380顺利考上哈尔滨工程大学,一年的努力终于换来最后的录取,期中复习有得有失,以下总结一下自己的复习经历,希望对大家有帮助,天道酬勤,加油!专业课&…

SSE[Server-Sent Events]实现页面流式数据输出(模拟ChatGPT流式输出)

文章目录 前言SSE 简介应用场景区分浏览器支撑性 实现过程Web VUE核心解析数据代码实例demo参考 前言 服务端向客户端推送消息,除了用WebSocket可实现,还有一种服务器发送事件(Server-Sent Events)简称 SSE,这是一种服务器端到客户端(浏览器)…

C++大学教程(第九版)5.25去除break语句 5.27去除cintinue语句

5.25题目 (去除break和continue)break和continue 语句遭到质疑的原因是它们的非结构化性。实际上,break和continue 语句总能用结构化的语句取代。请详述如何从程序的一条循环语中去除break语句,并用某种结构化的手段替代。提示:break 语句用于在循环体内离开一个循…

Addressables(1) 从安装到加载单个/多个资源

不想再配改那些狗屎路径,准备研究一下Adressable,据说可以用key加载指定的资源 刚安装下来,随便搞了个资源勾选了一下addressable的框框,多了好多东西啊 概念铺天盖地而来,ok 没事的 慢慢来! 前置知识 P…

pytorch GPU版本安装 python windows

annanconda环境 创建虚拟环境 pytorch19_gpu create -n pytorch19_gpu python3.9 激活环境 conda activate pytorch19_gpu 查找CUDA版本是12.0,查找方式,win r输入cmd进入命令行模式,输入nvidia-smi,如下, 查找如…

Bit.Store 加密卡集成主流 BRC20 ,助力 BTC 生态 Token 的流动性与消费

“Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中,通过以其推出的加密银行卡为媒介,助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初,就是以一种去中心化、点对点的现金系统为定…

【Qt】对象树与坐标系

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Qt Creator快捷键 二、对象树 1、对象树的析构 2、自定义类的编写…

代码随想录刷题题Day37

刷题的第三十七天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day37 任务 ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结 1 最佳买卖股票时机含冷冻期 309.最佳…

C 语言->编译和链接实现原理

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 今天学习&#xff1a;浅学编译和链接内部实现原理 前提&#xff1a;本文是在gcc编译环…

C++总结笔记

1. 简介 1、面向对象程序设计 面向对象的四大特性 1&#xff09;封装 2&#xff09;继承 3&#xff09;多态 4&#xff09;抽象 2、标准库 标准C由三个部分组成 1&#xff09;核心语言&#xff1a;提供了所有的构件块 2&#xff09;C标准库&#xff1a;提供了大量的函…

chrony介绍和安装

chrony介绍和安装 1.chrony&#xff08;时间同步服务&#xff09; 1.1 chrony介绍 Chrony 是一个用于时间同步的软件&#xff0c;它旨在提供高精度的系统时钟同步。Chrony 软件包括一个 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;服务器和客…

【Linux第二课-权限】操作系统、Linux用户、Linux权限、Linux文件类型、粘滞位

目录 操作系统shell外壳为什么有shell外壳shell外壳是什么shell外壳工作原理 Linux用户root用户与非root用户root用户与普通用户的切换普通用户 --> root用户root用户 --> 普通用户普通用户 --> 普通用户对一条指令提升为root权限进行执行 Linux权限Linux中的权限角色…

【Linux】Linux系统的生态

Linux中安装软件 Linux中安装软件一般有三种方式&#xff1a; 源代码安装rpm包安装yum安装 1.源代码安装 有些软件本来就是开源的&#xff0c;如果不想用别人直接发布好的软件&#xff0c;我们就可以把源代码下载下来&#xff0c;在我们的环境中编译&#xff0c;自己安装 …

(初研) Sentence-embedding fine-tune notebook

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

Visual Studio 下载安装教程,附安装包和工具,Visual Studio 2022,Visual Studio所有版本都有

前言 Visual Studio是微软推出的一款C编译器&#xff0c;将“高级语言"翻译为"机器语言&#xff08;低级语言)"的程序&#xff0c;VS是一个非常完整的开发工具集&#xff0c;包括了所有软件生命周期中所需的大部分工具&#xff0c;如UML工具、代码管控工具、集…

Kafka 的 Consumer Group 解读

作为一份笔记&#xff0c;本文再次梳理一下 Kafka 的 Consumer Group。我们知道&#xff0c;一个 Topic 往往会有多个 Partition&#xff0c;一条消息只会被写到一个 Kafka 的 Partition 中&#xff0c;那 Consumer 是怎么消费 Message 的呢&#xff1f; Consumer Group 又从中…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…
最新文章