问题标签 [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.
c - 组件 IA32 中的符号扩展
我是组装新手,我正在使用 IA32 架构。我正在尝试编写一个.s
产生以下操作的函数:C + A - D + B
- A 是一个 8 位变量
- B 是一个 16 位变量
- C 和 D 都是 32 位变量
该函数应该返回一个 64 位的值,该值必须用 C 语言打印,我无法弄清楚。
我正在尝试这个,它适用于正数的测试,但是当我使用负数时它不起作用,我无法弄清楚原因。
我的功能sum_and_subtract.s
:
一个正确的例子是:
- A = 0,B = 1,C = 0,D = 0;预期 = 1 -> 结果 = 1 并且适用于此示例
在以下情况下会出现错误:
- A = 0,B = 0,C = 0,D = 1;预期 = -1 -> 结果 = 256
看到你的评论后,我忘了写我的主要代码来打印我的 long long 结果。
主.c:
这里是。
我有这个其他文件sum_and_subtract.h
assembly - 在不使用 MOVZX/MOVSX 的情况下在汇编中进行零/符号扩展
我正在尝试进行零或符号扩展,但不使用MOVZX
or MOVSX
。
我基本上想模仿上述命令,但不使用它们。有没有办法做到这一点?
要从左侧添加 0,SHR
但我不太确定它是否可以正常工作,因为它会更改值...
我正在使用大会 8086
assembly - 如何在avr中将int8转换为int16
在我的计算机科学课上,我们这周才开始使用 AVR。我在将 8 位 int 转换为 16 位 int 所需的位操作方面遇到问题。对于上下文,我在 arduino 上运行程序。
这是我到目前为止所拥有的:
这正是我通过查看该网站上的文档和类似问题所得到的,但我不知道从这里去哪里,或者即使这是完全正确的。任何帮助将不胜感激!
assembly - 关于 MIPS I 型指令符号扩展的困惑
我正在学习 MIPS 指令,当我测试需要签署扩展立即数的 I 型指令时,我对以下结果感到困惑(它们都在 MARS 中运行):
- 假设我们有源代码行
ori $s1, $s2, 0xfd10
,MARS 给出了基本的汇编指令ori $17, $18, 0x0000fd10
。这是期望,因为零ori
应该扩展16 位立即数。如果我们只将函数更改ori
为andi
,即源代码行andi $s1, $s2, 0xfd10
,MARS 给出几乎相同的基本汇编指令andi $17, $18, 0x0000fd10
。但是,与 不同ori
的是,andi
应该使用符号扩展。所以基本的汇编指令应该是andi $17, $18, 0xfffffd10
.
andi
也应该使用零扩展!请忽略第一个问题。
slti rt, rs, imm
例如,当我尝试使用时slti $s1, $s2, 0x8000
,MARS 拒绝执行该行并且错误消息是"0x8000": operand is out of range
. 我看不出立即数超出范围的原因。如果我稍微改变一下立即数,比如说,slti $s1, $s2, 0x7fff
它会起作用,并且立即数会扩展到0x00007fff
. 我的期望是0x8000
应该扩展到0xffff8000
. 我的理解有什么问题吗?
assembly - 在 Thumb 模式下将寄存器符号扩展为 64 位(设置所有位 = 符号位)
我正在为 ARM7TDMI(ARMv4T 架构)使用汇编程序。我正在使用 Thumb 模式,因为 ROM 具有 16 位总线 (GBA)。我想对一个 32 位寄存器进行符号扩展,以获取另一个寄存器,其中所有位都设置为源寄存器第 31 位的副本。符号扩展的寄存器是一个高位寄存器,特别是 R9。
我目前正在使用这个:
但这需要 4 条指令。有没有更短的方法?
assembly - 汇编 movsbq 指令
movz
我理解和之间的区别movs
。
movz
用零填充空字节,同时movs
用符号位(零或一)填充它们。
但是,我遇到了以下示例
movabsq $0x0011223344556677, %rax
movb $0xAA, %dl
movb %dl, %al
movsbq %dl, %rax
在第 3 行之后,%rax = 00112233445566AA
. 直到这我才明白。但是我不明白为什么 %rax 在第 4 行之后等于。 FFFFFFFFFFFFFFAA
不应该是00000000000000AA
因为 %dl 是正数,所以空位填充为零吗?
mips - lh/lb(Load Half / Load Byte)中的符号扩展发生在哪里?
我研究了 mips 一段时间,关于( RIJ )格式以及在处理 I 格式时何时需要符号扩展。
但是在 lh(Load Half) 或 lb(Load Byte) 的情况下,一旦它们从内存中取出,它们的符号就会从 8 位/16 位扩展到 32 位以避免潜在的错误,但是什么时候会发生这种情况?
符号甚至在进入 ALU 之前就扩展了立即数,但是在从内存中读取所需的数据之后,需要在将其保存到寄存器之前进行符号扩展。
但是 mips 架构的覆盖(单周期)在 WriteBack 阶段没有符号扩展步骤,这是如何工作的?