符号从 8 位扩展到 16 位寄存器以获得 0xff00
Posted
技术标签:
【中文标题】符号从 8 位扩展到 16 位寄存器以获得 0xff00【英文标题】:Sign extending from 8 bits into 16 bit register to get 0xff00 【发布时间】:2021-07-21 21:32:39 【问题描述】:我正在 xilinx 开发一个“简单 cpu”项目,需要将值 0xFF00 存储在寄存器中,但汇编程序命令一次只能传递 8 位数据。
剩余位通过符号扩展填充。
所以 0xFF 变成 0xFFFF 而 0x0F 就是 F (0x000F)。
有没有简单的方法可以实现FF00?或者我需要更多的计算逻辑。 cpu 能够执行所有逻辑功能,将位添加、替换和滚动到左侧。
【问题讨论】:
这是 16 位,决定是 12 位还是 16 位。 16,我的错误是想到了函数的操作数 您的 ISA 是什么?你使用了什么指令?你可能有类似负载鞋面的东西吗? 0xFF00 不能是 8->16 位符号扩展的结果,因为高字节不是低字节高位的副本。我打算标记这个sign-extension,但听起来它实际上是关于在 -128 .. 127 范围之外构造任意 16 位常量,分为两半(假设对位模式进行 2 的补码解释)。或者你是说你只有一个mov reg16, sign_extended_imm8
用于 mov-immediate,并且想以某种方式获得 0xFF00?
一个明显的可能性是mov reg, 0xFF80
和add reg,reg
左移1。(即mov reg, -128
并通过左移或添加到自身将其加倍为-256
。)IDK你有什么实际的助记符,但大概 mov 和 add 是不言自明的。
【参考方案1】:
我认为您是在说您只有 mov reg16, sign_extended_imm8
之类的东西,并且您想要创建 FF00,而这无法直接使用符号扩展的 8 位数字。
0x80 符号扩展为 0xFF80,与您想要的值相差一个左移。
mov reg, 0xFF80 # or mov reg, -128
add reg, reg # shift left by 1, giving FF00
【讨论】:
【参考方案2】:我存储 0x7C 并向左滚动 6 位。
花费的时间比要求的要长,但至少会产生正确的输出。
结果是 F800,但它仍然是适合用途的红色阴影。
【讨论】:
彼得在 cmets 中的建议有什么问题吗? (加载0x80
得到0xFF80
然后添加到自身得到0xFF00
)以上是关于符号从 8 位扩展到 16 位寄存器以获得 0xff00的主要内容,如果未能解决你的问题,请参考以下文章