引言
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
今天我们来聊聊汇编,谈到汇编可能会闻风色变,这也太硬核了吧,而且汇编语言都离我们很遥远了,学汇编干嘛呢?其实,我只是因为兴趣,我用的语言是java,java语言的Java虚拟机是用c语言编写的,而要想懂c,你得懂汇编,就是说这是成为优秀的程序员的必经之路,没有捷径,话不多说,我们一起聊聊汇编吧,别紧张,我会用诙谐幽默的语言带你读懂汇编的硬件基础寄存器。
x86通用寄存器
我们先来了解下寄存器,寄存器的概念不用管,重点我给你划出来了,就是存储二进制码的,行,知道这个我们就能往下走了。
我们知道二进制码是0和1组成的,那我们知道0和1意义不大,我们得知道存什么用二进制表示的,其实无外乎就是存指令或者数据,好,那我们来了解下X86的通用寄存器:eax、ebx、ecx、edx、edi、esi,别怕,按照我们前面的基础,来详细说明下:
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特殊寄存器
除了通用寄存器外呢,还有特殊寄存器,大概就是ebp、esp、eip、eflags这些,其中,eip是程序计数器,eflags保存着计算过程中产生的标志位。