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 的所有命令了。

Date: <2016-05-21 Sat>

Author: Matrikslee

Created: 2017-05-29 Mon 17:56

Emacs 25.2.1 (Org mode 8.2.10)