问题标签 [carryflag]

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 投票
2 回答
569 浏览

c - 这个汇编代码中的进位标志是如何设置的?

给定以下 16 位 PRNG 函数的汇编代码,

名为@sagara 的用户将代码翻译为 C:

我对两件事感到困惑。

  1. 在这一行...

    为什么有一个+ 1?我认为是ADC操作的原因,但是我们如何确定进位标志设置为 1?以前的哪些操作可以保证这一点?XBC? _ 我阅读了一些帖子,例如Assembly ADC (Add with carry) to C++Overflow and Carry flags on Z80但我不清楚,因为指令集似乎不同我不熟悉65C816 汇编。(这是 1994 年流行的 SNES 游戏,它的北美发行周年纪念日刚刚过去;免费投票给正确的猜测 :-)

  2. 在下一行...

    为什么会这样?我将其读作“当且仅当高字节非零时设置进位标志”。但是,如果高字节为零,难道不是溢出的指示(我可能误解了这条线在做什么。)

提前感谢您的任何见解。

0 投票
1 回答
946 浏览

assembly - 汇编语言转换为进位标志

我目前有一个任务,我必须用汇编语言编写代码,在其中你接受用户输入以获取 4 位十六进制值并将其转换为二进制,然后在获得二进制值后,你必须将其转换为月日和年,其中前 7 位数字是年份,接下来的 4 位是月份,最后 5 位是日期。

我将所有内容都转换为二进制,并且知道如何将其从二进制转换为年、月和日的正常整数值。当我运行我的代码时,输​​出是0/0/0. 我不确定这是我在换档时搞砸的地方还是其他什么地方。你们能看一下并给我一个关于在哪里更正的意见吗?在我粘贴的代码中,我只输入了 calcYear 并认为我可以解决这个问题,然后从那里开始处理其余部分。

我的代码:

0 投票
2 回答
416 浏览

arm - 当结果写回内存时,处理器(尤其是 ARM)如何在执行的后期解释溢出结果

由于处理器遵循将数字表示为 2 的补码的约定,它们如何知道由两个正数相加产生的数字是否仍然是正数而不是负数。

例如,如果我添加两个 32 位数字:

r2包含值- 0x50192E32

示例代码:

这里设置了溢出标志。现在,如果我想在以后的指令中使用内存中存储的结果(在代码中的某处......现在由于不同的指令让处理器cpsr已更改),如下所示:

由于第一条加法指令的 MSB 中有1 ,即现在 r5的MSB中有1,处理器如何解释该值。因为两个正数相加的正确结果是正数。是否仅仅因为MSB 有 1,它解释为负数?在这种情况下,我们会得到与预期不同的结果。

例如,在4 位机器中:

2 的补码:4=0100 和 5=0101;-4=1100 和 -5=1011

现在4+5=9并且如果它作为 1001 存储在寄存器/内存中,然后如果它被另一条指令访问并且给定处理器以 2 的补码格式存储数字并检查 MSB并认为它是负数7.

如果这一切都取决于程序员,那么如何将正确的结果存储在 reg/mem 中。无论如何,我们可以对我们的代码做些什么来存储正确的结果?

0 投票
1 回答
6073 浏览

verilog - 来自 4 位进位预读 (CLA) 的 16 位加法器 - 来自块生成和传播的 Cout

我是 Verilog 的新手。这是我到目前为止所做的,并且 4 位 CLA 有效。但是,16 位(使用 4 位 CLA 的实例)没有。问题肯定在于从块传播( )和块生成( )中设置Cout_itermed(中间进位)值。我创建了一个模块来处理这个问题。BPBGcarries

在 Xilinx ISE 中,输出波形如下所示(未显示波形):

赛灵思 ISE

当我运行 4 位 CLA 的测试台时,波形确实显示(并且正确)。任何人都可以解释问题出carries在模块或CLA_16bit模块中吗?

0 投票
2 回答
3918 浏览

assembly - x86 sbb 与第一个和第二个操作数具有相同的寄存器

我正在分析一系列x86指令,并对以下代码感到困惑:

我知道这sbb等于des = des - (src + CF),换句话说,第一条指令以某种方式-CF放入edx. 然后它negtive -CF变成CFtest是否CF等于零??

但请注意,jz检查标志ZF,不是CF!那么基本上上面的代码序列试图做什么?这是一个合法的x86指令序列,由g++version生成4.6.3

C++代码实际上来自botan项目。您可以在此处找到整体汇编代码(Botan RSA 解密示例)。反汇编代码中有很多这样的指令序列。

0 投票
2 回答
958 浏览

c++ - 使用 intel 内联汇编器对 bigint 加进位进行编码

我想做一个在大整数中添加 64 位数字的快速代码:

但以上不适用于携带。

我在这里看到另一个问题,建议使用 if 语句来检查哪个是优雅的:

但是,我想学习如何嵌入内联(英特尔)程序集并更快地做到这一点。我确信有 64 位操作码,相当于:

但我不知道如何将参数从其余的 c++ 代码传递给汇编程序。

0 投票
2 回答
3355 浏览

assembly - x86 中的进位和溢出标志是如何计算乘法的

当两个相乘的数字溢出寄存器时,如何使用这两个标志来正确计算答案?

例如,如果al保持0xff并乘以0x2,导致溢出到ax,标志如何帮助解决这个问题?

0 投票
2 回答
4241 浏览

assembly - 我无法理解 ARM 中的一些指令:SBC、RSC

我不明白SBCRSCARM 指令

我知道两者都处理进位标志(C)

我认为用进位 ( ) 添加结果是有意义的,ADC例如:

但是用进位减法/反向减法......我不明白发生了什么:(

你们能给我一个使用SBCand的例子RSC吗?

0 投票
1 回答
110 浏览

assembly - 如何将寄存器的值分配给CF?

假设我需要保存和恢复 CF 中的值。

我知道一种技术是使用pushfand popf。但这对我来说太贵了,因为我需要 CF。

我正在尝试使用一个寄存器来执行此操作。为了节省,我使用了setc %r12b. 但是,我不知道如何检索这个值,即如何做类似的事情 mov %r12b CF

非常感谢!

0 投票
2 回答
552 浏览

assembly - AT&T 大会携带标志

我再次需要 AT&T 组装方面的帮助,我已经将一些数据加载到内存中,如下所示(十六进制和十进制)。

假设第一个字节 = 数字计数,第二个 = 每个数字长度(以字节为单位),然后我们得到(第一个 * 第二个)字节的数字。对于此示例,3 个数字,每个 2 个字节,第一个数字是 16 39,依此类推。我想添加每个数字,所以在这种情况下,它会将 0x10 + 0xe8(低字节)添加到 result[0],然后将 0x27 + 0x03 添加到 result[1],然后再添加 result[0] = result[0] + 0x64 最后结果 [1] = 结果 [1] + 0x00。

当我将 0x64 添加到已经包含 0xf8 的结果 [0] 时,设置了 CF(进位标志),这当然很好,因为我想在下一个添加结果 [1] 中使用这个进位。但问题是,在下一条 CMP 指令之后(我将在下面的代码中标记它),这个进位标志被清除,所以最终结果是 0x5C2A(当我结合两个字节的结果时)并且应该是 0x5C2B(但是进位标志没有影响由于 cmp 指令而添加)。

%eax - 要求和的数字数量

%ecx - 每个数字的长度(以字节为单位)

%esi - 在循环开始之前指向“真实”数据的第一个字节(在这种情况下为 0x10)