问题标签 [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.
assembly - x86 否定 (NEG) / 减法 (SUB) 何时设置进位标志?
“将 NEG 指令应用于非零操作数始终设置进位标志”是什么意思。
为什么从 1 中减去 2 会设置进位标志?
assembly - Branch and carry added by compiler
I'm looking at a disassembly of an executable I just built, and I'm confused as to what this line can possibly mean:
The branch instruction has a carry bit (c) set, but it just branches to itself. It looks like an infinite loop, but I did not insert this code; it was entirely compiler generated (GCC 4.6.3).
Can anyone shed some insight on this?
assembly - 溢出与携带标志,非常基本的术语
我一直试图让我的头脑围绕溢出与携带(对于ARM7,但足够基本,我的意思是适用于任何东西的术语)。
我想我终于有了它 - 但我想检查我的“真正的基本理解”是否正确,所有复杂性都已消除,是否真的只是归结为:
谢谢,
verilog - 计算进位保存数的符号
有谁知道如何以进位保存格式计算数字的符号,即使用虚拟和和虚拟进位,而不将它们加在一起?一个verilog的例子是理想的。谢谢!
assembly - 汇编语言和进位标志中的负运算
当我用汇编语言对 A79CDB48h 进行负操作时,我将 CF(进位标志)设置为 1。有人可以解释为什么会发生这种情况
x86 - X86 处理器中的辅助标志
当低半字节产生到高半字节的进位时,辅助标志置位。例如:
在这种情况下,设置了腋窝进位。
我还听说这个进位用于在 BCD 加法过程中将 0110 添加到低位半字节,以获得正确的 BCD 答案。
但是考虑一下这种情况
在这种情况下,该半字节不生成进位,未设置辅助进位,但答案不是正确的 BCD 加法。那么是什么促使处理器纠正答案并得到正确的 BCD 答案呢?
assembly - 什么是十六进制减法中的借位?(集会)
快速提问,我正在阅读 Richard C. Detmer 的题为“80x86 汇编语言和计算机体系结构简介”的教科书,在第 21 页和第 22 页上,它讨论了借用的概念,但它并没有真正描述它的真正含义. 以下是正文:
在计算机中,数字 a 和 b 的减法 a - b 通常通过取 b 的 2 的补码并将结果加到 a 来执行。这对应于添加 b 的否定。例如,对于十进制减法 195 - 618 = -423,
00C3 - 026A
改为加FD96,即026A的2的补码。
00C3 + FD96 = FE59
十六进制数字 FE59 表示 -423。查看前面的二进制加法,您有
0000 0000 1100 0011 + 1111 1101 1001 0110 = 1111 1110 0101 1001
请注意,加法中没有进位。但是,这个减法确实涉及借用。当 b 大于 a 作为无符号数时,a - b 减法中会出现借位。计算机硬件可以通过查看相应的加法中是否出现进位来检测减法中的借位。如果加法没有进位,则减法中有借位。如果加法中有进位,则减法中没有借位。(请记住,“携带”本身就是“执行”。)
这是另一个例子。使用字长 2 的补码表示进行十进制减法 985 - 411 = 574,
03D9 - 019B
改为添加 FE65,即 019B 的 2 补码。
03D9 + FE65 = 1023E
0000 0011 1101 1001 + 1111 1110 0110 0101 = 1 0000 0010 0011 1110
去掉多余的 1,十六进制数字 023E 代表 574。这个加法有一个进位,所以在相应的减法中没有借位。
什么是减法借位?我想当例如 00C3 - 026A 时,A 大于 3,所以我们必须从相应的 C 中“借用”,将其设为 B,现在将其设为 13(以 16 为底)减去 A。我们可以这样做,但是发生了“借”。在这个特定的例子中,确实发生了本书上下文中的借用。但是当我们看下一个例子时,他们给了我们 03D9 - 019B,B 比 9 大,所以我们必须从 D 中“借用”它,将其设为 C 并将 9 设为 19(以 16 为底)减去 B。我们可以做到,并且发生了“借用”,但书上说没有发生借用。
什么是借?我知道你知道是否发生了一个进位是否发生在加法中但进行原始减法,什么是真正的借位。我什么时候可以确定是否发生了?
例如,您知道发生进位是因为有一个额外的十六进制数字。长度超出了您的两个十六进制数字的长度(希望保持在其中的长度)。
谢谢你。
-担
arm - 如何确定是否在C中发生执行
我正在编写一个 ARM11 仿真器,现在我正在尝试设置 N(负结果)、Z(零)、C(执行)和 V(溢出)的 CPRS 标志
这就是规范所说的:
逻辑运算(and、eor、orr、teq、tst 和 mov)中的 C 位将被设置为任何移位操作的进位(即桶形移位器的结果)。在算术运算(add、sub、rsb 和 cmp)中,C 位将设置为 ALU 的第 31 位的进位。
我的问题是,我如何确定逻辑和算术运算的执行?操作在两个 uint32_t 上工作,例如我的 eor 操作只返回 x ^ y,然后我需要设置 CPRS 标志。
编辑:对于加法,如果加法产生进位(无符号超过 ow),则 C 设置为 1,否则设置为 0。对于减法(包括比较),如果减法产生借位,则位 C 设置为 0,否则设置为 1。
gcc - 减法和检测下溢,最有效的方法?(带有 GCC 的 x86/64)
我正在使用 GCC 4.8.1 编译 C 代码,我需要检测 x86/64 架构的减法中是否发生下溢。两者都是未签名的。我知道在汇编中很容易,但我想知道我是否可以在 C 代码中完成它并让 GCC 以某种方式对其进行优化,因为我找不到它。这是一个非常常用的功能(或低级,是这个词吗?)所以我需要它高效,但 GCC 似乎太笨了,无法识别这个简单的操作?我尝试了很多方法在 C 中给它提示,但它总是使用两个寄存器,而不仅仅是一个 sub 和一个条件跳转。老实说,看到如此愚蠢的代码编写了很多次(函数被调用了很多次),我感到很恼火。
我在 C 语言中的最佳方法似乎如下:
基本上,从 a 中减去 b,如果结果下溢检测到它并进行一些条件处理(这与 a 的值无关,例如,它会带来错误等)。
GCC 似乎太笨了,无法将上述内容简化为子跳转和条件跳转,相信我,我尝试了很多方法在 C 代码中执行此操作,并尝试了很多命令行选项(当然包括 -O3 和 -Os)。GCC 所做的事情是这样的(英特尔语法汇编):
不用说上面是愚蠢的,当它所需要的只是:
这太烦人了,因为 GCC 确实理解 sub 以这种方式修改标志,因为如果我将其类型转换为“int”,它将生成与上面完全相同的内容,除了它使用带有符号跳转的“js”,而不是进位,这不会如果无符号值差异足够高以设置高位,则工作。尽管如此,它表明它知道影响这些标志的子指令。
现在,也许我应该放弃尝试让 GCC 正确优化它并使用我没有问题的内联汇编来完成它。不幸的是,这需要“asm goto”,因为我需要有条件的 JUMP,而 asm goto 的输出效率不是很高,因为它是易变的。
我尝试了一些东西,但我不知道使用它是否“安全”。asm goto 由于某种原因不能有输出。我不想让它将所有寄存器刷新到内存,这会扼杀我这样做的全部意义,这是效率。但是,如果我使用空的 asm 语句,并且在它之前和之后将输出设置为“a”变量,那会起作用吗?它安全吗?这是我的宏:
并像这样使用它:
这有点难看,但效果很好。在我的测试场景中,它只编译 FINE 而没有易失性开销(将寄存器刷新到内存)而不会产生任何不好的东西,而且它似乎工作正常,但这只是一个有限的测试,我不可能在任何地方测试这个我使用这个函数/macro 正如我所说的,它被使用了很多,所以我想知道是否有人知识渊博,上述构造是否有不安全之处?
特别是,如果发生下溢,则不需要“a”的值,因此考虑到这一点,我的内联 asm 宏是否会发生任何副作用或不安全的事情?如果不是,我会毫无问题地使用它,直到他们优化编译器,所以我猜后可以将其替换回来。
请不要将其变成关于过早优化或其他问题的辩论,请继续关注问题的主题,我完全了解这一点,所以谢谢。
c - 使用 16b 值时检测溢出和进位
我正在使用带符号的 16 位宽变量。当加法,减法等时,我可以通过以下方式检测进位和溢出:
我将结果存储在一个 32 位宽的变量中,然后检查第 17 位(0-16 位代表值,如果有进位或溢出,第 17h 位应该是 1 - 溢出)?如果它是一个那么它是一个溢出/进位,如果它是零 - 它不是。使用 16b 值时是否可以进位而不溢出,反之亦然?
我搜索了 StackOverflow,但我无法找到我的问题的明确答案。