汇编学习笔记(一)

小菜无才,今天拿出自己的笔记献丑,大神莫喷

预备知识:11:22 2012-8-19


电瓶脉冲:
就是CPU的01脉冲  《编码的奥秘》--底层必学

汇编:
是直接面对硬件编程,效率是所有语言里最高的,汇编是机器指令(01代码)的助记符,汇编和人类语言接近,便于阅读和记忆(汇编语言是不区分大小写的)还有在CPU里面其实所有的运算都可以通过加法来实现的,

寄存器:
嵌入到CPU里面的存储器,现在一个CPU有多个寄存器,也就是嵌入到CPU里面的内存,我认为之所以要用到接近CPU的内存,是因为CPU主要的功能还是以运算为主,所以运算器的数目占多个,面对浩瀚的内存做运算,不记住点儿什么咋行?为了对易失性存储做的补偿,才嵌入了CPU,呵呵,寄存器还不是CPU的高级缓存,他比CPU的高级缓存,二级缓存还要低一些,就是说CPU的高级缓存是更接近CPU的临时缓存

第一章:汇编的组成:
       1.汇编指令(核心,机器码助记符)

       2.伪指令(由编译器执行)

       3.其他符号(由编译器识别)

    CPU连加减乘除都不会的(CPU有个累加运算单元,还有与,或,非三个逻辑运算器),汇编语言的核心是汇编指令,他决定了汇编语言的特点

存储器:
CPU是计算机的核心部件,他控制计算机的运作,并进行运算,要想一个CPU工作,就必须向他提供指令和数据,呵呵,转了一圈感觉到才转会来,要想存放这些指令和数据,就的有地方存噻,这里就用到的存储器,就是我们平时所说的内存,其实像显卡啊(GPU读取显存的数据类似),声卡啊,bios啊都有他的存储器哈,内存是仅次于CPU的部件,离开了CPU,再好的CPU也无法工作,磁盘呐,磁盘上的数据必须加载到内存,才可能被CPU的执行,另外,存在内存和磁盘是上的指令和数据没有任何区别,都是2进制信息
CPU对内存数据的读写:
大家都知道CPU和内存之间有三根BUS就是总线啦,他们分别是地址,控制,数据总线,其实CPU对内存的读写很简单啦,呵呵,看下面:

读:CPU的地址总线发出指令如1234H,然后CPU的控制总线发出控制信息,如读,接着CPU的数据总线将该地址的信息读入CPU

写:其实和写差不多,也是首先CPU的地址总线发出地址指令如1234H,然后CPU的控制总线发出控制信息,这里就是写,接着CPU的数据总线将CPU存放的数据写入该地址的内容,实际上是把原来的内容覆盖啦

Bios:
(Basic Input/Output System,在系统中有很多Bios,主板的Bios在开机的第一阶段就是对系统的是否可启动性做检测)

内存地址空间:

如果CPU的地址总线的宽度为10,则CPU对内存的可编码范围的0-1023,就是说CPU的寻址范围为1M

接口:

在电脑上,许多程序是无法直接运行的,需要借助安装在拓展槽上的卡接口才能进一步的的接收CPU的控制,在电脑里安静的运行,在逻辑上,所有的的内存都是在内存的一块映射,具备一个水平的逻辑逻辑结构,实际是每一个接口卡中都具有内存的,然后分别通过总线与主机内存建立映射关系,然后就是在主机内存的起始地址的一段位置专门为这些必须的设备做的专属的内存的空间,可能就是0---fffff的一段距离,呵呵,这里不同的CPU的汇编指令集是不同的,记得在电脑上的一些驱动就是CPU对接口卡硬件的使用的时候专门开发的一种程序,他是很多应用程序运行的基础

第二章:寄存器(CPU工作原理)

CPU概述:
一个CPU主要有运算器,逻辑控制器,寄存器这三部分组成,在CPU的内部其实也是一个小世界,内部的器件是通过内部总线来连接的,外部呐,就是CPU和显卡,主板,网卡的连接了,主要使用的是外部总线

寄存器概述:
8086CPU有14个寄存器,它的名称为AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW(这里的寄存器都是16位的PCU,在32位里是EAX....就是加上E)以X结尾的是通用寄存器,以S结尾的是段寄存器
8086CPU(就是现在常用的IntelCPU的一个架构)的所有的寄存器都是16位,可以存放两个字节,就是一个字,为了保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器,(连带产品的向下兼容)如AX 分为AH和AL,BX可以分为BH和BL...这里就是分为高位和低位啦,呵呵,如果是以前的CPU的那在高位直接填0就行了(路人甲不在),呵呵,就是说优先使用低8位的寄存器 mov al,66H 如果这样写就是说明把al看为一个单独的寄存器,只能识别低8位的数据,超出的就会丢弃(实际不是哈,呵呵)

物理地址:
CPU访问的内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间,就是将这个唯一的地址就叫做物理地址

对16位结构的CPU的描述:具有一下特点,1.运算器一次最多可以处理16位的数据;2.寄存器的最大位宽为16位,寄存器的和存储器之间的通路也是16位

段:
其实内存是一维的线性的地址,并没有被划分为段地址,因为8086CPU的先天性的不足,呵呵,他的物理地址的给出方式是:(段地址*16)+偏移地址 = 物理地址  的方式给出的,这样我们就可以根据分段的方式来管理内存,解释一下为什么会是这么恼火的使用这种约定呐?因为第一他的寄存器是很小的,只有16位即一个字的大小,要想一次性的存储这么长的物理地址还是做不到的,这是最初寄存器的限制,对于地址总线为20位的编辑器来说,CPU的一部分给出了16位的段地址,令一部分给出了16位的段地址,再经过地址加法器把两个地址累加为20位的物理地址这样通过管脚发出去就成行了,呵呵,20位宽的路线上走20个人很合理噻,不多不少

小问题:
给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为00010H到1000FH  计算方法为:0001H一看就是16位的地址,首先要*16嘛,再加上他本来就是16进制的数据,所以直接是左移一位就搞定,他的初始地址为 00010H+0000H  结束地0010H+FFFFH = 1000FH,呵呵,这里解释一下加FFFFH的原因,是默认的分配为16位为一段,2的16次方-1=FFFFH,就是说最大的的小数点加到这里就像是0.9中的9,再大的话就直接进1就行了,所以这里的范围就简单的表示为0的整数位已经定住,他表示的范围就是0.0-0.9一样的的道理

段寄存器:
段寄存器就是提供段地址的,显而易见哈,8086CPU只有4个段寄存器,CS,DS,SS,ES,这四个段寄存器的功能还是挺关键的哈,CS是(Code segment,代码段寄存器),DS(Data segment数据段寄存器),SS(Stack segment,堆栈段寄存器),ES( extra segment附加段寄存器),这些段寄存器之所以叫做段寄存器是因为他们分别分工,存放各自段的段地址,这样表示起来多么清晰明了啊,呵呵(一句话:CPU要执行的代码段的段地址在CS中获得,CPU要取的数据段地址在DS中获得,要操作的段地址在SS中获得)

CS和IP寄存器   CS:是代码段寄存器,IP:指令指针寄存器

简单的说一下8086CPU的指令执行过程:
(1)首先CS寄存器发出的段地址和IP指针寄存器发出的偏移地址分别是16位的哈,呵呵,记住,但是如果让这两条指令去分别执行的话,就根本不会有什么效果,况且他们在20位宽的CPU地址总线里穿梭,感觉就是浪费空间啊,呵呵,所以在这两条指令出来之后,还没有出CPU的时候,就会被一个叫做地址加法器的东西把他们的地址合并在一起,这里要注意啦,他们把两条指令合并在一起肯定就破坏的指令哈,但是为了过这独木桥还不得不这样,就理解为暂且变形一下吧,后面一定会按照相同的约定去分离这两个指令哈,或者直接是按照有规律的解析执行这条20位的信息哈,呵呵,好啦,到这里两条16位指令就像麻花一样被捆绑成20位指令,呵呵,这样堂堂正正的就从CPU的20位地址总线传输出去了,然后就是在内存里索引这个地址,呵呵,找到了之后,就把里面的数据通过数据总线乖乖的传回CPU,然后就进了指令缓冲器等待执行就OK了,(2)这时的IP寄存器就会自加执行的代码的条数,IP = IP + 执行的代码条数 (3)执行指令,呵呵然后就是不断的重复,重复(1) (2) (3)。。。CPU的指令就是这样一条一条的被获取执行的

8086CPU在工作过程中的简要描述:
(1)在8086CPU加电后要首先是将CS 寄存器的地址赋值为FFFFH,将IP寄存器的地址赋值为OOOOH,就是说在开机的一瞬间,CS段寄存器和IP指令寄存器被初始化,则在通过计算之后就知道第一条CPU要执行的指令的位置,再来一遍吧,怕不熟悉,呵呵,就是FFFFH<<1+0000H,加起来被定位的物理地址就是FFFF0H,也就是说这里的指令要被第一个放入CPU执行,呵呵(一个诡异的想法:要想自己制作的木马免杀的方法就一下子跳出来两个:1.把你的木马的地址放在杀毒软件之前加载到CPU执行;2.直接让CS+IP定位到你的木马所在地址,呵呵,这样就会先执行你的木马,呵呵,总之,要首先加载的是你的木马哈,然后你就想干嘛干嘛),还有就是如果一段信息曾经被CPU执行过,则他所在的内存就一定是被CS:IP指向过

修改CS:IP的指令:
在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制,实际是引导CPU执行你的代码,因为CPU是一个傻子,就是靠CS:IP来引路,好,到这里思路就有了,呵呵

回顾修改AX的值:
mov ax,123 rem:其中mov可以改变大多数8086CPU的寄存器的值,所以又叫传送指令,但是这里是不能通过mov来改变CS:IP的值的

同时修改CS:IP的内容:
jmp 段地址:偏移地址  
如 jmp 2AE3:3  == 2AE3*16+3  的物理地址,
这jmp的功能就是直接用指令来同时修改段地址:偏移地址的值,告诉CPU要往哪里跳转

单独修改IP的内容:
jmp ax   (类似的也可以 mov ax,200  mov IP,ax)
实际就是先让ax里存放你想要的地址(段地址或偏移地址都行)然后再jmp ax就行啦

代码段:
对于8086PC机,在编程的时候,可以根据需要将一组内存单元定义为一个段,可以将长度为N(N<=64KB)的一组代码存在一组连续的,同时起始地址为16的倍数,(因为段地址都是*16的,所以就要是16的整数倍,不然找不到哈,呵呵,)的内存单元中哈,这段呐,有是用来存放代码的,所以就定义了代码段,实际是自定义代码段

执行代码段:
CPU只认CS:IP指向的内存单元的内容为指令,所以要让CS:IP指过去就搞定啦
汇编指令:
-r 寄存器名       rem:修改寄存器的值,直接-r回车,就是查看当前各种寄存器的内容
-d 段地址:偏移地址  rem:查询固定地址的内容,若其后加ff,范围就是搜索固定范围的值,如:-d ffff:0 ff 就是搜索在ffff段的0-ff之间的内存内容,呵呵,最大就是ff,和直接-d就是查看该段(当前cs的地址下)底下的偏移地址的内存内容
-t  rem:单步执行内容(执行一条机器指令),在最后显示的内容就是下一次CPU下一次要执行的啦
-e  rem:向内存中的特定内存写入汇编代码(改写内存),格式如 -e ffff:0 01 01 02 03 03 就是向内存的可定地址写入了。。。,还可以是 -e ffff:0 31.33  点后面的就是修改的内容
-u  rem:显示的是可定内存的汇编指令(实际是将内存中的机器指令翻译为汇编指令),mov要三个字宽度,add要两个字宽度
-a  rem:就是以汇编指令的格式在内存写入一条机器指令(ASC码0 ,16进制 30 ,ASC /  ,十六进制:2F)如:-a 1000:0 就是要在所写的段地址*16+偏移地址=物理地址的位置写入汇编指令,-a后面必须要加写入的地址,才能写入哈
-q  就是退出debug
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值