zf标志 如果运算结果为0显示ZR 否则显示NZ
pf标志 如果运算结果的所有bit位中1的个数位偶数pf=1,也就是PE,反之为0 也就是显示P0,偶数个就是EVEN,奇数个就是ODD。所以E O
sf标志,相关指令执行后,其结果是否为负,如果是负sf=1,显示NG(negative)否则非负是sf=0,显示PL(positive).
对于计算机来说,A=同一个二进制数据可以看作无符号数也可以看作有符号数,sf记录数据的正负,在我们把它当作有符号数计算的时候,可以由它得知结果的正负,如果我们将数据当作无符号数计算,那么sf没有意义。可以把add指令进行的运算看作有符号或者无符号运算,无论如何它包含了2层含义,就是说我们用同一种信息表示了2种结果。
129+1=130 10000010B 如果是-127+1=-126 也是10000010B,翻译成原码就表示十进制-126
mov不会导致符号位的变化只有,加减乘除或者其他这些会变化t
cf标志 如果运算的时候发生了(加法)进位或者(减法)借位,那么cf会变为1,显示CY(carry flag)
,如果没有显示 NC(not carry)
计算机里有符号数都是要转化位补码的,正数的补码就是本身二进制。
这里讲的溢出是对于有符号数的,无符号数看进位
of标志,如果运算的时候发生了溢出,那么显示OV(overflow),否则显示NV(not overflow),比如Al寄存器是0088,其二进制就是1000 1000,首位是1,如果看作无符号就直接转化十进制,如果看作有符号因为首位是1那么就是负数而负数的补码是那一套转化,如果首位是0那么即使看作有符号数也无需转化因为正数的补码就是它二进制本身只有负数要转换,有符号则为-120,后面取反+1,如果+上1111 0000有符号为-16,结果是-136,但是8为有符号数范围是-128——127,16位有符号数范围是-32768——32767,作为有符号数,就是136+240,溢出了。再比如十进制下的98+99=197,在十六进制下就是C5,如果看作无符号答案是197小于255,没有进位,看作有符号数,对应的63和62十六进制,它们的二进制首位都是0,所以是正数,它们的补码就是本身二进制,所以运算后结果仍是197(十进制),大于127范围,所以溢出了
adc指令是带进位加法,会加上cf标志位。sbb是带借位减法,会减去cf标志位
cmp指令的话相当于减法不会保存结果,但是会引起标志位的变化,可以借此比较大小什么的。
loop循环的话,emmm就是循环次数看cx寄存器,也就是计数寄存器,当执行到loop的时候,先cx-1,然后判断是否为0,如果为0就结束退出,在内存里的话,保存的汇编指令其实只是循环内的指令,loop指令执行后,ip地址跳到开始的位置,然后开始循环。
当-q退出后,再次debug .exe 那么,还是重新开始执行。
如果不想每次都是按-t指令,那么就用debug 的-g 段地址+ip指令(如果没有段地址默认为当前的cs),就是直接执行到ip这个位置。类似于断点调试的感觉。
当进入循环后,使用debug 的-p指令,就会直接执行完当前的循环。可以先想一想c++怎么写。
注意格式,多练就好了
标签:汇编,符号,二进制,知识,补码,积极,指令,如果,sf From: https://www.cnblogs.com/NiShu7777/p/17781297.html