(译)win32asm教程-7

 

8.0关于数的一些事情

在大多数的编程语言中使用整数还是浮点数只取决于变量的声明。在汇编语言中,完全的不同。浮点数的计算是由特别的伪代码和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用于负值。对于dword值,它也一样: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大。

只要记住这点:

一个数字是有符号还是无符号取决于你怎样对待这个数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值