Pwn*_*Pwn 28 x86 assembly flags
已知CF表示无符号执行,OF表示有符号溢出.那么汇编程序如何区分无符号和有符号数据,因为它只是一个位序列?(通过额外的存储器存储类型信息,或通过位置信息或其他?)这两个标志可以互换使用吗?
Nor*_*sey 38
区别在于使用什么指令来操纵数据,而不是数据本身.现代计算机(自1970年左右开始)使用称为二进制补码的整数数据表示,其中加法和减法在有符号和无符号数上完全相同.
表示的差异是对最高有效位(也称为符号位)的解释.对于无符号数,当数字位于完全正范围的上半部分时,设置最高有效位.对于带符号的数字,当数字在整个范围的下半部分和负半部分时,设置最高有效位.
不同的指令可以使用相同位的不同解释.例如,大多数大型机器都有签名和无符号乘法指令.具有'set less than'指令的机器可以具有有符号和无符号的风格.
OF(溢出标志)告诉进位是否翻转了结果中最高有效位的符号,使其与参数的最高有效位不同.如果数字被解释为无符号,则溢出标志是无关紧要的,但如果它们被解释为有符号,OF意味着,例如,添加了两个大的正数,结果为负数.
CF(进位标志)指示是否完全执行了一个位(例如,进入位33或位65).如果数字被解释为无符号,则进位标志表示加法溢出,结果太大而无法放入机器字中.溢出标志是无关紧要的.
您的问题的答案是汇编代码有几种区分有符号数据和无符号数据的方法:
处理有符号和无符号数据有不同的操作码.如果一个程序要比较两个符号整数,它使用的操作码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指令.