【程序员必备小知识-汇编知识23】x86的通用寄存器

307 阅读2分钟

引言

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

今天我们来聊聊汇编,谈到汇编可能会闻风色变,这也太硬核了吧,而且汇编语言都离我们很遥远了,学汇编干嘛呢?其实,我只是因为兴趣,我用的语言是java,java语言的Java虚拟机是用c语言编写的,而要想懂c,你得懂汇编,就是说这是成为优秀的程序员的必经之路,没有捷径,话不多说,我们一起聊聊汇编吧,别紧张,我会用诙谐幽默的语言带你读懂汇编的硬件基础寄存器。

x86通用寄存器

我们先来了解下寄存器,寄存器的概念不用管,重点我给你划出来了,就是存储二进制码的,行,知道这个我们就能往下走了。 image.png

我们知道二进制码是0和1组成的,那我们知道0和1意义不大,我们得知道存什么用二进制表示的,其实无外乎就是存指令或者数据,好,那我们来了解下X86的通用寄存器eaxebxecxedxediesi,别怕,按照我们前面的基础,来详细说明下:

  • eax:是"累加器"(accumulator), 它是搞加法和乘法指令的。
  • ebx:是"基地址"(base)寄存器, 它是搞基地址的,用于内存寻址
  • ecx:是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
  • edx:是存储整数除法产生的余数的。
  • esi/edi:分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串

好了,就简单了解一下,然后通用寄存器一般都是通用的,比如同样的movl指令,可以传送到eax中,也可传送到ebx中,当然也有不通用的时候,例如除法指令idivl要求被除数在eax寄存器中,edx寄存器必须是0,而除数可以在任意寄存器中,计算结果的商数保存在eax寄存器中(覆盖原来的被除数),余数保存在edx寄存器中。

x86特殊寄存器

除了通用寄存器外呢,还有特殊寄存器,大概就是ebpespeipeflags这些,其中,eip是程序计数器,eflags保存着计算过程中产生的标志位。