LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2123|回复: 7

x86汇编里怎么区分符号数和无符号数啊?

[复制链接]
发表于 2007-12-2 11:11:59 | 显示全部楼层 |阅读模式
比如, 0xfffffffe+0x1  这个加法运算, 执行后会不会去设置EFLAGS里C flag呢? 因为如果按照无符号数运算的话, 应该不设(因为并没有超过UMAX); 而作为符号数运算的话, 即-2+1, 应该会设C flag(因为结果为负).  虽然运算结果都一样(0xffffffff), 但如果设置C flag不同, 这不是会产生歧义吗?

   这不像ARM汇编, 以上两种情况都会设置C flag.
发表于 2007-12-2 17:21:47 | 显示全部楼层
在80386算术指令中,有带位不带位的指令分工
也就是说,用的是不同的指令。
你看一看80386的指令系统就知道了

同理80x86的都是向下兼容的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-2 22:20:08 | 显示全部楼层
你的意思是说, 符号数加法和无符号数加法的指令是不同的?

这和我以前理解的大不一样, 能否举一下符号加法和无符号加法的指令各是什么?  

我手头暂时没有386的指令介绍
回复 支持 反对

使用道具 举报

发表于 2007-12-2 23:11:29 | 显示全部楼层
Post by bzw2000;1790425
比如, 0xfffffffe+0x1  这个加法运算, 执行后会不会去设置EFLAGS里C flag呢? 因为如果按照无符号数运算的话, 应该不设(因为并没有超过UMAX); 而作为符号数运算的话, 即-2+1, 应该会设C flag(因为结果为负).  虽然运算结果都一样(0xffffffff), 但如果设置C flag不同, 这不是会产生歧义吗?

   这不像ARM汇编, 以上两种情况都会设置C flag.

x86的标志定义和ARM不太一样,cf可以理解为只针对无符号就是说加法超过FFFFFFFF,减法低于00000000才会置一
of才是针对有符号的,正+正=负;负+负=正;正-负=负;负-正=正。。。等溢出情况会置一。
加减法不分有无符号,乘除法倒是分得
回复 支持 反对

使用道具 举报

发表于 2007-12-3 12:42:21 | 显示全部楼层
加减法有无符号都是一样的,不信LZ可以自己试试?
只有乘除法才有符号分别的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-5 00:15:18 | 显示全部楼层
Post by Akrit;1790676
x86的标志定义和ARM不太一样,cf可以理解为只针对无符号就是说加法超过FFFFFFFF,减法低于00000000才会置一
of才是针对有符号的,正+正=负;负+负=正;正-负=负;负-正=正。。。等溢出情况会置一。
加减法不分有无符号,乘除法倒是分得



在x86里, movl 0xfffffffe, %eax
              addl $1,%eax             //即-2+1
执行完上述第二条指令后, 结果是0xffffffff(是加法指令,并且没有溢出), 但是还是置位了C flag,  是这样的吧??
回复 支持 反对

使用道具 举报

发表于 2007-12-5 14:54:02 | 显示全部楼层
由程序员自己区别,CPU在运算时之设置相应的标志位。在进行无符号运算时判断近位标志,在进行有符号运算时判断符号位和溢出标志。
回复 支持 反对

使用道具 举报

发表于 2007-12-7 21:10:01 | 显示全部楼层
不好意思楼主,是我弄错了。我很长时间没学过汇编了。
我弄成带进位不带进位了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表