关于装配CF(Carry)和OF(溢出)标志

Pwn*_*Pwn 28 x86 assembly flags

已知CF表示无符号执行,OF表示有符号溢出.那么汇编程序如何区分无符号和有符号数据,因为它只是一个位序列?(通过额外的存储器存储类型信息,或通过位置信息或其他?)这两个标志可以互换使用吗?

Nor*_*sey 38

区别在于使用什么指令来操纵数据,而不是数据本身.现代计算机(自1970年左右开始)使用称为二进制补码的整数数据表示,其中加法和减法在有符号和无符号数上完全相同.

  • 表示的差异是对最高有效位(也称为符号位)的解释.对于无符号数,当数字位于完全正范围的上半部分时,设置最高有效位.对于带符号的数字,当数字在整个范围的下半部分和负半部分时,设置最高有效位.

  • 不同的指令可以使用相同位的不同解释.例如,大多数大型机器都有签名和无符号乘法指令.具有'set less than'指令的机器可以具有有符号和无符号的风格.

  • OF(溢出标志)告诉进位是否翻转了结果中最高有效位的符号,使其与参数的最高有效位不同.如果数字被解释为无符号,则溢出标志是无关紧要的,但如果它们被解释为有符号,OF意味着,例如,添加了两个大的正数,结果为负数.

  • CF(进位标志)指示是否完全执行了一个位(例如,进入位33或位65).如果数字被解释为无符号,则进位标志表示加法溢出,结果太大而无法放入机器字中.溢出标志是无关紧要的.

您的问题的答案是汇编代码有几种区分有符号数据和无符号数据的方法:

  • 它可以选择CF或OF进行有符号或无符号比较.
  • 它可以选择有符号或无符号乘法和除法指令.
  • 它可以选择有符号或无符号右移(有符号复制高位;无符号移位为零).

  • 对于带符号的数字,最重要的位并不意味着"大负",只是"负". (8认同)
  • 有关这方面的类似但更详细的解释,有几个4位示例,请参阅**[了解进位与溢出条件/标志](http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt )**.另请参阅[x86标记wiki]中的其他链接(http://stackoverflow.com/tags/x86/info). (2认同)

Cra*_*rks 18

不要尝试操作符号.那是不可能的.相反,只是试图实现真相:没有迹象.然后你会发现它不是区分的标志类型,它只是你自己.


jmu*_*llo 5

事实并非如此。只要条件发生,标志就会被设置。程序员应该知道他正在使用什么类型的整数,并从中知道如果他关心的话要检查哪个标志。


Ada*_*eld 5

处理有符号和无符号数据有不同的操作码.如果一个程序要比较两个符号整数,它使用的操作码jl,jle,jg,和jge,其中L和G立场 ESS和分别reater.如果一个程序要比较两个无符号整数,它使用的操作码jb,jbe,ja,和jae,A和B的立场,其中一个波夫和b分别elow.在所有情况下,e代表"或等于".这些操作码用于基于比较的分支.

类似地,还有setCC指令,根据比较将字节设置为0或1.这些功能相同-有setl,setle,setg,setge,setb,setbe,seta,setae,和其他人.

带符号的操作码测试标志ZF,OF和SF.无符号操作码测试标志ZF,CF和SF.有关JCC指令的详细信息,请参见80386程序员参考手册部分,以及有关所测试条件的setCC指令.