作业|学习资料

微控制器实验:打造一套自己的指令码

jxtxzzw · 11月2日 · 2018年 · 2028次已读

一开始其实我是一头雾水的,完全不知道要干什么,不过看了几个Example之后,也自己能猜的大概,然后试试,果真如此,非常开心。

下面就来一句句地实现。

首先指令是这样的格式:

1541157879294

现在是我来设计指令,那一切都是听我的,OP-CODE就完全是我自己定义的了,我想让他是多少就是多少。

第一条指令是INL,就是INPUT的低 $8$ 位送到寄存器DR,我想让这句话的OP-CODE是 $001$。

RS在这里是不适用的,因为没有源寄存器,就是从I/O获得的数据,我用 $XX$ 表示。

RD是目标寄存器,是编码的时候确定的,我用 $YY$ 表示。

$0010XXYY$ 就是这条指令。

由于 $XXYY$ 是不确定的,所以显然不能用来散转,那么散转的指令就应该是 $0010$,是 $4$ 位操作码,因此,运用散转规则,得到的散转地址是 $11001000000$。

1541161049500

散转地址用 $16​$ 进制表示,就是 $640​$。

这意味着,我第一句指令,应该写在散转地址为 $640$ 的地方。

这之前的都不需要动,程序复位以后这两句话是没错的。

1541161146438

找到微地址为 $640$ 的地方。

这里要执行一句话,是从I/O到寄存器,取低 $8$ 位,也就是可以认为是偶字节传递。

目的编码应该是通用寄存器。

1541161258994

原编码应该是I/O

1541161277621

因为是取第 $8$ 位,所以可以认为是偶字节传递。

1541161303841

这条指令到这里就执行完了,是一条长度为 $1$ 的指令。

因此,执行完以后,$\mu PC$ 需要做结尾变址,且 $PC = PC+1$。

1541161359338

1541161390448

单击“修改”,这条指令就被录入了,是在 $640$ 的地方。

1541161444093

接下来去指令系统定义这条指令。

这条指令的助记码是INL,需要的操作数只有一个寄存器R0,长度为 $1$。

指令码的话,如上所言,我定义的是 $0010XXYY$,用 $16$ 进制表示就是 $2X$,不妨就设置为 $20$。

那么,这条指令就应该被定义为:

INL R0 20 1

事实上,正如上面说的,指令码是 $2X$,所以其实定义为 $22$ 或者 $29$ 或者其他的形式都是可以的,最后程序装载、运行得到的散转地址都是 $640$,都能够正常运行。

为此,我还特意尝试过,确实是可以的。

15411618102721541161834356

但是定义操作码为 $30$ 显然不行,那就散转到 $660$ 去了。

类似地,定义第二条指令。

OUTL SR,是将源寄存器的低 $8$ 位取出,输出到I/O区域。

上面我用掉了 $001$,现在我想用 $010$。

那么这条指令就是 $0100XXYY$,取 $0100$ 进行散转,得到的散转地址是 $11010000000$,用 $16$ 进制表示就是 $680$,所以这一条指令应该写在散转地址为 $680$ 的地方。

是将寄存器的值输出到I/O,所以源地址是寄存器,目的地址是准双向输入输出,取的是低 $8$ 位,所以总线规则是偶字节传递,这是单条指令,执行完就好了,所以 $PC++$ 且 $\mu PC$ 是结尾变址回到 $0001$。

1541162560465

1541162576951

类似地,定义指令系统。

指令码应该是 $0100XXYY$,所以就是 $4X$,我定义的是 $40$。

OUTL R0 40 1

第三条指令,JMP

下面轮到 $011$ 了,那就是 $11011000000$,换成 $16$ 进制是 $6C0$。

因为地址是 $16$ 位的,所以势必需要分批次将数据读入。

且,这条指令的长度为 $3$,其中第 $1$ 个字节是指令,后面 $2$ 个字节都是数据,因此,应该要做 $PC=PC+3$。

第 $1$ 步,由于要读内存,所以要先取出 $PC$ 的值放到 $AR$,这时候 $PC$ 做第 $1$ 次递增,微地址递增。

因此,指令是 $4307C0$。

第 $2$ 步,将内存里面的值取出一个字节来,放到低位,那就相当于是奇字节到偶字节,我放到了寄存器BX里面。

这时候,源地址就是内存,注意是RAM而不是ROM,所以选择了源是MRD以后,需要选上E/M,目的地址是我选择了BX, 都无所谓,总线规则是奇字节到偶字节。

因此,指令是 $850400$。

第 $3$ 步,和第 $1$ 步是一样的,指令是 $4307C0$。

第 $4$ 步,要读内存里面的下一个字节了,放到高位,那就相当于是奇字节到奇字节,与第 $2$ 步是类似的,只要稍微改动一点,指令是 $840400$。

第 $5$ 步,数据准备完毕就可以跳了,跳的本质上就是用跳转到的地址覆盖掉 $PC$ 里面的值,这样的话下一次 $PC$ 取指取出来的就是跳过去那个地方的下一条指令了。

所以,执行的是,$PC$ 装载。

我是把数据放在BX的,所以应该是源地址选择ALU

1541164023950

ALU是算数逻辑单元,现在我不需要计算 $A+B$ 或者 $A \& B$之类的东西,我只想要BX的值,所以选择的是

1541164042090

目的地址应该是选择 $PC$ 装载。

1541164088433

微变址是结尾变址,因为已经执行完了。

$PC$ 装载了,自然也不存在保持还是增量这一说。

1541165207171

因此,指令是 $C039F2$。

1541165227107

回去定义指令系统。

操作数是内存,所以是*,指令的长度是 $3$,操作码我刚才定义的是 $0110$,也就是$6X$,所以我写的是 $60$。

JMP * 60 3

指令全部设计好了,回过头看一眼,所有的微地址都是唯一的,不冲突,所以满足要求。

下面就可以编写汇编代码了。

这个就非常简单了。

data    segment         ;将程序装载到数据存储器
        assume ds:data
        org   0
start:  INL    r0
        OUTL   r0
        JMP   start
data    ends
        end   start

装载,看一眼,好像还挺正常。

1541164364136

1541164373625

微单步执行,正常取出第 $1$ 条指令 $20$,散转,得到 $640$,跳过去了。

1541164434840

然后执行INL,我输入的是 $5936$,取低 $8$ 位,放到了寄存器。

1541164507863

然后正常回去,取下一条指令,并产生下址。

15411645549851541164563465

我重置I/O为 $0000$,观察得到低 $8$ 位输出成功。

1541164600366

然后是JMP

15411647089741541164725499

这时候BX的值已经是要回去的地址了,$0000$,然后ALUBX的值存放到PC

1541165285804

然后就跳回去了,回到起点了,$0000$。实现了循环往复。

1541165305454

程序到此就结束了。

最后完整的代码附于本文文末。

下面就是画指令流程图。

20181102214508

机器指令格式在上面已经解释过了。

INL是 $XXX0YYZZ$,OUTL是 $XXX0YYZZ$,JMP是 $XXX0YYYY[ADDR][ADDR]$。

至此,作业就写完了。

下面玩一些好玩的。

例如,我想从输入获得一个数,放到AX,从输入获得一个数,放到BX,然后执行 $AX+BX$,结果存到SP

1541166994002

15411669433391541166960827

1541166973579

也是完全可以的。

最后附上代码:

data    segment         ;将程序装载到数据存储器
        assume ds:data
        org   0
start:  INL    r0
        OUTL   r0
        JMP   start
data    ends
        end   start
INL      R0                  20     1
OUTL     R0                  40     1
JMP      *                   60     3
微地址微指令表达式μPC
0000000000+1
00010307C0AR=PC+1
0002800405IR=RAM0600
06404F0392REG=IO, PC++0001
06804B0692IO=REG, PC++0001
06C04307C0AR=PC, PC+++1
06C1850400BX=RAM+1
06C24307C0AR=PC, PC+++1
06C3840400BX=RAM+1
06C4C039F2PC=B0001

共 12 条评论
说点什么

avatar

您可以根据需要插入表情、图片、音频、视频或者其他附件,也可以 @ 你需要提及的用户

  
不开心么么什么再见加油发火可以可怜可爱吐吐血吓呵呵哈哈哦哭哼喜欢嗯嘿嘿困圣诞坏笑圣诞调皮坏笑女汉子奸笑好的委屈宝宝害羞小清新心塞快哭了恭喜发财惆怅我最美抓狂抠鼻放空无奈晕汗泪奔温柔女生狗年生气笑笑泪衰调皮调皮女生鄙视酷静静额鼓掌
上传图片
 
 
 
上传视频和音频
 
 
 
上传其他类型文件
 
 
 
8 评论主题数
4 评论回复数
0 评论跟进人数
 
最近回复的评论
最热烈的讨论
9 评论人数
谢谢楼主wwwhai瓜皮新手谢谢zzw 最近评论者

  订阅评论动态  
最新 最旧 得票最多
提醒
    谢谢楼主
    谢谢楼主5 月 之前 [2019-12-26 · 22:13]
    Firefox 71.0 Windows 10

    顶!

    www
    www5 月 之前 [2019-12-26 · 10:51]
    Firefox 71.0 Windows 10

    hai
    hai5 月 之前 [2019-12-25 · 20:52]
    Chrome 79.0.3945.88 Windows 10

    非常感谢!

    瓜皮新手
    瓜皮新手1 年 之前 [2018-12-27 · 9:27]
    Chrome 57.0.2987.108 Android 7.1.1 | MZ-MX6

    真的感谢楼主分享,期末实验差点就挂了,多谢多谢

    IllusionBot
    IllusionBot1 年 之前 [2018-12-6 · 23:48]
    Chrome 70.0.3538.110 Mac OS X 10_14_1

    希望出个后续,比如习题讲解和模拟题讲解

    luxuantao
    luxuantao1 年 之前 [2018-11-5 · 12:48]
    Chrome 68.0.3440.75 Windows 10

    tqltqltql

    Robin
    Robin1 年 之前 [2018-11-4 · 11:24]
    Chrome 69.0.3497.100 Windows 10

    放弃看ppt了,直接快速跟着jxtxzzw学习
    keep up