欢迎光临
箫启灵个人站点

[汇编基础] GCC指令初步认识

GCC是什么?

可以理解为汇编里面的各种条件判断,各种符号运算的语法。

要想学会GCC首先要了解EFL寄存器

1、CF (bit 0) [Carry flag] 这个就是无符号数进行判断计算的时候,如果内存溢出,则变成1

       若算术操作产生的结果在最高有效位(most-significant bit)发生进位或借位则将其置1,反之清零。

       这个标志通常用来指示无符号整型运算的溢出状态。

2、PF(bit 2) [Parity flag] 最低有效字节为1字节,bit/8位

        如果结果的最低有效字节(least-significant byte)包含偶数个1位则该位置1,否则清零。

        利用PF可进行奇偶校验检查:

        需要传输"11001110",数据中含5个"1",所以其奇校验位为"0",同时把"110011100"传输给接收方,接收方收到数据后再一次计算奇偶性,"110011100"中仍然含有5个"1",所以接收方计算出的奇校验位还是"0",与发送方一致,表示在此次传输过程中未发生错误

3、AF(bit 4) 只有下标为3的那个字符(8bit)位置如果进位,或者借位,则1,否则0

        如果算术操作在结果的第3位发生进位或借位则将该标志置1,否则清零。

        这个标志在BCD(binary-code decimal)算术运算中被使用。

4、ZF(bit 6) [Zero flag] 这个是用的最多的一个寄存器

        若结果为0则将其置1,反之清零。

        经常与CMP或者TEST等指令一起使用:

例1:判断2个值是否相等

MOV EAX,100

MOV ECX,100

CMP EAX,ECX

(CMP 指令相当于SUB指令,但是相减的结果并不保存到第一个操作数中) 如果相等的话,就是0,如果结果是0,ZF位自然就变成1

例2:判断某个值是否为0

TEST EAX,EAX

(TEST指令相当于AND指令,但是与的结果并不保存到第一个操作数中) 如果EAX=0,这个eax&eax 才会等于0,于是ZF自然也变成1了

5、SF(bit 7) [Sign flag]  一般用于检查有符号数是正数还是负数

        该标志被设置为有符号整型的最高有效位。

        (0指示结果为正,反之则为负)

6、OF(bit 11) [Overflow flag] 有符号数计算的过程中,如果溢出,则为1

        溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

        可以这样理解:

  如果是无符号数运算,是否溢出看CF位。

如果是有符号数运算,是否溢出看OF位。

两个符号位不同的数相加,of一定是0,不会溢出

两个正数相加,最高位为0,所以OF位看次高位,如果次高位进位,则溢出 of=1

两个负数相加

7、DF(bit 10) [Direction Flag]

        这个方向标志控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。设置DF标志使得串指令自动递减(从高地址向低地址方向处理字符串),清除该标志则使得串指令自动递增。

        STD以及CLD指令分别用于设置以及清除DF标志。 

8、TF,暂时用不到 Trace flag 置1CPU进入单步模式

GCC指令介绍(表)

QQ截图20180425165230.png

常见,常用语法(记一下最好):

JE, JZ          结果为零则跳转(相等时跳转)

JNE, JNZ    结果不为零则跳转(不相等时跳转)

JS               结果为负则跳转

JNS            结果为非负则跳转

JL, JNGE    小于则跳转 (有符号数)

JNL, JGE    大于等于则跳转 (有符号数)

JG,JNLE   大于则跳转(有符号数)

JNG,JLE  小于等于则跳转 (有符号数)

例1,两个值做比较

MOV EAX,100

MOV ECX,100

CMP EAX,ECX

(CMP 指令相当于SUB指令,但是相减的结果并不保存到第一个操作数中)

例2:判断某个值是否为0

TEST EAX,EAX

(TEST指令相当于AND指令,但是与的结果并不保存到第一个操作数中)


MUL: 无符号乘 IMUL: 有符号乘

DIV:无符号除 IDIV:有符号除

分享到:更多 ()

刺蝴蝶De箫启灵

作死购站点VIP视频站站点