问题标签 [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.
assembly - MOV 8 位到 16 位寄存器(al 到 bx)
如何解决将 8 位值移动到 BX 寄存器(16 位)的问题?
为此,我得到:
c++ - 如何安全地将 uint32_t 中的有符号字段提取为有符号数(int 或 uint32_t)
我有一个项目,在其中我得到一个 32 位 ARM 指令的向量,并且需要将部分指令(偏移值)读取为有符号(二进制补码)数字而不是无符号数字。
我使用了uint32_t
向量,因为所有操作码和寄存器都被读取为无符号并且整个指令是 32 位的。
例如:
我有这个 32 位 ARM 指令编码:
最后 19 位是我需要读取为有符号整数分支位移的分支的偏移量。 本部分:1111111111111110110
我有这个函数,其中参数是整个 32 位指令:我向左移动 13 位,然后再次向右移动 13 位,以仅具有偏移值并移动指令的另一部分。
我已经尝试将此函数转换为不同的签名变量,使用不同的转换方式和使用其他 c++ 函数,但它会打印未签名的数字。
我得到十进制数524278 而不是 -10。
我认为最后一个选项不是最好的,但它可能有效的是在字符串中设置所有二进制值。反转位并加 1 以转换它们,然后将新的二进制数转换回十进制。正如我在论文中所做的那样,但这不是一个好的解决方案。
c - 将有符号转换为无符号,反之亦然,同时扩大字节数
从上面的观察来看,似乎只有原始值很sign
重要。即,如果原始的 32 位数字是无符号的,则将其转换为 64 位值将添加0's
到其左侧,而不管目标值是有符号还是无符号,并且;
如果原始 32 位数字是有符号且为负数,则将其转换为 64 位值将添加1's
到其左侧,而不管目标值是有符号还是无符号。
上述说法正确吗?
c++ - _mm256_movemask_epi8 到 uint64_t
有人可以解释一下为什么tr2和tr4显示不同的结果:
_mm256_movemask_epi8(test1) 应该返回 int32,因此将它分配给 int64 应该只分配低位。
相反,tr2打印 0xFFFFFFFFFFFFFFFF 和tr4打印 0x00000000FFFFFFFF
作为tr4有什么表现吗?
我对 C++ 和内在函数都很陌生,所以也许我遗漏了一些明显的东西。
我正在使用 Visual Studio 2019 C++ 编译器。
assembly - 位移值对 ModRegRm 字节的 Mod 字段有什么影响?
我正在编写一个 8086 汇编程序,它接受指令并生成 8086 机器代码。我使用“Intel 8086 用户手册”作为参考。
为了清楚起见,我将解释情况。假设我想组装这条指令mov ax, bx
。我会查手册发现,当 的操作数mov
是 2 个 16 位寄存器时,操作码为mov
is0x89
并指定操作数(源和目标)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 字节和0xffff
2 字节。
问题是,为什么第二条指令中的 MOD 字段10b or 0x02
不是01b or 0x01
? 应该是0x01
因为位移是8bit位移吧?为什么0x01
即使位移是16位,MOD也在第三条指令中?为什么汇编程序忽略了其余的位移而只捕获了 1 个字节?
riscv - RISC-V:12 位立即数逻辑运算是否对整个寄存器进行操作?
我正在尝试为 RISC-V CPU 编写一个模拟器,但找不到我的问题的明确答案。
假设我想使用
rs1 包含 0xFFFFFFFF,立即值为 0xFFF。
ANDI 是否对完整寄存器进行操作,并仅用零填充立即数的剩余 20 位,因此 rd 中的结果将为 0x000000FFF?
还是忽略高 20 位,rd 中的结果仍然是 0xFFFFFFFF?
XORI 和 ORI 命令的问题相同。
if-statement - 生成 if 条件必须是常量表达式
我正在尝试为 RISC-V 程序集创建一个即时生成器,但我遇到了 if 语句。这是我在 Verilog 中的代码:
每个 if 语句都存在问题:生成 if 条件必须是常量表达式。
assembly - x86 程序集 - 从 dword 到 qword 的 mov 和 movzx?
我正在测试以下代码:
查看英特尔手册,似乎没有办法使用mov
/movzx
将 dword 移动到 qword;我看到的唯一方法是使用movsx
和屏蔽前 32 位。这是令人惊讶的,提供了可用于 x86_64 的大量指令。
这是正确的,还是我错过了什么?
assembly - 为什么 2 的补码扩展通过添加符号位的副本来工作?
让我们以将 16 位有符号数符号扩展为 32 位寄存器为例,例如mov $+/-5, %ax
movswl %ax, %ebx
.
有两种可能的情况:
高位为零(数字为正)。这非常容易理解和直观。例如,如果我有 number
5
,用零填充左边很容易理解。例如:然而,对我来说,棘手的事情是当它是一个负数并且我们进行符号扩展时。例子:
是的,我知道我们只是用1
. 但是是什么让它起作用呢?也许对二进制数的“属性”进行某种解释可以帮助我更好地理解这一点。
assembly - 在内存地址空间布局方面需要了解0x7fffffff和0xffffffff80000000背后的含义
上述代码片段是 libstdc++ 中函数 _M_extract_int() 执行流程的一部分。
我不明白这两个比较的意思。我认为 0xffffffff80000000 是可以用于用户模式的顶级物理内存地址。但是 0x7fffffff 呢?他们在检查什么?