还剩1页未读,继续阅读
文本内容:
为了方便理解,CPU可以简单认为是
1.一堆的寄存器,用于暂时存放数据
2.可以执行机器指令,完成运算/数据读写等操作寄存器CPU有很多的寄存器,这里我们只介绍指令寄存器和通用寄存器指令寄存器64位下,指令寄存器叫片?32位下叫力指令寄存器用于存放下一条指令的地址,CPU的工作模式,就是从叩指向的内存地址取一条指令,然后执行这条指令,同时呻指向下一条指令,如此循环,就是CPU的基本工作也就意味着,通常模式下CPU是按照顺序执行指令的但是,CPU也有一些特殊的指令,用于直接修改叩的地址比如打岬OX他M指令,就是把小改为oxffoo,让CPU接下来执行内存中oxffoo这个位置的指令通用寄存器以x86_64来说,有16个“通用〃寄存器“通用”意味着可以放任意的数据,这16个寄存器并没有什么区别,但是实际上还是存在一些约定俗称的用法先看看这8个这是原来32位架构下就有的,只是32位下是e开头的MX〃累加器〃0川妙很多加法乘法指令的缺省寄存器,函数返回值一般也放在这里心X〃基地址〃base寄存器,在内存寻址时存放基地址%X计数器“〃八加是重复REP前缀指令和LOOP指令的内定计数器〃x用来放整数除法产生的余数,或者读写//端口时,用来存放端口号栈顶指针,指向栈的顶部他p栈底指针,指向栈的底部,通常用、力小+偏移量、的形式来定位函数存放在栈中的局部变量字符串操作时,用于存放数据源的地址匕力字符串操作时,用于存放目的地址的,和di经常搭配一起使用,执行字符串的复制等操作另外还有8个,是64位架构下新增的:r8,匕[,rll,匕[2,r13r14,rlS机器指令在CPU的世界里,只有01这种二进制的表示,所以指令也是用01二进制表示的然而,二进制对人类并不友好,所以有了汇编这种助记符算术运算比如这段加法add比如这个汇编指令,表示MX二小x+〃x,这就完成了一个加法的运算通常我们用匕X寄存器来做加法运算,但是其他寄存器一样也可以完成加法运算的,比如:这个表示rbx=rfex+Oxi o这里的加法运算,都是在寄存器上完成的,也就是直接修改的寄存器的值跳转指令比如这段无条件跳转指令CPU默认是按照顺序执行指令的,跳转指令则是,让CPU不再顺序执行后续的指令,转而执行这个内存地址中的指令具体来说,将指令寄存器中的值改为乂2封也〃即可,即呻二乂26qcoo工c内存读写指令比如这一对旨令:MOM匕取[KCXJMOM[rex],rbp这里假设%X的值,是一个内存地址,比如oxff第一行3%指令,是将内存地址小的中的值,读取到心P寄存器第二行MOV指令,则是反过来,将他F寄存器的值,写入到内存隋中栈操作push和pop这一对用于操作栈“栈”是内存空间中的一段地址,我们约定是以栈的形式来使用它,并且用仁寄存器指向栈顶栈操作本质也是内存读写操作,只是以栈的方式来使用比如这一对push rbppoprbp第一行是将/步寄存器中的值压入栈,等效于sub丫卯)8//匕平=irsp-8;栈顶向下生长8bytei^ov卜涧/bp//rbp的值写入新的栈顶第二行则是反过来,栈顶弹出一个值,写入到%P寄存器中,等效于MOM忆取卜洌//栈顶的值写入rbpadd丫卯,8//丫卯=/卯+8;栈顶向上缩小8byte注意因为栈在内存空间中是倒过来的,所以是向下生长的asm。