##汇编语言简介 在上一篇文章中,我们学习了处理器,也学习了处理器是如何进行算数逻辑运算的。为了实现处理器的自动运算,处理器必须从内存中取指令,并执行这些指令。
指令和被指令引用的数据在内存中都是一些或高或低的电平,每一个电平都可以看成是一个二进制(0 or 1),8个二进制位形成一个字节。要解读内存中的东西,最好的办法就是讲他们按字节转换成数字的形式。比如下面这些数字就是存放在INTE8086的指令,我们用的是十六进制: ` B8 3F 00 01 C3 01 C1 `
对于大多数人来说,上述指令,是很难知道它到底在干嘛的。实际上它对应着下面的意思:
- 将立即数003F传送到寄存器AX;
- 将寄存器BX的内容和寄存器AX的内容相加,结果在BX中;
- 将寄存器CX的内容和寄存器AX的内容相加,结果在CX中;
即使是很有经验的技术人员,也不一定能够将以上指令对应的意思记住。
为了克服机器指令难以书写与记忆的缺点,汇编语言就出现了。汇编语言是一种助记符,用来帮助理解和记忆机器指令。上述的指令,就可以写成如下的汇编语言:
mov ax, 3FH
add bx, ax
add cx, ax
我们就简单的了解汇编语言。先注意一下节点:
- 汇编语言不区分大小写
- 汇编语言中的立即数(立即数的概念参看上一篇文章)可以为二进制,十进制,十六进制等!
NASM编译器
NASM下载和安装
处理器只能识别机器指令,不能识别汇编语言。所以NASM编译器,就是将相关的汇编语言源程序编译成处理器可以识别的机器指令。
NASM是可免费的使用的开源软件,下面是它的下载地址:点击下载
代码的书写和编译过程
打开NASM编译器的命令行窗口后,显示如下:
我们可以写完汇编语言源程序后就用它来编译,但是这样太麻烦,本系列文章参考的书籍中,作者写了一个小程序Nasmide,该程序可以编写汇编语言然后可快速编译源程序。
书上随书工具booktool链接地址: 链接:https://pan.baidu.com/s/1FnFjgAy1jQIwij8ns7MnUA 提取码:vsmi
我有时候遇到Nasmide无法使用,我直接使用notepad++ 直接调用nasm来编译程序就好,注意,我们来编译成bin格式的二进制文件,不需要EXE文件。用指令nasm -f bin filename -o objname.bin -l objname.lst,其中-f是指明二进制文件。 参考Notepad++ Linking to NASM https://forum.nasm.us/index.php?topic=1971.0
- 在Notepad++上面的选项栏中找到 Plugins—>Plugin Admin
- 在Available标签页搜索NppExec,没有安装过的,将能够搜索的出来,已经安装过的,将在Installed标签页中显示
安装完成插件之后,Plugins下将多了个NppExec,按图将相关Console勾选以便打印命令行执行情况,特别注意,Follow…这个的勾选,即表示在当前被编辑文件的路径启动命令行窗口,最后Execute。 cd “$(CURRENT_DIRECTORY)” D:\NASM\nasm.exe -f bin $(FILE_NAME) -o $(NAME_PART).bin -l $(NAME_PART).lst
当运行NASM终端时,要在它刚开始默认的文件夹中运行,如果是在别的文件夹会出现无nasm指令的状况,这里应该要修改windows环境变量吧。(把你写好的汇编代码存入默认的文件夹中就好),点击ok,就可以编译生成bin文件。
若用Nasmide,如图所示,配置编译器路径:
再编译源程序文件的时候,直接点击“文件”下的“编译本文档”即可。
hexview 不能用的时候,可以参考blog https://blog.csdn.net/OneTrianee/article/details/80410816
如图 3-11 所示,请问: (1) 源程序共有 3 行,每一行第一个字符的偏移分别是多少? (2) 该源程序文件的大小是多少字节?
从图中看出,第一行是0H,第二行是第五个才是,即35H!第三行自然就是40H 2. 49H(即73个字节)