WSL+VScode配置lc3汇编语言环境
WSL+VScode配置lc3汇编语言环境
针对UIUC课程ECE120配置的lc3调试环境。lc3是一个简易的16位计算机模型,用于计算机CPU运行逻辑的学习,详细可见Introduction to Computing System。主要用到了 Win10的WSL+VScode 搭建调式环境。并且涉及了linux中lc3汇编器的安装。最终还做到了wsl的图形化界面以窗口形式在windows中显示。(现在wsl进化了许多,有些方法已经过时)。
这是我严格意义上的第一篇博客,写的不太成熟,杂糅了很多内容。可以看目录直接跳转。
0. 引子:为什么要配置wsl上的lc3环境?
0.1 看不惯学校给的vm
我是计算机系的,上ECE课的时候用到了《计算机系统概论》这本书。有关于lc3汇编语言的作业。
老师建议用学校封装好的linux,放在vm上跑,但我感觉vm太慢而且操作不友好。笔记本也因为内存不够的问题总是卡死,文件交互也不方便,不能直接复制帮别人检查文件。好在windows出了linux子系统(wsl),想着自己配置一个wsl的lc3环境,能省不少事。
因为之前就已经在用Ubuntu子系统学linux的操作了,索性就搜了资料配置了一个环境出来。现在配置的差不多了,但是课也快上完了。算是总结一下经验,为学弟学妹们排雷了。
0.2 wsl上写lc3的利弊
👍利/advantage
- 可以用vscode或别的win端的编辑器敲代码,**代码高亮,快速文本编辑,**代码书写体验极佳。
- 文件交互方便,通过资源管理器直接访问wsl文件系统,复制粘贴一键搞定
- vscode还能配置调试任务(tasks)
 一键调试代码,配置一劳永逸
- 不用费脑子折腾万恶的vm
👎弊/disadvantage
- 需要一定的linux使用基础
- 配置环境需要小折腾
- 可能会有莫名的bug🐛
- win和linux文件系统不兼容,不注意会有换行符的问题(都用vscode就没事,见后文)
因为我也是从小白开始学起,很多都是参考别人的博客和教程,所以这里就不重复造轮子了,一些配置步骤就直接引用(转载)别人的文章了。
我的配置:
 系统:win10 1903
 电脑:surface pro(第五代)
- mac本身就是Unix,用terminal就行
- win7因为没有Linux子系统,所以不适用本文方法,乖乖用vm跑。或者升级成win10
1. 安装windows的linux子系统(WSL)
1.1 从零开始安装wsl
- 快捷键 win+i打开系统设置,更新win10到最新版本
- win键 打开开始菜单,键盘直接输入- 功能会出现搜索界面,点击- 启用或关闭windows功能
- 在弹出来的窗口的最下方,将 适用于Linux的windows子系统打勾
- 在应用商店中搜索linux,会跳出来很多可选的子系统。随个人喜好选择,我用的是 Ubuntu18.04
- 等待子系统安装好之后,打开应用,第一次初始化会挺久的,大概五分钟。
 初始化期间不要关掉窗口 ,不然会有奇奇怪怪的问题。初始化完了会让你输入用户名和密码,确认之后就可以正常使用了。
- 现在wsl就装好了,这是一个区别与win系统的相对独立的操作系统。目前只有命令行界面,但之后会讲到图形界面。可以输入 mkdir test来创建一个名为test的文件夹,也可以输入uname -a来查看系统信息。(linux的命令行操作可以上网自己学。)

CSDN详细的图文教程,但我觉得我说的挺清楚
1.2 wsl的一些使用技巧
- wsl的目录可以在win的资源管理器下直接访问,路径一般是 C:\Users\YOUR_USERNAME\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs可以直接从里面复制文件出来。但是把外面的文件复制进去会不能识别,最好在命令行中用cp命令(因为文件系统不同,linux不能识别win的文件)
- wsl命令行也可以通过在cmd或者powershell中输入 bash来开启
2. 安装vscode和插件
2.1 安装vscode
进入vscode官网,下载最新版本的vscode,安装
2.2 安装插件
- 打开vscode,左边栏第5个点进去
- 在最上方搜索栏输入 Chinese安装搜索结果中的第一个,作者为Mircosoft的插件。
- 在最上方搜索栏输入 remote - WSL安装搜索结果中的第一个,作者为Mircosoft的插件。
- 在最上方搜索栏输入 LC3 Assembly安装搜索结果中作者为PaperFanz的插件。


3. 安装lc3编译器
3.1 更换镜像源
因为wsl的ubuntu发行版真的太干净了,很多正常发行版有的软件他都没有,所以需要手动把编译lc3编译器的工具装上。鉴于国内访问外往速度感人,我们先把镜像源换成阿里云镜像。
熟悉linux操作的直接进入/etc/apt/文件夹,把当前source.list备份成source.list.backup,再用vim或nano将下面的内容覆盖原文件
看不懂上面一句的,打开资源管理器,进入C:\Users\YOUR_USERNAME\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\etc\apt (用你的用户名代替YOUR_USERNAME)用vscode打开 source.list 文件,注释当前全部内容( ctrl + A , ctrl + /),再把下面的内容复制进去,保存。
## 阿里源
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse进入命令行,输入下面这行命令就能更新镜像源,获得速度加成了。
sudo apt-get update3.2 安装组件
linux安装软件很方便,只需要一行命令,这里我们安装wish gcc flex unzip wget这5个软件。打开命令行,输入
sudo apt-get install wish gcc flex unzip wget输入密码再确认就可以了。
亲测换成阿里源速度基本是原来的10倍(网好的话可能是100倍)。
3.3 安装lc3编译器
具体安装就参照这一篇文章
 吧,写的很详细
补充一下:
- 强烈建议查看📑官网的说明文档,有详细的使用说明,可以解决很多问题
- 下载及解压两个源文件可以用以下命令
## 下载lc3仿真器及编译工具
wget http://highered.mheducation.com/sites/dl/free/0072467509/104652/lc3tools_v12.zip
## 下载c语言转lc3汇编语言转换器工具
wget http://highered.mheducation.com/sites/dl/free/0072467509/104652/lcc.zip
## 解压压缩包
unzip lc3tools_v12.zip
unzip lcc.zip4. 在vscode上远程打开WSL
4.1 现在尝试用vscode连接wsl
- 打开vscode,如果你已经安装了 remote - WSL 的话,左下角会有 ><符号,点击后在下拉栏选择New Windows
- 在弹出的新窗口中:打开vscode资源管理器(左侧栏第一个)→ 打开文件夹→ 在下拉栏中选择你要用来存放lc3相关文件的文件夹。成功打开之后,所有操作基本与编辑windows系统下的文件相同。


4.2 一些操作细节
- 文件的复制、移动、删除等操作可以子啊左侧资源管理器里,通过拖拽完成。delete是 永久删除 不能恢复。在windows资源管理器中(C:\Users\YOUR_USERNAME\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs)复制移动后,可能在wsl中不能识别而没有显示。
- linux系统和windows系统的 换行符 不同。简单来说就是 - 对linux系统的文件,右下角一排中选择 LF
- 对windows系统的文件,右下角一排中用 CRLF
 
- 对linux系统的文件,右下角一排中选择 
5. 在vscode上写lc3汇编语言
- 在远程wsl模式下的vscode中,打开 扩展(左侧栏四个小方形那个),把之前安装的三个插件install in WSL
- 打开vscode资源管理器,新建一个文件test.asm,注意以.asm扩展名结尾。
- 打开这个文件,就能快乐的用vscode写lc3了。从此多行复制,代码片段,语法高亮,TODO tree都有了,而且启动嗖嗖的快,颜值唰唰滴高。vm有生灵倒悬之急,岂不美哉?

6. 在vscode上调试lc3程序【重点】❗
6.1 lc3的编译过程
想要调试lc3,首先要知道他是怎么工作的。这也是学习lc3的一部分。
你写的汇编伪代码会经过两轮pass,生成.sym和.obj文件。.obj文件(也就是机器码)再被lc3sim仿真器读取,由仿真器来模拟lc3执行代码的过程。
因此,一般而言,调试lc3汇编代码需要两行命令, lc3as test.asm 和 lc3sim test.obj 有时候需要打印输出还要 lc3sim -s testcommand > myoutfile 等等。可是这些重复的输入能不能简单一点呢?
当然可以,这里就用到了vscode的“tasks”功能,把重复的工作化简。
6.2 用tasks化简调试过程
你可以把vscode的tasks看作是一键执行预定脚本的功能。把调试命令设置好后,只需要一键就可以重复调用。具体操作如下
若你没有改过快捷键绑定,在文本编辑界面 ctrl + shift + B 就会弹出配置任务(tasks)的下拉栏 → 配置任务 → Others。一个名为tasks.json的文件会创建在.vscode文件夹内,这是vscode放置当前工作区配置的文件夹,不要删去。
用下面的代码覆盖里面的内容,把注释的地方改成自己对应安装的。
    {
        // See https://go.microsoft.com/fwlink/?LinkId=733558
        // for the documentation about the tasks.json format
        "version": "2.0.0",
        "tasks": [
            {
                "label": "lc3as asmble",              //之后调用时显示的名字
                "type": "shell",
                "command": "$HOME/bin/lc3as",       //改成你的lc3as的路径
                "args": [
                    "${fileBasename}"               //command+args就是你给命令行的信号,这里相当于lc3as test.asm
                ],
                "options": {
                    "cwd": "${fileDirname}"
                },
                "presentation": {
                    "echo": true,
                    "reveal": "always",
                    "focus": false,
                    "panel": "shared",
                    "showReuseMessage": true,
                    "clear": false
                },
                "group": "build",
                "problemMatcher": []
            },
            {
                "label": "lc3sim simulate",
                "type": "shell",
                "command": "$HOME/bin/lc3sim",          //改成你的lc3sim的路径
                "args": [
                    "${fileBasenameNoExtension}.obj"    //这里相当于lc3sim test.obj
                ],
                "options": {
                    "cwd": "${fileDirname}"
                },
                "presentation": {
                    "echo": true,
                    "reveal": "always",
                    "focus": true,
                    "panel": "shared",
                    "showReuseMessage": true,
                    "clear": true
                },
                "group": "build",
                "problemMatcher": [],
            },
            {
                "label": "lc3 CLI debug",                  //这个task用来整合上面两个tasks,能一键编译加调试
                "type": "shell",
                "dependsOrder": "sequence",
                "dependsOn": [
                    "lc3as asmble",
                    "lc3sim simulate"
                ],
                "group": "build",
                "problemMatcher": []
            }
        ]
    }这样一来,回到文本编辑的地方就可以通过按下ctrl + shift + B 来调用tasks啦。调用成功🎉🎉🎉

6.3 调试的注意事项
- 建议先用lc3 asmble测试编译,到编译成功后再用lc3sim来调试。
 因为直接用lc3sim相当于连着使用了lc3 asmble和lc3 simulate两个tasks,这样lc3as的输出会一闪而过,如果编译没有成功的话,.obj文件没有更新,调试的仍是修改前代码对应的.obj文件。
- 用lc3sim调试完了之后,记得用 quit命令退出,不然下一次不会进入新文件的调试环境。
- 有测试文件或输出要求的也可以实现,就是新建几个对应命令的tasks,再用类似lc3sim的task连接起来。
- tasks文件的具体书写规则上📑官方文档看吧(不愿意看英文的可以 换一个脑子用chrome网页翻译代替)。用好了能有骚操作,对别的语言也是如此。
- 不知道能不能用debug功能实现和lc3sim的对接,没有研究,要是可以的话就能F5一键调试了。但是断点好像不能传递给lc3sim。😝反正我学完lc3了,以后都不用了,不折腾了。而且现在也挺方便。
7. 通过vscode可视化调试lc3程序【重点】❗❗
单单把命令行的调试界面整合到vscode中似乎还不够方便,用vm的同学一个 lc3sim-tk 的图形化界面就把黑底白字的命令行比下去了。那既然都是重复调用命令,能不能也用tasks来启动图形化的调试界面呢?
7.1 win10子系统的图形化界面
- 具体的方法就参照这篇教程来就行了。推荐使用第二个方法,也就是xming方案。这样可以让弹出的窗口和win的窗口并列,沉浸式的debug体验极佳。 
- 总结一下这篇教程里的具体命令操作,方便以后回看 - #第一种方法(远程桌面) sudo apt-get update sudo apt-get install xorg xfce4 xrdp sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini sudo echo xfce4-session >~/.xsession sudo service xrdp restart #win自带的远程桌面连接到127.0.0.1:3390,127.0.0.1是本地机器的回送ip地址。 #第二种方法 sudo apt-get update sudo apt-get install xorg xfce4 openssh-server #windows安装xming,启动xming DISPLAY:=0 lc3sim-tk #跟着你要启动的图形化程序命令 #就可以在win中弹出linux的图形化窗口了
- 一些小技巧 - 进入xming launch可以选择不同的窗口显示方式。
- 进入~/.bashrc,添加 alias D='DISPLAY:=0',可以把DISPLAY:=0化简成“D”,以后就可以用D lc3sim-tk来启动了
 
7.2 用vscode启动图形化调试界面
原理还是一样,用tasks来代替重复输入命令。把下面的代码复制到tasks.json文件前几个tasks的后面,就可以了。
        {
            "label": "lc3sim-tk simulate",
            "type": "shell",
            "command": "DISPLAY=:0",
            "args": [
                "/home/gavin/bin/lc3tools/lc3sim-tk",  //改成你的lc3sim-tk的路径
                "${fileBasenameNoExtension}.obj"       //这里相当于DISPLAY:=0 lc3sim-tk test.obj
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "presentation": {
                "echo": false,                         //因为是图形化界面,所以就不用显示命令行的输出了
                "reveal": "never"
            }
            "group": "build",
            "problemMatcher": [],
        },
        {
            "label": "lc3 tk debug",                  //这个task用来整合上编译和图形化的界面,能一键编译加调试
            "type": "shell",
            "dependsOrder": "sequence",
            "dependsOn": [
                "lc3as asmble",
                "lc3sim-tk simulate"
            ],
            "group": "build",
            "problemMatcher": []
        }至此,图形化就完成了,所有vm中的所有功能关于lc3都能在vscode中实现了。✨🎉✨🎉
