设为首页收藏本站 隐藏访客:

随心逆向破解论坛-

 找回密码
 立即注册
关闭
随心破解论坛
随心逆向破解论坛欢迎你
办理会员 有事您Q我
技术支持 有事您Q我
售后服务 有事您Q我
工作时间:周一至周五
AM9:00-PM22:00
电话:18665730043
接单任务 问答大厅
VIP试看
查看: 14|回复: 0

[经验资料] 一步步学习汇编(笔记一)

[复制链接]
  • TA的每日心情
    萌哒
    前天 13:20
  • 240

    主题

    243

    帖子

    40万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    402136
    发表于 2019-8-12 13:35:57 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    不能免俗,学习汇编,首先,我们先从一个简单的事例开始,比如,我们要输出一句话“Hello,word”,那么是早期的计算机中,我们可能需要进行如下的编程:
    00011110
    1011100000000000000000
    10000001110000000000110
    110001000000000000010010
    看到这样的程序,对于里面的1和0,你是否范糊涂了,如果敲错一个0或1会如何办,是否感觉太难懂了,用0和1表示的这段程序就是机器语言。
    1.机器语言是机器指令的集合,机器指令是一台计算机能够正确执行的语言,它是由一系列的二进制数据而组成的。计算机将其转换为高低电平,以便能够控制计算机的部件,比如:cpu,内存等,从而进行计算。
    但是这样的方式对于开发人员来讲,实在是太晦涩难懂了,有没有方法进行改进呢?
    在这样的情况下,就产生了汇编语言。

    2.汇编语言的主体是汇编指令,其实际上是对机器语言的另一种表式形式,方便开发者进行编程。例如:
    1000100111011000,如果我们用汇编指令可这样描述:
    mov ax,bx,表示将bx寄存器的内容赋给ax
    寄存器:是cpu中可以存数据的玩意。Cpu包含很多寄存器,ax,bx只是其中的两个寄存器而已。

    3.那么计算机是如何识别类似于mov ax,bx这样的指令呢,实际上是通过编译器,最终将汇编指令转换成机器码,由计算机最终执行的。(具体的例程我们基础篇讲完后再来看实例)。
    那么计算机中的各个部件到底是如何工作的呢?
    实际上,对于计算机而言,cpu和内存的关系就好比:一个好的作家一定是来源于生活中,一个才华横溢的天才大脑也是建立在充足的记忆和数据上的。这里cpu就好比天才的大脑,它是用来计算的。内存就好充足的记忆和数据。它是用来存储数据以供cpu调用并最终计算的。
    那么我们平时用c#或java或vc++写的而存在硬盘中的程序呢,同样的道理,它们运行时也一样要被读到内存中,否则cpu是无法识别的。
    想想,如果我们了解了通过cpu读取内存数据,或者熟悉了cpu向内存中写数据,那么我们能够做什么呢?
    我们可以从中结取程序的中间值,并修改后再写入程序。
    我们也可以制作类似于各种游戏外挂的东东。

    那么cpu是如何对存储器进行读取的呢?
    首先,我们来看看存储器的分布规则:

    1.在计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是字节。一个存储单元可以存储一个字节,也就是8个二进制位。计算机的存储器容量是以字节为最小单位来计算的,对于一个有128个存储单元的存储器,可以说它的容量为128字节。
    例如:如果有一个1KB的存储器,则它有1024个存储单元,它的编号为从0-1023。
    2.我们平时开发的程序中,变量和主存储器的存储单元相对应。变量的名字对应着存储单元的地址,变量内容对应着单元所存储的数据。
    3.好比一条商业大街上的门店一样,存储器就是商业大街,门店就是存储单元的地址。
    其次,我们要通过cpu从内存中读取数据,就必须要知道存储单元的地址。就像在商业街上找人,你需要知道他开的门店的具体地址。
    1.另外,在一台微机中,不只有存储器这一种器件。CPU在读写数据时还要指明,它要对哪一个器件进行操作,进行哪种操作,是从中读出数据,还是向里面写入数据。
    (备注:熟悉vc,java或.net的朋友,一定知道我们存取数据时,有时为了高效,需要将数据放到Cach中,而Cache的存取速度与CPU的速度相当。 有了Cache后,无论是存入数据还是取出数据,都先将该数据及后面连续的一组数据先存放在Cache中,CPU在取下一组数据时,它首先看所需数据是否在Cache中,如果在就立即传给CPU;如果不在就得访问RAM。
    如果CPU能在高速缓存中找到要访问的数据,就能大大提高系统的速度。
    Cache有两种:内部Cache和外部Cache。内部Cache在CPU内部,容量较小,外部Cache在主板上,容量较大。)
    2.可见,CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行下面3类信息的交互。
    存储单元的地址(地址信息);
    器件的选择,读或写的命令(控制信息);
    读或写的数据(数据信息)。
    那么CPU是通过什么将地址、数据和控制信息传到存储器芯片中的呢?电子计算机能处理、传输的信息都是电信号,电信号当然要用导线传送。在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。总线从物理上来讲,就是一根根导线的集合。根据传送信息的不同,总线从逻辑上又分为3类,地址总线、控制总线和数据总线。
    CPU从3号单元中读取数据的过程(见图1.3)如下。

    [img=385,246][/img]
    上述过程可描述如下:
    (1)CPU通过地址线将地址信息3发出。
    (2)CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据。
    (3)存储器将3号单元中的数据8通过数据线送入CPU。
    写操作与读操作的步骤相似。如向3号单元写入数据26。
    (1)CPU通过地址线将地址信息3发出。
    (2)CPU通过控制线发出内存写命令,选中存储器芯片,并通知它,要向其中写入数据。
    (3)CPU通过数据线将数据26送入内存的3号单元中。
    从上面我们知道了CPU是如何进行数据读写的。可是,如何命令计算机进行数据的读写呢?
    要让一个计算机或微处理器工作,应向它输入能够驱动它进行工作的电平信息(机器码)。
    机器码:        101000000000001100000000
    含义:          从3号单元读取数据送入寄存器AX
    CPU接收这条机器码后将完成我们上面所述的读写工作。
    机器码难于记忆,用汇编指令来表示,情况如下。
    机器码:        10100001 00000011 00000000
    对应的汇编指令:MOV AX,[3]
    含义:          传送3号单元的内容入AX
    通过上图,我们可以知道,cpu读写数据时,可以通过存储器,也可以通过Cache,并且根据传送信息的不同,总线从逻辑上又分为3类,地址总线、控制总线和数据总线。下面我们就来看看地址总线的工作原理
    现在我们知道,CPU是通过地址总线来指定存储器单元的。可见地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。
    现假设,一个CPU有10根地址总线,让我们来看一下它的寻址情况。我们知道,在电子计算机中,一根导线可以传送的稳定状态只有两种,高电平或是低电平。用二进制表示就是1或0,10根导线可以传送10位二进制数据。而10位二进制数可以表示多少个不同的数据呢?2的10次方个。最小数为0,最大数为1023。
    为了让大家看得更加简单明了,我们来看下面的图:
    [img=343,318][/img]
    [img=1,1][/img]
    图二展示了一个具有10根地址线的CPU向内存发出地址信息11(00000001101)时10根地址线上传送的二进制信息。考虑一下,访问地址为12、13、14等的内存单元时,地址总线上传送的内容是什么?(12=0000001110,13=0000001111)等
    一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。
    相信通过上面的描述,大家应对地址总线的原理有了一定的了解,那么根据地址总线将地址传给了存储器的某个存储单元后,数据总线又是如何工作的呢?
    CPU与内存或其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度。8根数据总线一次可传送一个8位二进制数据(即一个字节)。16根数据总线一次可传送两个字节。
    8088CPU的数据总线宽度为8,8086CPU的数据总线宽度为16。我们来分别看一下它们向内存中写入数据89D8H时,是如何通过数据总线传送数据的。图三展示了8088CPU数据总线上的数据传送情况;图四展示了8086CPU数据总线上的数据传送情况。
    [img=404,300][/img]
    [img=286,352][/img]
    8086有16根数据线,可一次传送16位数据,所以可一次传送数据89D8H;而8088只有8根数据线,一次只能传8位数据,所以向内存写入数据89D8H时需要进行两次数据传送。
    通过上面的描述,我们知道,当我们需要对数据进行操作时,通过地址总线可在存储器中找到相应的存储单元,通过数据总线,可取得存储单元所存储的值。那么我们如何确认对数据进行的是读还是写?是对存储器的操作还是cache等的操作呢?对了,就是控制总线,我们来看看控制总线的原理吧
      CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。
    前面所讲的内存读或写命令是由几根控制线综合发出的,其中有一根称为"读信号输出"的控制线负责由CPU向外传送读信号,CPU向该控制线上输出低电平表示将要读取数据;有一根称为"写信号输出"的控制线则负责传送写信号。
    现在我们总结如下:
    (1) 汇编指令是机器指令的助记符,同机器指令一一对应。
    (2) 每一种CPU都有自己的汇编指令集。
    (3) CPU可以直接使用的信息在存储器中存放。
    (4) 在存储器中指令和数据没有任何区别,都是二进制信息。
    (5) 存储单元从零开始顺序编号。
    (6) 一个存储单元可以存储8个bit,即8位二进制数。
    (7) 1Byte=8bit  1KB=1024B  1MB=1024KB  1GB=1024MB。
    (8) 每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个CPU可以引出3种总线的宽度标志了这个CPU的不同方面的性能:
    地址总线的宽度决定了CPU的寻址能力;
    数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量;
    控制总线的宽度决定了CPU对系统中其他器件的控制能力。

    楼主热帖




    上一篇:零基础学汇编,一
    下一篇:一步步学习汇编(笔记二)
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|影视特权|PC|Archiver|手机版|小黑屋|软件编程逆向爱好者的天堂

    GMT+8, 2019-8-22 12:12 , Processed in 0.174065 second(s), 32 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表