问题标签 [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.
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 都会以不可编码的错误拒绝它。其他汇编程序可能不同。
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 位在哪里呢?我已经什么都不懂了。
assembly - 在这种情况下,MOVSX 指令符号如何扩展输入?
我有以下反汇编:
[dest] = d5 cd e8 ca 68
我在下面给出了每条指令的解释和流程:
- 它从 [dest] 读取一个字节并将其存储在 eax 中。
- edx 的初始值为:F7FBB898。之后, movsx edx, al 指令它变为 FFFFFFD5。此时如何确保 edx 的值是 0x000000d5?
我在 [dest] 中的初始值应该是多少,以便在这些操作之后,eax 中的最终值是 0xd5 而不是 0xFFFFFFD5
assembly - 右移和左移汇编语言
例如,如果我想说 bx 是一个数字:
新的 bx 值是多少?它保持不变吗?
c - 为什么在将 unsigned char 转换为有符号数据类型时在汇编中使用 movzbl?
我正在学习MOV
汇编中的数据移动()。
我尝试编译一些代码以在 x86_64 Ubuntu 18.04 机器上查看程序集:
src_t
在哪里unsigned char
。至于,dst_t
我试过char
,short
和. 结果如下所示:int
long
我想知道为什么movzbl
在每种情况下都使用?不应该对应dst_t
吗?谢谢!
assembly - 如何隔离 64 位寄存器中的字节和字数组元素
我可以说这是一个超级简单的问题,但我还没有弄清楚。基本上,我只想能够将一个元素放入一个数组,并使用寄存器从中添加和减去一些数字,然后将结果放入我的结果变量中。
我知道解决方案与偏移量和索引有关,但我不明白我应该如何将一个数组元素放入寄存器。
我能做些什么?
assembly - MOV 8 位到 16 位寄存器(al 到 bx)
如何解决将 8 位值移动到 BX 寄存器(16 位)的问题?
为此,我得到:
assembly - 将值从寄存器存储到内存中的问题,ARM 32位
我是 ARM 和汇编程序的新手。我试图编写一个简单的程序来将值从寄存器存储到内存。
将数据写入内存时会出现问题。当它尝试写入值 370(十六进制:0x172)时,仅保存 0x72。STR 似乎只传输 8 个数据位。我用 STR 指令(例如,STRB)尝试了不同的配置,但没有任何效果。我的问题是如何将此值存储到内存中。
感谢您的任何帮助和回答。
assembly - 什么时候在汇编语言中使用扩展移动指令
我在教科书上看到movw %dx (%eax)
了,我想知道为什么使用movw
而不是movswl
或movzwl
这里?
我认为(对于 32 位机器)有 2 个字节%dx
和 4 个字节,所以它需要扩展吗?(%eax)
assembly - 将较小大小的值移动到寄存器中
我已经存储了一个字节的值,8
我想把它移到rax
寄存器中。我目前正在这样做以movzx
对字节进行零扩展:
指令如何movzx
“知道” at 的值-1(%rbp)
只有一个字节长?从这里说,如果我正确阅读它,它可以在 abyte
和 a上工作word
,但它怎么知道?例如,如果我添加了一个两字节的值,-2(%rbp)
它怎么知道要抓取这个两字节的值?是否有另一条指令可以让我在地址处获取一个one
或two
或four
字节值并将其插入 64 位寄存器?
我想另一种方法是首先将寄存器清零,然后将其添加到 8 位(或许多位)组件中,例如:
有没有一种方法比另一种方法更受欢迎?