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 update
3.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.zip
4. 在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中实现了。✨🎉✨🎉
