街机模拟游戏逆向工程(HACKROM)教程:[14]68K汇编-标志寄存器

在M68K中,有许多条件分支指令,和jmp指令一样也会修改PC达到程序跳转或分支的目的,不过这些会根据一些情况或状态来选择是否跳转。而在M68K中,有一个特别的寄存器来标记这些情况。

CCR(状态标志寄存器)

CCR寄存器是用来保存一些对应的状态数据,这些状态可以帮我们了解到比如:数据1和数据2是否相等,数据1是否大于数据2,数据值是否为负 等等情况。而保存这些状态的目的是可以让M68K程序能够在不同的状态下执行不同的动作。

ccr寄存器的大小为1个字节(8比特),我们在观察该寄存器时,通常是在二进制的状态下去观察,如:

    - - - X N Z V C
    0 0 0 0 0 0 0 0

可以看到,m68k 有5个状态标志 (flag):X N Z V C,这五个状态分别有特殊的作用

C 	- Carry		(进位)
V 	- oVerflow 	(溢出)
Z 	- Zero 		(零结果)
N 	- Negative 	(负结果)
X 	- eXtended 	(扩展)

进位(carry)

进位标志的作用就是比如当两个数据相加发生了进位时,该标志位会被设置为1:

addi.b     #$05, d0

我们假设d0中的数据为$01,那么该指令的执行结果为$05 + $01 = $06,此时,并未发生进位,所以,在这状态下,进位标志位会被设为0。

那当我们假设d0中的数据为$FF,这时指令的执行结果为$05 + $FF = $104,这时,因为该指令的操作长度为单字节,所以这个结果只有$04会被保存到d0寄存器,而$104中的1因为超出了单字节范围,会被记录到进位标志位。此时,进位标志位会被设为1。

溢出(overflow)

要理解溢出,我们先要了解 无符号数 和 有符号数

无符号数:

在无符号数中,我们的数值没有正负的区别,所有数值都可以认为是正数,比如:

        单字节长度:最小值为$00,最大值为$FF。

        双字节长度:最小值为$0000,最大值为$FFFF。

        四字节长度:最小值为$00000000,最大值为$FFFFFFFF。

而这些数,就是无符号数,就是从最小值到最大值的正数。

有符号数:

在有符号数中,我们在数值中加入了正负符号,比如:

        单字节长度:$00-$7F为正数,$80-$FF为负数

        双字节长度:$0000-$7FFF为正数,$8000-$FFFF为负数

        四字节长度:$00000000-$7FFFFFFF,$80000000-$FFFFFFFF为负数

需要得到溢出状态,我们需要把数值当作有符号数,比如:当两个数值相加,得到的值为负数时的情况下就会把溢出状态标志设置为1。因为在数学上看来正数 + 正数 = 负数是不合逻辑的,所以M68K把这种情况解释为溢出。同样的情况还有比如负数 + 负数 = 正数,在这个状态下,也会把溢出状态标志设置为1。

零结果(Zero)

零结果比较容易理解,就是当计算的结果为零时,该状态标志就会被设置为1。

比如:

    addi.b  #$0,d0

如果d0 = $0,那么,计算的结果为$0 + $0 = $0,此时,该状态标志会被设置为1

    subi.b  #$5,d1

如果d1 = $5,计算的结果为 $5 - $5 = $0,此时,该状态标志会被设置为1

负结果 (Negative)

该状态也十分容易理解,就是当计算结果为负时,该状态标志就会被设置为1

扩展 (Extended)

该标志位和进位 (C) 状态标志一样,它会在进位发生的时候也被设置,并不是所有的修改进位状态标志的指令都会修改扩展状态标志,当你使用一条同时修改进位和扩展状态标志的指令之后,再去使用一条只会修改进位状态标志的指令,这时扩展 (X) 状态标志就会保留之前的那次进位的状态。

我们需要知道,并非用于计算的指令才能改变CCR寄存器,在M68K中,大部份指令都可以改变CCR状态,我们可以在指令说明中看到该指令可以改变哪些标志位状态。比如:

MOVE    Move Data from Source to Destination 传递数据(原操作数->目的操作数)
    运算:    原操作数 置入 目的操作数
    语法:    MOVE <ea>,<ea>
    操作数长度:B、W、L
    条件码(标志位):    X — 不受影响。
                                        N — 如果结果为负数则置1;其它情况置0。
                                        Z — 如果结果为零则置1;其它情况置0。
                                        V — 置0。
                                        C — 置0。

可以看到move这个指令可以在什么情况下对哪些标志位产生影响。

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

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

相关文章

回调地狱与解决方案

什么是回调地狱&#xff1f; 简单理解就是回调函数嵌套回调 示例&#xff1a; setTimeout(() > {console.log(1);setTimeout(() > {console.log(2);setTimeout(() > {console.log(3);}, 1000);}, 2000)}, 3000)如上代码所示&#xff0c;回调函数嵌套回调&#xff0c;就…

Rustdesk自建服务搭建好了,打开Win10 下客户端下面状态一直正在接入网络,无法成功连接服务器

环境: Rustdesk1.2.3 自建服务器 有域名地址 问题描述: Rustdesk自建服务搭建好了,打开Win10 下客户端下面状态一直正在接入网络,无法成功连接服务器 解决方案: RustDesk是一款免费的远程桌面软件,它允许用户通过互联网远程连接和控制其他计算机。它是用Rust编程语…

专题篇|国芯科技系列化布局车载DSP芯片,满足不同层次车载音频产品的需求

随着高端DSP芯片产品CCD5001的亮相&#xff0c;国芯科技也在积极布局未来的DSP系列芯片群。通过深入研究不同车型音频处理需求&#xff0c;对比国外DSP产品综合性能和成本&#xff0c;国芯科技未来将推出全新DSP芯片家族&#xff0c;包括已经推出的高端产品CCD5001&#xff0c;…

VRRP协议

VRRP概述 虚拟路由冗余协议VRRP(Virtual Router Redundancy Protocol)通过把几台路由设备联合组成一台虚拟的路由设备,将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠…

AI大模型开发架构设计(1)——LLM大模型Agent剖析和应用案例实战

文章目录 LLM大模型Agent剖析和应用案例实战1 从 LLM 大模型到智能体演进技术语言模型是什么&#xff1f;大语音模型是什么&#xff1f;大语言模型日新月异LLM大模型存在局限性LLM Agent来势凶凶LLM Agent增长迅猛LLM Agent是什么&#xff1f; 2 LLM Agent 架构深度剖析规划能力…

1.10马原,总复习PART2

马克思主义鲜明特征 革命性&#xff0c;科学性&#xff0c;实践性 人民性&#xff0c;发展性 革命性、科学性&#xff0c;实践性&#xff0c;人民性&#xff0c;发展性 革命性&#xff0c;科学性&#xff0c;实践性&#xff0c;人 革命性&#xff0c;发展性&#xff0c…

架构篇05-复杂度来源:高可用

文章目录 计算高可用存储高可用高可用状态决策小结 今天&#xff0c;我们聊聊复杂度的第二个来源高可用。 参考维基百科&#xff0c;先来看看高可用的定义。 系统无中断地执行其功能的能力&#xff0c;代表系统的可用性程度&#xff0c;是进行系统设计时的准则之一。 这个定义…

数学建模实战Matlab绘图

二维曲线、散点图 绘图命令&#xff1a;plot(x,y,’line specifiers’,’PropertyName’,PropertyValue) 例子&#xff1a;绘图表示年收入与年份的关系 ‘--r*’:--设置线型&#xff1b;r:设置颜色为红色&#xff1b;*节点型号 ‘linewidth’&#xff1a;设置线宽&#xff1…

使用cmake进行完成开发实践

根据这个UML图进行cmake的实践 首先按照使用vscode在wsl2中配置clangd环境-CSDN博客的内容先创建出cmake项目。 之后在项目目录中创建include和src目录。 根据UML图&#xff0c;首先要完成Gun类的实现。分别在include&#xff0c;src目录下创建头文件和源文件&#xff0c;写入…

迭代器模式介绍

目录 一、迭代器模式介绍 1.1 迭代器模式定义 1.2 迭代器模式原理 1.2.1 迭代器模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、迭代模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 抽象迭代类 2.2.2 抽象集合类 2.2.3 主题类 2.2.4 具体迭代类 2.2.5 具体集合类 …

android使用相机 intent.resolveActivity returns null

问题 笔者使用java进行android开发&#xff0c;启动相机时 intent.resolveActivity returns null takePictureIntent.resolveActivity(getPackageManager()) null详细问题 笔者使用如下代码启动相机 // 启动相机SuppressLint("LongLogTag")private void dispatc…

基于华为MRS3.2.0实时Flink消费Kafka落盘至HDFS的Hive外部表的调度方案

文章目录 1 Kafka1.1 Kerberos安全模式的认证与环境准备1.2 创建一个测试主题1.3 消费主题的接收测试 2 Flink1.1 Kerberos安全模式的认证与环境准备1.2 Flink任务的开发 3 HDFS与Hive3.1 Shell脚本的编写思路3.2 脚本测试方法 4 DolphinScheduler 该需求为实时接收对手Topic&a…

yum下载源,vim使用

文章目录 yum本地配置lzrsz命令行互传scp(远程拷贝)vim yum本地配置 [rootiZf8z3j2ckkap6ypn717msZ ~]# pwd /root [rootiZf8z3j2ckkap6ypn717msZ ~]# ls /etc/yum.repos.d CentOS-Base.repo epel.repo //本地配置源yum会根据/etc/yum.repo.d路径下的配置文件来构成自己的下载…

一个简单的ETCD GUI工具

使用ETCD没有好用的GUI工具&#xff0c;随手用c#写了一个&#xff0c; 做得好玩的一个ETCD GUI工具&#xff0c;后面加上CLI 工具&#xff0c;类似于 redis Cli工具一样&#xff0c;简化在 Linux下面的操作&#xff0c;不知道有没有必要&#xff0c; git 地址如下&#xff0c;…

华为OD机试 - 查找一个有向网络的头节点和尾节点(Java JS Python C)

题目描述 给定一个有向图,图中可能包含有环,图使用二维矩阵表示,每一行的第一列表示起始节点,第二列表示终止节点,如 [0, 1] 表示从 0 到 1 的路径。 每个节点用正整数表示。 求这个数据的首节点与尾节点,题目给的用例会是一个首节点,但可能存在多个尾节点。同时图中…

天龙八部资源提取工具(提取+添加+修改+查看+教程)

可以提取&#xff0c;添加&#xff0c;修改&#xff0c;查看天龙八部里面的数据。非常好用。 天龙八部资源提取工具&#xff08;提取添加修改查看教程&#xff09; 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1XOMJ1xvsbD-UUQOv3QfHPQ?pwd0kd0 提取码&…

leetcode下一个更大的元素---1暴力---2单调栈

1.题目&#xff1a; nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 < i < nums1.l…

苹果眼镜(Vision Pro)的开发者指南(1)

一、用到的底层核心框架&#xff1a; SwiftUI&#xff1a;无论开发者是要创建窗口、体积还是空间体验&#xff0c;SwiftUI 都是构建新的 visionOS 应用程序或将现有 iPadOS 或 iOS 应用程序引入平台的最佳方式。凭借全新的 3D 功能以及对深度、手势、效果和沉浸式场景类型的支…

C++类与对象【多态】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;C从基础到进阶 &#x1f384;1 多态&#x1f355;1.1 多态的基本概念&#x1f355;1.2 多态案例一-计算器类&#x1f355;1.3 纯虚函数和抽象类&#x1f355;1.4 多态案例二-制作饮品&…

【华为GAUSS数据库】IDEA连接GAUSS数据库方法

背景&#xff1a;数据库为华为gauss for opengauss 集中式数据库 IDEA提供了丰富的各类型数据库驱动&#xff0c;但暂未提供Gauss数据库。可以通过以下方法进行连接。 连接后&#xff0c; 可以自动检查xml文件中的sql语句是否准确&#xff0c;表名和字段名是否正确还可以直接在…