将寄存器加载到自身的指令的目的是什么?

2024-01-28

在查看 Gameboy 的指令集时,我遇到了如下指令:

LD A, A
LD B, B
LD C, C
LD D, D

...

每条指令都有自己的操作码这张桌子 http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html,这让我认为由于可能的操作码数量的限制,它们具有一定的重要性。

我首先想到它可能会取消引用该寄存器中的指针并将值存储在该指针处(就像这个问题一样 https://stackoverflow.com/questions/24981252/what-is-the-purpose-of-moving-a-register-to-itself-as-in-mov-eax-eax),但在一个emulator http://imrannazar.com/content/files/jsgb.z80.js, LD A, A实现为:

Z80._r.a = Z80._r.a

它们似乎对处理器的状态没有影响(只是将寄存器设置为它们自己的值)并且与处理器的周期数相同。NOP执行。

为什么指令集中包含这些操作码以及它们的用途是什么?


如果你检查的话,它们简化了解码单元

7F LD A,A
78 LD A,B
79 LD A,C

vs

47 LD B,A
40 LD B,B
41 LD B,C

vs

4F LD C,A
48 LD C,B
49 LD C,C

您可以注意到,底部 3 位是为源寄存器保留的(值 0-7 为B,C,D,E,H,L,(HL),A),它们旁边的 3 位是目标寄存器,同样具有相同的 0-7 含义(因此 0 vs 0 创建LD B,B) 和前两位01选择LD,从快速浏览中不确定我是否完美地破译了它。

那时人们也会期待76 to be LD (HL),(HL),这甚至比LD A,A,所以有特殊的逻辑来捕获那个并执行HALT反而。

因此,这是关于指令解码器的简单性,使用相同的位模式来选择源/目标寄存器,以及不添加更多晶体管来捕获same,same情况,除了(HL),(HL)(这可能会在需要内存访问的源和目标上发生内部失败,因此额外的“逻辑”在硬件设计中可能相当简单。

请记住,早期的 CPU 通常是手工设计的,晶体管总数必须保持在较低水平,以便适合芯片,并且易于手工绘制电路并验证其正确性。

编辑:Z80 有大约 8500 个晶体管,您可能需要检查:https://en.wikipedia.org/wiki/Transistor_count https://en.wikipedia.org/wiki/Transistor_count and https://en.wikipedia.org/wiki/Zilog_Z80 https://en.wikipedia.org/wiki/Zilog_Z80...并且GameBoy对Z80进行了一些修改,但是晶体管总数将非常接近原始值,尽管我没有搜索确切的值,并且我不确定未来多远任天堂正在扩展它,也许他们已经可以负担得起 20-50k 的价格,但我对此表示怀疑。


附录:最近我读到了有关俄罗斯 Sinclair ZX Spectrum 克隆机的信息,它们是经过大量修改的机器,增加了额外的功率、内存和功能......其中一些正在使用这些ld same,same控制 DMA 传输的操作码,因此在这些机器代码上将它们用作nop可能无法正确执行。这与 GameBoy 无关,但如果您有针对“Sprinter”或类似的俄罗斯 ZX 克隆之一的二进制目标,并且您在反汇编中发现其中之一,请不要自动考虑它们nop,它们可能是实际执行某些操作的有效代码的一部分(最有可能使用 DMA)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将寄存器加载到自身的指令的目的是什么? 的相关文章

  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如果 free() 知道我的数组的长度,为什么我不能在自己的代码中请求它?

    我知道将动态分配的数组的长度传递给操作它们的函数是一个常见的约定 void initializeAndFree int anArray size t length int main size t arrayLength 0 scanf d
  • PhantomJS 网页内存消耗?

    是否有一种编程方式 因为我想在运行时自动执行 方式来查看网页在通过 PhantomJs 运行时使用了多少内存 我也在使用 casperjs 如果这有帮助的话 我已经搜索了很多但没有找到任何方法 PhantomJs 使用 QtWebKit 因
  • Android 2.3 模拟器在更新位置时崩溃

    我正在使用 Eclipse 编写和调试 Android 应用程序 我需要做的事情之一是更新设备的位置 因此我尝试使用模拟器控制窗口中的位置控制面板 在 手动 选项卡上 我选择 十进制 输入有效的纬度和经度 然后单击 发送 不幸的是 接下来发
  • 使用8086汇编语言画圆[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我试图使用 8086 汇编器画一个圆 我尝试利用中点圆算法 https en wikipedia org wiki Midpoin
  • 问题与 Assembly x86-32 RET n 指令有关

    我知道 Ret n 的含义 但我无法弄清楚它在维护程序运行时堆栈方面的作用 我在那里有点困惑 ret 和栈有关系吗 ret n就好像ret add esp n 您可以将其用于 caller pops 调用约定 Plain ret就好像pop
  • GCC 优化对位操作的有效性

    以下是在 x86 64 上设置 C 中单个位的两种方法 inline void SetBitC long array int bit Pure C version array 1 lt
  • 0xffff0 和 BIOS

    当电脑第一次启动时 它开始在物理地址 0xffff0 处执行 该地址包含一条到 BIOS 的 jmp 指令 现在对于我的问题 我总是假设物理地址映射到 RAM 如果 RAM 最初包含垃圾值 那么究竟是什么将 jmp 指令放入 0xffff0
  • Process Explorer 报告的进程虚拟内存大小不合理

    在寻找内存泄漏时 我最近注意到 Process Explorer Microsoft Sysinternals v16 26 的 procexp exe 报告的虚拟内存值非常高 就像大约 2 1TB 其中我的笔记本电脑具有运行 Win 10
  • 返回中断处理程序后程序计数器去了哪里?

    您好 我想知道当程序从中断服务程序返回时程序计数器去哪里 我知道当中断事件发生时PC被压入堆栈 但是下一个或同一个 刚刚执行的一个 被压入堆栈的地址是什么 当我们有 first instruction interrupt event her
  • 汇编器堆栈对齐(或使用 PUSH 更好的未对齐示例)

    首先我了解 或者我认为我了解 堆栈未对齐的问题 但我知道 就像定义一样 将 16 位值推入 32 位宽的堆栈可能会导致堆栈未对齐 但我不明白的是 这是怎么发生的 因为PUSH and POP检查段描述符处的 D 标志 1 递增 递减 32
  • 如何在 Linux 64 位上用 C 编写简单的内联 asm 指令?

    我正在编写一个简单的 C 程序 我的要求是从程序的某些函数中打印 RIP 指令指针 我不想使用 ptrace 我用内联汇编尝试的一件事是 asm movl rip 0 r val 这应该将我的 rip 寄存器值复制到变量 val 但我收到编
  • .so 文件的 objdump?需要帮助来理解消息

    我正在开发一个与流相关的本机应用程序 我在我的 c 模块中遇到了一些问题 我收到的是来自 Logcat 的一些消息 这是 Logcat 消息 INFO DEBUG 28 Build fingerprint generic sdk gener
  • 使用 32 位块对 1024 位 2 的补码进行有符号乘法

    因此 我对 1024 位数字有以下结构定义 我想在此处使用 2 的补码表示 并且我使用的是 32 位系统 typedef struct int1024 int32 t num 32 should I use uint32 t int1024
  • 不使用eclipse安装Android模拟器

    如何在没有eclipse的电脑上安装android模拟器 android模拟器无需安装eclipse 只需下载 android sdk 并安装即可 安装android SDK之前必须先安装JDK 完成后安装成功 您将获得两个应用程序 SDK
  • emu8086中如何使用字符串

    我需要 emu8086 中字符串的帮助 我已经初始化了一个字符串 str1 db 0neWord 我有一个空字符串 str2 db 现在我需要检查所有信件str1并复制到str2 但如果字母在str1是 0 我需要将其替换为 O 如果不是
  • NASM Assembly 16bit“操作码和操作数的组合无效”

    所以我正在尝试编写一个程序来创建一个文件并在其中创建我的名字 但我得到了 操作码和操作数的无效组合 这mov handle ax 我不知道为什么 我看见here https stackoverflow com questions 29569

随机推荐

  • 在 Swift 中更改属性字符串的文本并保留属性

    对于数据库程序中的输出 我插入了某些文本标记以指示粗体或斜体 以及一些替换图像的文本 例如 Important 所有员工到休息室 的最终输出应为 重要的 所有员工到休息室 我编写了代码来查找周围带有 符号和 符号的文本 但我现在遇到的问题是
  • 检查对象是否是数字

    我想检查一个对象是否是一个数字 以便 ToString 会产生一个包含数字的字符串 NET 中是否可以通过简单的类型检查来实现 喜欢 if p is Number 或者我应该转换为string 然后尝试解析为double Update 澄清
  • 如何使用 .htaccess 文件启用 php 扩展

    我需要启用php intl扩展名仅在我网站的子域中 所以我使用 htaccess文件来使用此代码执行此操作
  • Spring 3.2 DeferredResult - 如何设置错误响应的状态代码?

    Spring Web 3 2 附带了DeferredResult用于异步请求处理的类 它有一个setErrorResult用于在出现问题时提供替代响应 但无法提供 http 错误代码 当然 必须可以控制失败请求的 http 响应代码 我如何
  • 如何在 TextInputLayout 中显示错误时禁用浮动

  • 根据id将数组中的n个对象合并到一个数组中

    我正在尝试合并下面列出的对象数组中的 n 个对象 我尝试使用reduce方法 但我不明白我做错了什么 对于高级js方法来说仍然是新的 const array data 1 foo bar test true 4 foo boor data
  • Google 应用程序引擎上的 Python 线程(或其等效项)解决方法?

    我想制作一个执行以下操作的 Google App Engine 应用程序 客户端发起异步http请求 服务器开始处理该请求 客户端发出 ajax http 请求来获取进度 问题是服务器处理 步骤 2 可能需要 30 秒以上 我知道 Goog
  • 如何在 android 中创建自定义渐变?

    我想知道这种渐变颜色在android中是否可行 如果可以的话怎么办 http www techandall com wp content uploads 2013 10 techandall mobile analytics UI conc
  • ASP.NET MVC:在所有操作上执行代码(全局 OnActionExecuting?)

    是否有一个我可以覆盖的 全局 OnActionExecutingall我的 MVC 操作 无论控制器如何 在被调用时会执行某些操作 如果是这样 怎么办 Asp net MVC3 添加了对全局过滤器 http weblogs asp net
  • 如何以编程方式检测操作系统 (Windows) 何时唤醒或进入睡眠状态

    背景 我儿子喜欢在不应该使用笔记本电脑的时候使用他的笔记本电脑 我只是想如果我可以编写一个应用程序 每当他打开 关闭笔记本电脑时就会向我发送电子邮件 这会很方便 我什至愿意接受当机器上有网络流量时通知我的东西 Question 如何以编程方
  • BCrypt 性能恶化

    我们在 Jboss 服务器 6 1 中运行三个 Web 应用程序 标准 Spring MVC Hibernate 所有三个应用程序共享一个通用的身份验证方法 该方法被编译为 JAR 并包含在每个 WAR 文件中 我们的身份验证方法使用 or
  • 格式化字母数字字符串

    我有一个包含 16 个字母数字字符的字符串 例如F4194E7CC775F003 我想将其格式化为 F419 4E7C C775 F003 我尝试使用 string Format 0 F4194E7CC775F003 但这不起作用 因为它不
  • Sublime Text 是否支持 CSS/SASS 文件的实时编辑?

    Sublime Text 支持文件实时编辑吗 我正在寻找更好的工作流程 我真的很喜欢 Sublime Text 但最近我被 Codepen io 和 最近测试的 Adobe Brackets 等工具的 实时编辑 功能宠坏了 当我回到 Sub
  • Boost Python 的性能

    我正在做一个项目 正在尝试使用 boost python 当研究如何组织我的 python 界面时 我遇到了一个问题comment https stackoverflow com questions 4774807 how to organ
  • 立即应用用户界面更改

    我正在 Android 上编写一些 ui 屏幕 有时我需要立即查看 ui 更改 但可以在下一个 ui 线程请求中看到该更改 因此 例如 如果我删除屏幕上的一个视图并以编程方式添加另一个视图 然后更改整个视图 使用 viewAnimator
  • 节点的 xlabels 与点中的边缘重叠

    我尝试使用 dot 绘制图表 但遇到以下问题 节点的标签b与边缘重叠a to b 有没有办法以某种方式移动这个标签来避免这种情况 这是我用来生成图像的代码 使用dot digraph A rankdir LR center true mar
  • 是否需要担心“解析器规则中的隐式标记定义”?

    我正在使用 ANTLR 和 ANTLRWorks 2 创建我的第一个语法 我已经完成了语法本身 它识别用所描述的语言编写的代码并构建正确的解析树 但除此之外我还没有开始任何事情 让我担心的是 解析器规则中第一次出现的标记都会用黄色曲线下划线
  • 用 C++ 读取配置 xml 文件

    如何在C 中读取以下配置文件 STL有支持吗 我无法使用其他第三方库
  • 动画 UIButton Down - Xcode

    我想知道当点击时如何使 UIButton 向下动画 IBAction 提前致谢 在你的里面IBAction UIButton button UIButton sender animates button 25 pixels right an
  • 将寄存器加载到自身的指令的目的是什么?

    在查看 Gameboy 的指令集时 我遇到了如下指令 LD A A LD B B LD C C LD D D 每条指令都有自己的操作码这张桌子 http www pastraiser com cpu gameboy gameboy opco