Linux 下搭建汇编语言学习环境
Table of Contents
linux 下搭建汇编编程环境的解决方案。
由于某些专业课的需要,我必须要考虑把汇编语言这个东西学一学了,不然有挂科就麻烦了。
由于本渣英语水平实在有限,所以又在谷歌上找了一篇中文教程,这里贴上 PDF 的下载地址, 该 PDF 的排版十分之用心,看起来特别舒服。
NASM
在谷歌上搜了搜关于汇编的东西,找到了 NASM 这个工具。
进入 NASM 的 官方网站 , 看了看它的介绍和说明,我机智的跑到 CLI 下使用了 sudo apt-get install nasm
, 果然不出我所料,竟然可以安装。
使用 NASM 编译汇编程序
nasm 有了,那么如何使用呢?编译器装好了,可是却不会用,这就是有点尴尬了。
我根据 这篇英文教程 简单的写了一个 hello world 程序, 保存为 hello.asm, 然后 nasm hello.asm
, 发现除了生成一个不可执行的 hello 文件,其他的什么也没发生。
有点沮丧的我决定继续看教程,果不其然,我在教程的底下发现了用 nasm 编译汇编程序的方法。
现在我有一个 hello.asm ( 代码来源于上面的教程), 它的内容如下:
section .text global _start ;must be declared for linker (ld) _start: ;tells linker entry point mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data msg db 'Hello, world!', 0xa ;string to be printed len equ $ - msg ;length of the string
现在我需要编译并执行这个程序,我在教程底下找到的方法如下
nasm -f elf hello.asm 2>&1 #将汇编代码编译成目标文件 ld -m elf_i386 -s -o hello hello.o 2>&1 #使用链接器把目标文件链接成可执行程序 ./hello #运行程序
通过我的多次编译运行,我发现,就这个 hello,world 程序而言,编译语句后面的 2>&1
, 似乎没有什么用。
第一句话的作用是把 hello.asm 这个汇编程序代码编译成目标文件,一般是后缀为 .o
的文件,这里会生成一个 hello.o
.
第二句话的作用是把 hello.o 链接成一个可执行程序,可执行程序的文件名为第五个参数 hello,是链接器的输出,后面的 .o
文件是链接器的输入。
今天花了一个多小时就只学到了这么多,更多的用法以后再说吧。
DOSBOX + MASM
弄好了 nasm,准备开始按照教程开始学习,刚刚把 hello,world 程序写完,发现 nasm 没法编译,天坑。
于是又开始找谷歌大神,然后发现了现在这种办法。
安装 dosbox
这个很简单
sudo apt-get update sudo apt-get install dosbox
下载 masm
在网络上发现了这个好东西: 8086Assembler(from google drive)
下载并解压后放到系统的某个位置,我放在了 ~/tools/8086
.
配置 dosbox
现在工具都下载好了,如何使用呢?经过我的折腾,我发现其实很简单,修改 dosbox 的配置文件就可以了。
dosbox 的配置文件位于 ~/.dosbox/dosbox-0.74.conf
编辑它并在文件末尾加上三句话就可以了
mount C ~/tools/8086 \\ mount D ~/workspace/asm \\ path=Z:\;C:\ \\
之后只需要运行 dosbox 就可以用 masm 的所有命令了。