zoukankan      html  css  js  c++  java
  • 一起来编写汇编语言

    1.汇编语言的产生

    我们都知道,计算机能够处理的语言只有机器语言,也就是只用0和1两个二进制数书写的编程语言。也就是说,早期的程序员如果想要编程,就要将0,1数字编写的程序代码打在纸带或者卡片上,1打孔,0不打孔,再将程序通过制袋机或者卡片机输入计算机,进行运算。我们可想而知,当时的程序员是多么厉害。但是他们很快发现编写的都是0,1很难辨别和记忆,因为程序员要面对的是01010100011...的数字,稍微错一个数字也不太好发现,因此,就产生了汇编语言。
    着便是汇编语言的产生。

    2.汇编语言的基础知识

    首先,我们先了解一些基本概念:

    1. 机器语言
      所谓机器语言,就是只用0和1两个二进制数书写的编程语言。它有的时候也叫作原生代码(Native Code)。这里需要注意,只要CPU种类不同,对机器语言的解释也就不同。
    2. 编译器
      由于计算机只能读懂机器指令,所以就需要一个能够将汇编指令转换成机器指令的翻译程序,这样的程序我们称其为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其翻译为机器码。就像我们写的Java,OC,等等,都是由编译器最终转换成01代码,最后由计算机执行。
    3. 时钟信号的频率
      由时钟发生器发送给CPU的电信号的频率。单位是MHZ(兆赫兹 = 100万回/秒)。时钟信号是0和1两个数之间反复变换的电信号,类似于滴答滴答左右摆动的钟摆一样。通常我们把发出一次滴答的时间称作一个时钟周期。

    简单先了解这么几个概念,接下来让我们正式走进汇编语言。先来看看下面一段代码:

    LD A,207
    OUT(2),A
    LD A,255
    OUT(2),A
    

    这样的一段代码,初次见到我们肯定不太理解其意思。它就是汇编语言。我们现在在简单分析一下这段代码(不解释功能):
    类似于LD、OUT这种类英语或者英语单词的东西,我们叫它:
    助记符
    它是根据指令功能的单词起一个相似的昵称,并将这个昵称做一个1对1的映射,而与其对应的就是0和1的组合。
    那什么叫汇编语言呢?顾名思义,就是使用助记符的编程语言叫做“汇编语言“。
    汇编语言的语法
    汇编语言的语法很简单,相比我们学的OC、Java等语言,它的语法只有一个:把标签、操作码(指令)和操作数(指令的对象)并排写在一行。
    举个简单的例子:

    标签      操作码     操作数
              LD       A,207
              OUT      (2),A
    LOOP:     IN       A,(0)
              OUT      (1),A
              JP       LOOP
    

    这便是一个汇编代码(没有实际意义)。这里的标签就是给该行代码对应的内存地址起个名字,下次想要跳转到该行代码的时候可以直接使用标签跳转。这里需要注意:
    机器语言是二进制数,而汇编语言则是使用十进制或者十六进制数来记录数据。
    接下来,就让我们看一下Z80 CPU的主要指令:

    这里需要注意一下:
    num表示的是数值,(num)表示的是num的地址
    reg表示的是寄存器,(reg)表示存储在名为reg的寄存器中的地址。
    这里说道了寄存器,其实寄存器就是CPU内部存储数据的地方。Z80 CPU中所带的寄存器有:
    A、B、C、D、E、F、H、L、IR、 IX、 IY、 SP、 PC。
    在汇编语言中,可以将寄存器的名字指定为操作数
    接下来让我们简单分析前面的那一段代码。
    LD A,207:就是把207写入到寄存器A
    OUT (2),A:就是把寄存器A中的值写入到地址2中
    IN A,(0):从地址0中读出数据,存放到寄存器A中
    OUT (1),A:把寄存器A中的值写入到地址1中
    JP LOOP:跳转到LOOP:标签,循环执行。

    刚才也说了,计算机只能认识机器语言,所以我们刚才写的汇编语言还需要转换为机器语言才能运行。接下来让我们先看一个表格:

    也就是说,我们按照上面的转换方法就可以将汇编语言转成机器语言。例如
    LD A ,207 ,转成机器语言就是00111110 11001111
    JP LOOP,转成机器语言就是: 11000011 num,这里的num是地址,这里注意需要用16比特的二进制数替代作为内存地址的num,也就是00000000 00010000 (也就是00010000假如是IN A,(0)的地址,扩充之后就是00000000 00010000),因此JP LOOP的机器语言就是:
    11000011 00010000 00000000。
    这里你也许会疑惑,num的八个0怎么跑后面了呢?
    这里需要注意,将一个2字节的数据存储到内存时,存储顺序是低八位在前、高8位在后,也叫小端序。与此相反的叫大端序。CPU种类不同,端序也不同,Z80用的小端序,因此将低八位放到了前面,高八位的00000000放到了后面,就成了:11000011 00010000 00000000。
    至此,我们就成功的将汇编语言转换成了机器语言,其他的助记符到机器语言的转换可以自行搜索查看。

  • 相关阅读:
    Jenkins常用插件
    Jenkins安装配置简单使用
    Django简单快速实现PUT、DELETE方法
    Django admin有用的自定义功能
    ambari快速安装hadoop
    Asp.Net Core 3.0的依赖注入改变
    NCoreCoder.Aop 国庆更新
    NCoreCoder.Aop详解
    .Net Core 3.0下AOP试水~~
    .Net Core 3.0依赖注入替换 Autofac
  • 原文地址:https://www.cnblogs.com/zhanggui/p/6517135.html
Copyright © 2011-2022 走看看