符号从 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, 0xFF80add 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的主要内容,如果未能解决你的问题,请参考以下文章

MMX 符号扩展

在单臂霓虹灯寄存器中有效地将 8 位数字扩展到 12 位

汇编语言从入门到精通-通用寄存器功能的说明

16位寄存器的SSE无符号/有符号减法

MASM 程序集将 8 位寄存器移动到 16 位寄存器(即 mov cx,ch)[重复]

16位二进制补码有符号整数信号数据的位平面分解?