我想知道是否有人可以解释为什么它会从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 为什么要翻转?
答案 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;得到你的结果。