问题标签 [zero-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 投票
3 回答
10252 浏览

assembly - 带有负立即常数的 MIPS 中的 andi 与 addi 指令

假设 $t2= 0x55555550,然后执行以下指令:

$t2 变成0x0005550

MIPS 仿真器1证实了这一点

然而,这不是我所期望的。我认为答案应该是 0x55555550 & 0xFFFFFFFF = 0x55555550。我认为常数 -1 在 and 逻辑之前被符号扩展为 0xFFFFFFFF 。但似乎答案是 0x55555550 & 0x0000FFFF

为什么 -1 符号扩展为 0x0000FFFF 而不是 0xFFFFFFFF


脚注 1:编者注:启用“扩展伪指令”的 MARS 确实将其扩展为多个指令以0xffffffff在 tmp 寄存器中生成,因此保持$t2不变。否则,MARS 和 SPIM 都会以不可编码的错误拒绝它。其他汇编程序可能不同。

0 投票
3 回答
1534 浏览

assembly - 零/符号扩展是无操作的,为什么每种尺寸类型的说明?

对于 x86 和 x64 编译器生成类似的零/符号扩展 MOVSX 和 MOVZX。扩展本身不是免费的,但允许处理器执行无序的魔法加速。

但在 RISC-V 上:

因此,无符号和有符号 32 位整数之间的转换是无操作的,从有符号 32 位整数到有符号 64 位整数的转换也是如此。

加法和移位需要一些新指令 (ADD[I]W/SUBW/SxxW) 以确保 32 位值的合理性能。

(C) RISC-V 规范

但同时,新的现代 RISC-V 64 位处理器包含 32 位有符号整数的指令。为什么?提高性能?那么 8 位和 16 位在哪里呢?我已经什么都不懂了。

0 投票
1 回答
349 浏览

assembly - 在这种情况下,MOVSX 指令符号如何扩展输入?

我有以下反汇编:

[dest] = d5 cd e8 ca 68

我在下面给出了每条指令的解释和流程:

  1. 它从 [dest] 读取一个字节并将其存储在 eax 中。
  2. edx 的初始值为:F7FBB898。之后, movsx edx, al 指令它变为 FFFFFFD5。此时如何确保 edx 的值是 0x000000d5?

我在 [dest] 中的初始值应该是多少,以便在这些操作之后,eax 中的最终值是 0xd5 而不是 0xFFFFFFD5

0 投票
1 回答
126 浏览

assembly - 右移和左移汇编语言

例如,如果我想说 bx 是一个数字:

新的 bx 值是多少?它保持不变吗?

0 投票
1 回答
871 浏览

c - 为什么在将 unsigned char 转换为有符号数据类型时在汇编中使用 movzbl?

我正在学习MOV汇编中的数据移动()。
我尝试编译一些代码以在 x86_64 Ubuntu 18.04 机器上查看程序集:

src_t在哪里unsigned char。至于,dst_t我试过char,short和. 结果如下所示:intlong

我想知道为什么movzbl在每种情况下都使用?不应该对应dst_t吗?谢谢!

0 投票
1 回答
345 浏览

assembly - 如何隔离 64 位寄存器中的字节和字数组元素

我可以说这是一个超级简单的问题,但我还没有弄清楚。基本上,我只想能够将一个元素放入一个数组,并使用寄存器从中添加和减去一些数字,然后将结果放入我的结果变量中。

我知道解决方案与偏移量和索引有关,但我不明白我应该如何将一个数组元素放入寄存器。

我能做些什么?

0 投票
1 回答
1804 浏览

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

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

为此,我得到:

0 投票
1 回答
829 浏览

assembly - 将值从寄存器存储到内存中的问题,ARM 32位

我是 ARM 和汇编程序的新手。我试图编写一个简单的程序来将值从寄存器存储到内存。

将数据写入内存时会出现问题。当它尝试写入值 370(十六进制:0x172)时,仅保存 0x72。STR 似乎只传输 8 个数据位。我用 STR 指令(例如,STRB)尝试了不同的配置,但没有任何效果。我的问题是如何将此值存储到内存中。

感谢您的任何帮助和回答。

0 投票
0 回答
113 浏览

assembly - 什么时候在汇编语言中使用扩展移动指令

我在教科书上看到movw %dx (%eax)了,我想知道为什么使用movw而不是movswlmovzwl这里?

我认为(对于 32 位机器)有 2 个字节%dx和 4 个字节,所以它需要扩展吗?(%eax)

0 投票
2 回答
295 浏览

assembly - 将较小大小的值移动到寄存器中

我已经存储了一个字节的值,8我想把它移到rax寄存器中。我目前正在这样做以movzx对字节进行零扩展:

指令如何movzx“知道” at 的值-1(%rbp)只有一个字节长?从这里说,如果我正确阅读它,它可以在 abyte和 a上工作word,但它怎么知道?例如,如果我添加了一个两字节的值,-2(%rbp)它怎么知道要抓取这个两字节的值?是否有另一条指令可以让我在地址处获取一个onetwofour字节值并将其插入 64 位寄存器?

我想另一种方法是首先将寄存器清零,然后将其添加到 8 位(或许多位)组件中,例如:

有没有一种方法比另一种方法更受欢迎?