现阶段,找个方便好使的编程环境还是比较蛋疼的,对于部分想过瘾或者想从学习实践中学习的小伙伴来说,略显蛋疼。不过,仔细琢磨,还是能够自己折腾出一个好用的环境来的。开搞。
环境
- Ubuntu
- gcc/nasm
也就是说,你先安装一个能正常使用的Ubuntu再说吧,然后顺便熟悉一些相关的概念和操作。
后面若没有特殊说明,那我们讨论的问题都是在这个软件环境下。
先打开终端,安装所需软件(注意$开头的才是命令,并且$并不属于命令的一部分):
$ sudo apt-get install gcc nasm vim gcc-multilib -y
在终端中分别执行which nasm和which gcc,得到如下结果,则表示环境已经安装完毕。
$ which nasm
/usr/bin/nasm
$ which gcc
/usr/bin/gcc
开始第一个程序
在汇编语言环境下,我们先别急着搞什么Hello World,在这里要打印出Hello World还不是一个简单的事情,这也算是初入汇编比较让人不解的地方,成天都在扯什么寄存器寻址啥的,说好的变量分支循环函数呢?
别说话,先按照我的套路把环境配好,程序跑起来了再说。注意,不是Hello World。先亮出第一个程序的C语言等价代码:
int main() {
return 0;
}
不好意思,大括号没换行。你以为接下来我要gcc -S吗?Too naive。我这可是正宗手工艺,非机械化生产。
说正事,先一股脑啥都不知道地把代码敲完,跑起来再说:
首先准备个文件,暂且叫做first.asm吧,然后把下面的代码搞进去:
global main
main:
mov eax, 0
ret
好了程序写完了,你能感受到这里的0就是上面C代码里的0,说明你有学习汇编的天赋。
OK接下来就要编译运行了。来一堆命令先:
$ nasm -f elf first.asm -o first.o
$ gcc -m32 first.o -o first
这下,程序就编译好了,像这样:
$ ls
first first.asm first.o
好了我们运行一下:
$ ./first ; echo $?
别问我为何上面的命令后面多了一串奇怪的代码,你自己把它删掉之后再看就能猜出来是干啥的了。如果还有疑惑,可以再次做实验确认,比如把代码里的0改成1。变成这样:
global main
main:
mov eax, 1
ret
再按照同样的套路来编译运行:
$ nasm -f elf first.asm -o first.o
$ gcc -m32 first.o -o first
$ ./first ; echo $?
1
OK,咱们的环境准备工作大功告成,后面再细说该怎么搞事情。