减少斧头

时间:2016-10-09 00:53:27

标签: assembly x86 cpu-registers

我想知道是否有人可以解释为什么它会从0000变为FFFF。

执行以下行后,EAX中的值是什么?

protected void moveBall() {
    if (x <= radius || x >= getWidth() - radius) {
        dx *= -1; // Change direction
    }
    // Adjust ball position
    x += dx; 

    //#######################################
    setTranslateX(x); // Move the Pane!!! ###
    //#######################################
}

eax中的值更改为3001FFFFh 为什么要翻转?

1 个答案:

答案 0 :(得分:0)

  

eax中的值变为3001FFFFh为什么会翻转?

eax的值是3002FFFFh。

初始指令将30020000h复制到EAX中。这将设置所有32位EAX。

第二条指令仅影响EAX的低16位,也称为AX。使用AX的任何指令都只会影响这些位,因此您将减少0000h。您的进位标志也将被设置。我想这里有一些有用的思考方法。

1-递增时会给你0000h的数字? FFFFh符合条件,因为如果你要添加一个,它会使最右边的F变为0,然后一个将进入下一个,等等。你的答案是10000h,不适合16位,留下你的16位为0000h。

2-要减去这个问题,你需要借用。

0000h  
  -1h  

你总是可以借这种数学。你只需要设置&#34;随身携带&#34;标志,表示你这样做!使用这个技巧,你真的有:

10000h  
   -1h  

现在答案显然是FFFFh,并且将设置进位标志。

3-这个数学实际上只是模2加权(寄存器大小)。这意味着您可以拍摄数字轮而不是数字线。像AX这样的16位寄存器具有2 ^ 16 = 65536种可能的组合,您可以写入0000h,0001h,0002h ... FFFEh,FFFFh,0000h等。正如从0000h递增到0001h,递减将转到FFFFh等等。

4-手动完成两个补码。当你减少时,你正在添加负数。

Start with 
  "1" =  0001h  
Invert the bits:  
     FFFEh  
Add one:  
Now you have the two's complement:
  "-1" = FFFFh   

然后将2的补码(FFFFh)添加到您尝试递减的数字(0000h),并获得FFFFh。

但你的问题是你得到3001FFFFh。再次检查:你没有。它是3002FFFFh。如果你减少eax而不是ax,你只能获得3001FFFFh。在这种情况下,你会借用&#34; 2&#34;得到你的结果。