CF:进位标志寄存器。最近的操作是最高位产生了进位。它可以记录无符号操作的溢出,当溢出时会被设为1。
ZF:零标志寄存器,最近的操作得出的结果为0。当计算结果为0时将会被设为1。
SF:符号标志寄存器,最近的操作得到的结果为负数。当计算结果为负数时会被设为1。
OF:溢出标志寄存器,最近的操作导致一个补码溢出(正溢出或负溢出)。当计算结果导致了补码溢出时,会被设为1。
除了上面的算数逻辑运算可以设置条件码,还有两类指令会设置条件码,并且不更新目的寄存器,它们分别是CMP和TEST。CMP和SUB指令相似,TEST和AND指令相似。
CMP 指令,指令形式 CMP S2,S1。然后会根据 S1-S2 的差来设置条件码。除了只设置条件码而不更新目标寄存器外,CMP 指令和 SUB 指令的行为是一样的。比如两个操作数相等,那么之差为0,那么就会将零标志设置为 1;其他的标志也可以用来确定两个数的大小关系。
TEST 指令,和 AND 指令一样,除了TEST指令只设置条件码而不改变目的寄存器的值。
访问条件码
对于普通寄存器来讲,使用的时候一般是直接读取它的值,而对于条件码,通常不会直接读取。常用的有如下三种方法:
可以根据条件码寄存器的某个组合,将一个字节设置为0或1。
可以直接条件跳转到程序的某个其它的部分。
可以有条件的传送数据。
跳转指令
正常情况下,指令会按照他们出现的顺序一条一条地执行。而跳转指令(jump)会导致执行切换到程序中一个全新的位置,我们可以理解为方法或者函数的调用。在汇编代码中,这些跳转的目的地通常用一个标号(label)指明。
movl $0,%eax
jmpl .L1
movl (%eax),%edx
.L1:
popl %edx
指令 jmpl .L1 会导致程序跳过 movl 指令,从 popl 开始执行。在产生目标代码文件时,汇编器会确定所有带标号指令的地址,并将跳转目标(目的指令的地址)编码为跳转指令的一部分。
jump 指令有三种跳转方式:
直接跳转:跳转目标是作为指令的一部分编码的,比如上面的直接给一个标号作为跳转目标。
间接跳转:跳转目标是从寄存器或者存储器位置中读出的,比如 jmp %eax 表示用寄存器 %eax 中的值作为跳转目标;再比如 jmp (%eax) 以 %eax 中的值作为读地址,从存储器中读取跳转目标。
其他条件跳转:根据条件码的某个组合,或者跳转,或者继续执行代码序列中的下一条指令。
循环
C 语言提供了多种循环结构,比如 do-while、while和for。汇编中没有相应的指令存在,我们可以用条件测试和跳转指令组合起来实现循环的效果。而大多数汇编器会根据一个循环的do-while 循环形式来产生循环代码,即其他的循环一般也会先转换成 do-while 形式,然后在编译成机器代码。
比如
set指令的各种后缀的意思都是什么?
解答
e->ZF(相等):equals的意思,这里代表的组合是ZF,因为ZF在结果为0时设为1。因此ZF代表的意义是相等。
e->~ZF(不相等):not equals 的意思,这里代表的组合是~ZF,也就是ZF做“非运算”,则很明显是不相等的意思。被调用过程
s->SF(负数):这里代表的组合是SF,因为SF在计算结果为负数时设为1,此时可以认为b为0,即a<0。因此这里是负数的意思。
s->~SF(非负数):与s相反,加上n则是not的意思,因此这里代表非负数。
l->SF^OF(有符号的小于):l代表的是less。这里的组合是SF^OF,即对SF和OF做“异或运算”。“异或运算”的意思则是代表,SF和OF不能相等。那么有两种情况,当OF为0时,则代表没有溢出,此时SF必须为1,SF为1则代表结果为负。即a-b<0,也就是a<b,也就是小于的意思。当OF为1时,则代表产生了溢出,而此时SF必须为0,也就是说结果最后为正数,那么此时则是负溢出,也可以得到a-b<0,即a<b。综合前面两种情况,SF^OF则代表小于的意思。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-54154-4.html
美国要想占领时间长点
如果他们胆敢撞击或者攻击我们的渔船
再于是
你觉得物价会降低吗