【问题标题】:Negative operand in mov.b Instructionmov.b 指令中的负操作数
【发布时间】:2021-04-01 13:50:54
【问题描述】:

我目前正在努力解决 Microrupt CTF 中的河内阶段。本 CTF 专注于 MSP430 系列(RISC,16 位)。

我偶然发现了以下几行:

445c:  c443 fcff      mov.b #0x0, -0x4(r4)
.
.
.
4472:  5f44 fcff      mov.b -0x4(r4), r15

其中包含引用 (r4) 前面的负操作数的移动指令。 我假设这将指向存储在 r4 中的任何内容(前面两个字)前面的寄存器,但是查看内存转储,这个假设似乎不正确。

我使用https://www.ti.com/lit/ug/slau049f/slau049f.pdf作为参考,第3-52页是对mov.b的参考。

请告诉我这里到底发生了什么,或者给我一些关键字来搜索。

感谢任何帮助!

P.S.:请不要剧透如何解决这个阶段,我想自己想办法。谢谢!

【问题讨论】:

  • 你不能“指向一个寄存器”,这只是存储(然后重新加载)到地址r4 - 4的内存。内存地址是寄存器加上一个(负)偏移量。
  • 啊,我明白了,结果(假设存储在 f4 中的是 43FC)将是 43F8。 (在这种情况下是一个地址)。感谢您指出这一点,我现在可以看到内存的变化。
  • 我注意到,您删除了标签 risc,根据发布的参考资料,此控制器使用 RISC 16 位 CPU。为什么在这种情况下这个标签是错误的?
  • 欢迎添加您的评论作为答案,我会接受的。
  • 我删除了 RISC 标签,因为 MSP430 不是标准的 RISC 机器,一般来说,寻找有关 RISC 的东西的人在这里找不到任何相关的东西。立即存储到内存是非常非 RISC 的,而 MSP430 具有其他非 RISC 类特性。显然 TI 声称它具有类似 RISC 的内部结构 (quora.com/Is-MSP430-CISC-or-RISC)。我们如何对 MSP430 进行分类并不重要,只要它运行良好并且具有紧凑且易于解码的机器代码,无论 RISC 纯度如何。而且这个问题根本不是关于 RISC 设计理念的,只是关于 MSP430 的具体细节。

标签: assembly msp430 addressing-mode ctf


【解决方案1】:

正如Peter Cordes 的评论中所指出的,我最初的想法是正确的。 (即使措辞已关闭)

内存地址中存储的值,等于r4中存储的值加上偏移量-4的和递减 寄存器加上-4(偏移量)和 存储在 r15 中。 原来如此。


例子:

如果

r4 = 0x43FC 和 0x43F8 = 0xAB

说明

mov.b -0x4(r4), r15

将导致值 0x43FC - 0x4 = 0x43F8

在这个地址,0xAB 被存储。

结果:

r15 = 0xAB

【讨论】:

  • r15 = mem[r4 - 4],但你描述的是r15 = r4 - 4。此外,“递减”意味着修改了r4。我没有检查 MSP430 文档,但我认为寻址模式不会将地址写回地址寄存器。 (有些 CPU 有这个功能,例如 ARM 允许您选择更新基址寄存器,作为加载或存储指令的一部分,使用寄存器 + 偏移量)
  • 不,还是错了。您仍然没有提到从该地址的内存加载,只是对寄存器值进行数学运算。我上一条评论的第一句话仍然适用,这是两点中更重要的一点。