问题标签 [sign-extension]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1804 浏览

assembly - MOV 8 位到 16 位寄存器(al 到 bx)

如何解决将 8 位值移动到 BX 寄存器(16 位)的问题?

为此,我得到:

0 投票
2 回答
597 浏览

c++ - 如何安全地将 uint32_t 中的有符号字段提取为有符号数(int 或 uint32_t)

我有一个项目,在其中我得到一个 32 位 ARM 指令的向量,并且需要将部分指令(偏移值)读取为有符号(二进制补码)数字而不是无符号数字。

我使用了uint32_t向量,因为所有操作码和寄存器都被读取为无符号并且整个指令是 32 位的。

例如:

我有这个 32 位 ARM 指令编码:

最后 19 位是我需要读取为有符号整数分支位移的分支的偏移量。 本部分:1111111111111110110


我有这个函数,其中参数是整个 32 位指令:我向左移动 13 位,然后再次向右移动 13 位,以仅具有偏移值并移动指令的另一部分。

我已经尝试将此函数转换为不同的签名变量,使用不同的转换方式和使用其他 c++ 函数,但它会打印未签名的数字。

我得到十进制数524278 而不是 -10

我认为最后一个选项不是最好的,但它可能有效的是在字符串中设置所有二进制值。反转位并加 1 以转换它们,然后将新的二进制数转换回十进制。正如我在论文中所做的那样,但这不是一个好的解决方案。

0 投票
1 回答
94 浏览

c - 将有符号转换为无符号,反之亦然,同时扩大字节数

从上面的观察来看,似乎只有原始值很sign重要。即,如果原始的 32 位数字是无符号的,则将其转换为 64 位值将添加0's到其左侧,而不管目标值是有符号还是无符号,并且;

如果原始 32 位数字是有符号且为负数,则将其转换为 64 位值将添加1's到其左侧,而不管目标值是有符号还是无符号。

上述说法正确吗?

0 投票
1 回答
124 浏览

c++ - _mm256_movemask_epi8 到 uint64_t

有人可以解释一下为什么tr2tr4显示不同的结果:

_mm256_movemask_epi8(test1) 应该返回 int32,因此将它分配给 int64 应该只分配低位。

相反,tr2打印 0xFFFFFFFFFFFFFFFF 和tr4打印 0x00000000FFFFFFFF

作为tr4有什么表现吗?

我对 C++ 和内在函数都很陌生,所以也许我遗漏了一些明显的东西。

我正在使用 Visual Studio 2019 C++ 编译器。

0 投票
1 回答
390 浏览

assembly - 位移值对 ModRegRm 字节的 Mod 字段有什么影响?

我正在编写一个 8086 汇编程序,它接受指令并生成 8086 机器代码。我使用“Intel 8086 用户手册”作为参考。

为了清楚起见,我将解释情况。假设我想组装这条指令mov ax, bx。我会查手册发现,当 的操作数mov是 2 个 16 位寄存器时,操作码为movis0x89并指定操作数(源和目标)mov,在这种情况下,后面跟着一个 ModRegRm 字节,指定源和目的地,在这种情况下,是0xd8。二进制中的这个字节 = 11011000

Mod 为 2 位,Reg、Rm 各为 3 位。所以,Mod = 11,Reg = 011,Rm = 000。这里很简单,但有一些我不明白的地方,那就是寻址模式和位移。

模式表

查看表格和以下三个指令及其机器代码。

mov [bx+0x6], ax ;894706

mov [bx+0xbf],ax ;8987BF00

mov [bx+0xffff],ax ;8947FF

假设每条指令中的位移长度分别为 8 位、8 位、16 位,我错了吗?

我认为我是对的,因为它很明显,0x6并且0xbf是 1 字节和0xffff2 字节。

问题是,为什么第二条指令中的 MOD 字段10b or 0x02不是01b or 0x01? 应该是0x01因为位移是8bit位移吧?为什么0x01即使位移是16位,MOD也在第三条指令中?为什么汇编程序忽略了其余的位移而只捕获了 1 个字节?

0 投票
1 回答
267 浏览

riscv - RISC-V:12 位立即数逻辑运算是否对整个寄存器进行操作?

我正在尝试为 RISC-V CPU 编写一个模拟器,但找不到我的问题的明确答案。

假设我想使用

rs1 包含 0xFFFFFFFF,立即值为 0xFFF。

ANDI 是否对完整寄存器进行操作,并仅用零填充立即数的剩余 20 位,因此 rd 中的结果将为 0x000000FFF?

还是忽略高 20 位,rd 中的结果仍然是 0xFFFFFFFF?

XORI 和 ORI 命令的问题相同。

0 投票
1 回答
3895 浏览

if-statement - 生成 if 条件必须是常量表达式

我正在尝试为 RISC-V 程序集创建一个即时生成器,但我遇到了 if 语句。这是我在 Verilog 中的代码:

每个 if 语句都存在问题:生成 if 条件必须是常量表达式。

0 投票
0 回答
566 浏览

assembly - x86 程序集 - 从 dword 到 qword 的 mov 和 movzx?

我正在测试以下代码:

查看英特尔手册,似乎没有办法使用mov/movzx将 dword 移动到 qword;我看到的唯一方法是使用movsx和屏蔽前 32 位。这是令人惊讶的,提供了可用于 x86_64 的大量指令。

这是正确的,还是我错过了什么?

0 投票
1 回答
681 浏览

assembly - 为什么 2 的补码扩展通过添加符号位的副本来工作?

让我们以将 16 位有符号数符号扩展为 32 位寄存器为例,例如mov $+/-5, %ax movswl %ax, %ebx.

有两种可能的情况:

  1. 高位为零(数字为正)。这非常容易理解和直观。例如,如果我有 number 5,用零填充左边很容易理解。例如:

  2. 然而,对我来说,棘手的事情是当它是一个负数并且我们进行符号扩展时。例子:

是的,我知道我们只是用1. 但是是什么让它起作用呢?也许对二进制数的“属性”进行某种解释可以帮助我更好地理解这一点。

0 投票
1 回答
251 浏览

assembly - 在内存地址空间布局方面需要了解0x7fffffff和0xffffffff80000000背后的含义

上述代码片段是 libstdc++ 中函数 _M_extract_int() 执行流程的一部分。

我不明白这两个比较的意思。我认为 0xffffffff80000000 是可以用于用户模式的顶级物理内存地址。但是 0x7fffffff 呢?他们在检查什么?