- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Assembly 整形表示法
Assembly 整形表⽰法
整形有两种类型:有符号和⽆符号。⽆符号整形(即此类型没有负数) 以⼀种⾮常直接的
⼆进制⽅式来表 。数字200作为⼀个⽆符号整形数将被表 为1100 1000(或⼗六进制
C8) 。
有符号整形 (即此类型可能为正数也可能为负数)以⼀种更复杂的⽅式来表 。例
如,考虑¡56 。+56当作⼀个字节来考虑时将被表 为00 111000 。在纸上,你可以将¡56
表 为¡111000 ,但是在电脑内存中如何以⼀个字节来表 ,如何储存这个负号呢?
有三种普遍的技术被⽤来在电脑内存中表 有符号整形。所有的⽅法都把整形的最⼤
有效位当作⼀个符号位来使⽤。如果数为正数,则这⼀位为0 ;为负数,这⼀位就为
1。
原码
第⼀种⽅法是最简单的,它被称为原码。它⽤两部分来表 ⼀个整形。第⼀部分是符
号位,第⼆部分是整形的原码。所以56表 成字节形式为00 111000 (符号位加了下划
线)⽽¡56将表 为10 111000 。
最⼤的⼀个字节的值将是0 1111111或+ 127 ,⽽最⼩的⼀个字节的值将
¡127 。要得到⼀个数的相反数,只需要将符号位变反。这个⽅法很简单直接,但是它
有它的缺点。⾸先,0会有两个可能的值:+0 和¡0 。因为0不是
正数,也不是负数,所以这些表 法都应该把它表 成⼀样。这样会把CPU 的运算逻
辑弄得很复杂。第⼆,普通的运算同样是⿇烦的。如果10加¡56 ,这个将改变为10减去
56 。同样,这将会复杂化CPU 的逻辑。
反码
第⼆种⽅法称为反码表 法。⼀个数的反码可以通过将这个数的每⼀位求反得到。(另
外⼀个得到的⽅法是:新的位值等于1¡⽼的位值。) 例如:00 111000 (+56)的反码是
11000 111。在反码表 法中,计算⼀个数的反码等价于求反。因此,¡56就可以表 为
11000 111。注意,符号位在反码中
是⾃动改变的,你需要两次求反码来得到原始的数值。就像第⼀种⽅法⼀样,
0有两种表 : (+0)(¡0) 。
⽤反码表 的数值的运算同样是⿇烦的。这有⼀个⼩诀窍来得到⼀个⼗六进制数值的
反码,⽽不需要将它转换成⼆进制。这个诀窍就是⽤F (或⼗进制中的15 )减去每⼀
个⼗六进制位。这个⽅法假定数中的每⼀位的数值是由4位⼆进制组成的。这有⼀个
例⼦:+56 ⽤⼗六进制表 为38。要得到反码,⽤F减去每⼀位,得到C7 。这个结果
是与上⾯的结果吻合的。
补码
前⾯描述的两个⽅法⽤在早期的电脑中。现代的电脑使⽤第三种⽅法称为补码表
法。⼀个数的补码可以由下⾯两步得到:
1. 找到该数的反码
2. 将第⼀步的结果加1
这有⼀个使⽤00 111000 (56)的例⼦。⾸先,经计算得到反码:11000 111 。
然后加1 :
在补码表 法中,计算⼀个补码等价于对⼀个数求反。因此,1100 1000是¡56的补码。
要得到原始数值需两次求反。令⼈惊讶的是补码不符合这个规定。通过对1100 1000 的
反码加1得到补码。
当在两个补码操作数间进⾏加法操作时,最左边的位相加可能会产⽣⼀个进位。这个
进位是不被使⽤的。记住在电脑中的所有数据都是有固定⼤⼩的(根据位数多少) 。两
个字节相加通常得到⼀个字节的结果(就像两个字相加得到⼀个字,等。) 这个特性对
于补码表 法来说是⾮常重要的。例如,把0作为⼀个字节来考虑它的补码形式
。计算它的补码形式得到总数:
其中c代表⼀个进位。(稍后将展 如何侦查到这个进位,但是它在这的结果中不储
存。) 因此,在补码表 法中0只有⼀种表 。这就使得补码的运算⽐前⾯的⽅法简
单。
使⽤补码表 法,⼀个有符号的字节可以⽤来代表从¡128 到+ 127的数值。表2.1 展
⼀些可选的值。如果使⽤了16位,那么可以表 从¡32; 768到+32; 767的有符号数值。
+32; 767可以表 为7FFF ,¡32; 768 为8000 , -128为FF80⽽-1为FFFF 。32位的补码⼤约
可以表 ¡20亿到+20亿的数值范围。
CPU对某⼀的字节(或字,双字)具体表 多少并不是很清楚。汇编语⾔并没有类型的
概念,⽽⾼级语⾔有。数据解释成什么取决于使⽤在这个数据上的指令。到底⼗六进
制数FF被看成⼀个有符号数¡1 还是⽆符号数+255取决于程序员。C语⾔定义了有符号
和⽆符号整形。这就使C编译器能决定使⽤
文档评论(0)