找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 324|回复: 7

B.1 算术标志位(图)

[复制链接]
发表于 2009-4-12 09:13:34 | 显示全部楼层 |阅读模式 IP:江苏扬州
附录B 理解编译后的算术运算


本附录讲解了在汇编语言中实现算术运算的一些基本知识,并展示一些基本的算术指令序列以及逆向过程中它们会以什么样的形式出现。控制流、数据管理一样,算术运算也是程序必不可少的组成部分。在逆向工程中,某些算术运算指令序列是很容易解读的,但是在其他一些情况下,算术运算指令序列经过了编译器优化处理后,读起来难度就会大一些。


本附录先介绍了基本的IA-32算术标志位,然后又展示了IA-32编译器生成的IA-32汇编语言代码中各种常见的算术运算序列。


B.1 算术标志位


为了详细理解汇编语言中是如何实现算术和逻辑运算的,你必须全面地理解各个标志位以及它们的使用方法。几乎指令集中所有的算术指令都要用到标志位,因此,要真正理解汇编语言中算术指令序列的含义,你必须理解每一个标志位的含义以及算术指令是怎样使用它们的。


IA-32处理器中的标志位都被集中存放在EFLAGS存储器中,它是一个由处理器管理的32位寄存器,程序代码很少会直接访问它。EFLAGS存储器中的大多数标志位是系统标志位,系统标志位的状态确定了处理器的当前状态。除了这些系统标志位外,还有8个状态标志位,这8个标志位代表了处理器的当前状态,状态标志位的取值与最近一次执行的算术运算的结果有关。接下来几小节中我们将介绍IA-32处理器中最重要的状态标志位。


B.1.1 溢出标志位(CF与OF)


进位标志位(CF,carry flag)和溢出标志位(OF,overflow flag)对于汇编语言中的算术指令和逻辑指令是非常重要的两个标志位。它们的功能以及它们之间的区别并不十分明显,因此我们这里简单地介绍一下。


CF和OF都是溢出指示符,这就是说它们两都可以用于通知程序算术运算的结果太大了以至于无法把它全部表示在目标操作数(destination operand)中。这两个标志位的区别与程序所处理的数据类型有关。


与大多数高级语言不同,汇编语言程序不会显式地指明当前所处理数据的类型细节。一些算术指令如ADD指令(加法)和SUB指令(减法)也不去管它们处理的操作数到底是有符号数还是无符号数,因为这对它们来说不重要—运算的二进制结果是一样的。而其他一些指令,如MUL指令(乘法)和DIV指令(除法)就有无符号数版本和有符号数版本两种——因为不同的数据类型对于乘法和除法来说会产生不同的二进制输出。



有符号数表示和无符号数表示总是与一个问题有关,这个问题就是溢出。因为有符号整数要比同样长度的无符号整数少一位(因为这个特殊的位被用来存放符号),所以有符号数和无符号数的溢出触发条件是不一样的。这就是我们需要CF和OF两个溢出标志位的原因。处理器并没有为算术指令提供独立的有符号和无符号两个版本,而是简单地通过用两个溢出标志位报告溢出就把问题合理地解决了:这两个标志位一个用于有符号操作数,一个用于无符号操作数。加法或者减法运算可以用同一个版本的指令对有符号操作数和无符号操作数进行运算,并对两个标志位进行置位——置位后的标志位留待接下来的指令处理。


举个例子,考虑下面的算术运算代码,看看它会对这两个溢出标志位产生什么样的影响:
498)this.style.width=498;" border=0>


上面的加法指令可能会产生不同的结果,具体的结果取决于是把目的操作数当作有符号数还是无符号数对待。如果用十六进制数表示的话,结果是0x8326,即十进制数的33574——假定AX被当作一个无符号操作数。如果你把AX当作一个有符号操作数,你就会看到发生了溢出,因为任何最高位为1的有符号数是负数,所以0x8326就成了-31962了。显然,因为一个16位的有符号数能表示的最大的数是32767,把4390与29184相加显然会产生溢出,于是AX中的数就变成了一个负数。因此,上面的代码对无符号数来说没有溢出,但如果你把目的操作数看作是有符号数就溢出了。所以,前面这段代码会导致OF(表示在有符号操作数中溢出)置1,而CF(表示在无符号操作数中溢出)被清零。


零标志位(ZF)


当算术运算的结果为0时,零标志位ZF将被置1;如果结果不为0,ZF则被清零。在IA-32汇编语言代码中,在好多种情况下会使用ZF标志位,但可能最常见情况就是比较两个操作数并测试它们是否相等。比如用CMP指令将一个操作数减去另一个操作数,如果减法运算的伪结果(pseudoresult,表示此结果并不写入目的操作数中)为0就将ZF标志位置1,表明两个操作数相等。如果两个操作数不相等,ZF被清零。


符号标志位(SF)


符号标志位记录结果的最高位(不管结果是有符号数还是无符号数)。对于有符号整数,SF相当于整数的符号。符号标志位SF为1表明结果是负数,为0表示结果是正数(或者是0)。


奇偶标志位(PF)


奇偶标志位(极少使用)记录算术运算结果低8位的二进制奇偶校验(binary parity)。二进制奇偶校验就是指数中置为1的位数(number of bits set)是奇数还是偶数,它与数的奇偶性(numeric parity)完全是两回事儿。PF为1表明运算结果的低8位中1的个数是偶数,而PF为零则表明结果的低8位中1的个数是奇数。
发表于 2009-12-26 02:05:04 | 显示全部楼层 IP:吉林吉林
路过....
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 11:40 , Processed in 0.232198 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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