x86汇编的几种寄存器

菜鸟一枚,刚学汇编总结下

八个通用寄存器(没有段寄存器)
EAX,EBX,ECX,EDX,EBP,ESP,EDI,ESI

ESP 指向栈顶 PUSH一个值进栈,是存放在ESP上面那个地方,push后ESP值减少,再次指向栈顶。POP是将ESP指向的值 POP出去,POP后ESP的值增加,再次指向栈顶。
例如

      AAAAAAAA   ←ESP
      则PUSH eax后,变为
      (eax)      ←ESP
      AAAAAAAA。

EBP 指向栈底 即栈的最下面那个元素。

EDI 是目的变址寄存器(默认在 ES里),ESI 是源串变址寄存器(默认在DS里),因为ESI是原串变址寄存器,是原先存在的,所以在DS中。
ES存放当前程序中一个辅助数据段的段地址

EFLAGS,缩写是EFL(标志寄存器)32位,可以细分。
mov 指令不会改变标志寄存器的值。

EFL 的 0位是CF(carry flag,carry有进位的意思)
用于 无符号数的向最高位进位(或者借位)。
运算过程中最高位进位(或者借位)标志,如果进位是 1,没有就是0。是最高位进位,不同宽度的最高位不同。例如 ax 最高位是16位,al最高位是8位, mov al,0xFF
add al,0x1。 运行后最高位进位,则CF 变为1.

EFL 的 2 位是 PF (parity flag,parity有奇偶性的意思)
反应运算结果(转化为二进制后)中低八位数中 “1的个数的(转化为二进制后)”奇偶性,如果运算的结果中有 偶数个 1,则 PF 的值为1,如果 结果有 奇数个1,则PF的值为0;

AF
辅助进位标志。运算结果,如果数据是8位,第4位进位了 AF变为1,没进位就是0,如果数据宽度是16位,第8位进位了 AF就变为1.

SF (sign flag)
运算结果转化为二进制后,最高位的标志,如果最高位是1,SF就是1,如果是0,SF 就是0;

ZF(zero flag)
运算结果如果是0,则ZF变为1,如果不是0,则ZF为0;

OF(overflow flag)
用于有符号数的溢出。
运算结果如果溢出,则OF 变为1,没有则是0.
正数加正数结果为 负,则溢出了,负数加负数结果为正,则溢出了
看OF 和CF 标志的关键是,你所认定的数据存储形式(计算机并不知道他存储的是那种形式,有符号无符号都是编程的人所定的),如果你认为
数据形式的有符号的就看OF。是无符号数就看CF。

DF (direction flag)
用于指向方向, 控制 esi 和edi 的增加和减少,如果DF值为0,则为增加,DF为1则为减少。(根据传送数据的字节数减少或者增加)
配合 CLD (clear DF) ,将DF为清零。

猜你喜欢

转载自blog.csdn.net/qq_43394612/article/details/84174912
今日推荐