当前位置: 首页 > Linux

机器的程序级表示-条件码

时间:2023-04-07 00:38:07 Linux

条件码定义:条件码是CPU根据硬件的运算结果设置的一个位,反映当前指令执行结果的各种状态信息。例如算术运算的正数、负数、零或溢出结果。可以理解为处理器中的一个特殊标志从程序员的角度来看,处理器:由所有可见的处理器和标志组成的大量寄存器来表示程序中使用的局部变量。rsp寄存器:当前程序运行时的栈顶地址rip寄存器(程序计数器):当前执行指令的下一条指令的地址标志位:表示当前处理器运行的状态。它存储在称为标志寄存器的寄存器中。标志寄存器不能用汇编语言指令直接访问,但可以用四个条件码间接修改和访问CF:进位标志位,用于无符号数。如果发生进位或借位,CF将被设置为1(无符号数进位或借位表示无符号位溢出)SF:符号标志位,用于有符号数。当前指令运算结果的符号。非负数设置为0,负数设置为1ZF:0标志。当运算结果为0时,会置1OF:溢出标志,对于有符号数。有符号数运算可能会导致溢出而不是进位。如果发生溢出,则该位设置为1。对于溢出和进位:无符号数的溢出称为进位,有符号数称为溢出。隐式设置该位有两种方式:每当执行算术或逻辑运算指令时,都可能导致标志位发生变化。当处理器执行汇编指令时,寄存器和内存无法判断执行的指令是有符号数还是无符号数。因此,设置flag时,结果被认为是有符号数和无符号数,分别判断对应的flag。地址计算指令是唯一不影响条件代码的指令。该指令专门用于在不修改操作数的情况下修改条件码的值。cmp指令比较两个操作数(计算目标操作数与原操作数的差值,进而影响相应的条件码,但不修改参与运算的操作数。)与减法运算不同的是:cmp指令影响相应的条件码,但不修改运算涉及的操作数;减法指令会将差值放入目标操作数中影响SF和ZF。规则:如果差为负数,则将SF置1,表示目标操作数小于原操作数;如果差值非负,则将SF设为0,再查看ZF;如果差为0,则设置ZF为1,表示两者相等;如果差为正数,则ZF置0,表示目标操作数大于原操作数文本。按位与与与类似,但是and将结果放在目标操作数中;text指令影响相应的条件码,但不修改参与运算的操作数,只影响ZF.SF两个操作码,可用于检查操作数中的某位是否为0。比较数据与掩码(11...1)访问条件码条件码不能直接修改,只能通过算术或逻辑运算指令间接或隐式修改。同样,访问条件码也不能直接访问,需要通过一组集合指令间接访问。访问条件码用一个八位寄存器表示,即八位寄存器的最低位置置0或1,其余位全部为0别名,组指令是对低八位寄存器通过实例了解条件码的存取关注公众号,让我们携手并进