相关疑难解决方法(0)

Z80上的溢出和进位标志

我已经完成了在我的Z80核心上实现ADD A,r组操作码.我对我认为已经钉入的进位和溢出标志有点混淆,但我想把它放到社区检查我是对的.

基本上,从我所看到的,Z80中的ALU并不关心有符号/无符号运算,只是添加了位.这意味着如果将两个8位值相加并由于它们的相加而产生9位值,则将设置进位标志.这包括添加两个负二的补数,例如-20(11101100)和-40(11011000),因为虽然结果是-60(11000100),但结果实际上是9位值1 1100 0100.这肯定意味着如果添加两个负二的补码值,即使没有溢出条件,也会始终设置进位标志 - 我是对的吗?

其次,我决定检测此指令中的溢出,我会将两个操作数的第7位异或,如果结果是10000000,那么肯定没有溢出 - 如果结果是00000000那么可能会有溢出这些符号是相同的,因此我将XOR的第7位与任一操作数的第7位相加,如果结果为10000000,则发生溢出,并设置P/V溢出标志.我也在这儿吗?

对于这样一个令人费解的问题我很抱歉,我很确定我是对的但是在我继续根据这个逻辑进行无数更多指令之前我需要知道.非常感谢.

math assembly z80

23
推荐指数
2
解决办法
1万
查看次数

在x86中进行/溢出和减法

我试图在x86中包围溢出和携带标志.

据我了解,为了添加带符号2的补码数,只能用四种方式之一生成标志(我的例子是4位数):

  1. pos + pos = neg(溢出)
    • 0111 + 0001 = 1000(7 + 1 = -8)
  2. pos + neg = pos(carry)
    • 0011 + 1110 = 0001(3 + -2 = 1)
  3. neg + neg = neg(carry)
    • 1111 + 1111 = 1110(-1 + -1 = -2)
  4. neg + neg = pos(溢出和进位)
    • 1000 + 1001 = 0001(-8 + -7 = 1)

那么,在x86汇编中,从A中减去B会产生与添加A和-B相同的标志吗?

math x86 overflow twos-complement carryflag

13
推荐指数
2
解决办法
8271
查看次数

最少组装或编译至少三个值

我正在查看GCC-4.8为x86_64生成的代码,并想知道是否有更好(更快)的方法来计算三个值的最小值.

下面是Python的摘录收集模块,计算最低的m,rightindex+1leftindex:

    ssize_t m = n;
    if (m > rightindex + 1)
        m = rightindex + 1;
    if (m > leftindex)
        m = leftindex;
Run Code Online (Sandbox Code Playgroud)

GCC使用CMOV生成依赖于序列的依赖代码:

leaq    1(%rbp), %rdx
cmpq    %rsi, %rdx
cmovg   %rsi, %rdx
cmpq    %rbx, %rdx
cmovg   %rbx, %rdx
Run Code Online (Sandbox Code Playgroud)

是否有更快的代码可以通过删除数据依赖性来利用处理器无序并行执行?我想知道是否存在用于计算多个值的最小值而不使用条件或谓词指令的已知技巧.我也想知道是否有一些饱和的算术内在函数可以帮助解决这种情况.

EDITS:

c optimization assembly x86-64 intrinsics

6
推荐指数
2
解决办法
1256
查看次数