(譯)win32asm教程-7 (轉)

gugu99發表於2008-05-28
(譯)win32asm教程-7 (轉)[@more@] 

8.0關於數的一些事情:namespace prefix = o ns = "urn:schemas--com::office" />

在大多數的語言中使用整數還是浮點數只取決於變數的宣告。在語言中,完全的不同。浮點數的計算是由特別的虛擬碼和FPU協(浮點單元)完成的。浮點指令將會在後面討論。先來看看一些關於整數的事情。在c語言中有signed(有符號)整數和unsigned(無符號)整數。Signed是意為數有符號(+或-)。Unsigned總是正。找出下表中的不同(再一次的,這是一個byte的例子,它在其他大小時也同樣工作)。

00

01

02

03

...

7F

80

...

FC

FD

FE

FF

無符號意義

00

01

02

03

...

7F

80

...

FC

FD

FE

FF

有符號意義

00

01

02

03

...

7F

-80

...

-04

-03

-02

-

因此,在有符號數中,一個byte被分為兩段:0~7F用於正值。80~FF用於負值。對於d值,它也一樣:0~7FFFFFFFh為正,80000000~FFFFFFFFh為負,正如你可能已經注意到的一樣,負值的最高位有一個集合,因為它們比80000000h大。這位被稱為符號位。

3.  1有符號或無符號?

你和處理器都不能看出一個值是signed還是unsigned。好訊息是對於加法和減法來說,一個數是signed還是unsigned沒有關係。

計算:-4+9

FFFFFFFC+00000009=00000005(這是對的)

計算:5-(-9)

00000005-FFFFFFF7=0000000E(這也是對的,5――9=4)

壞訊息是對於乘法,除法和比較(compare)並不是這樣。因此,對於signed數有特殊的乘除虛擬碼:imul和idiv

Imul也有一個比mul好的地方在於它可以接受直接數值:

imul src
imul src, immed
imul dest,src, 8-bit immed
imul dest,src

idiv src

它們幾乎和mul,div一樣,只是它們可以計算signed值。比較(compare)可以和unsigned一樣用。但標誌作不同的設定。因此,對於符號和無符號數字有不同的jump指令:

cmp ax, bx
ja somewhere

ja是一個無符號跳轉指令。如果大於就跳轉。考慮這個ax=FFFFh(無符號時為FFFFh,有符號時為-1)和bx=0005h(無符號時為5,有符號時為5)。由於FFFFh在無符號時比0005大,ja指令會跳轉,但如果用的是jg(指一個有符號跳轉):

cmp ax, bx
jg somewhere

jg指令不會跳轉,因為-1不比5大。

只要記住這點:

一個數字是有符號還是無符號取決於你怎樣對待這個數。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004741/,如需轉載,請註明出處,否則將追究法律責任。

相關文章