前言
经过两周忙碌的小学期项目的学习后,终于又有自己的学习时间了。这次呢,我打算继续学习我的Linux应用开发,同时对汇编语言,python,Qt进行基础的学习。
为什么要学习汇编呢?
因为对作者我而言,开启计算机大门的不是C语言,java等之类的高级语言。在学习这个高级语言的时候,我甚至一点兴趣都没有,只是单纯的希望考试不挂科。真正打开我对计算机兴趣的大门是操作系统!
这跟我学习汇编有什么关系吗?
之所以操作系统打开了我对计算机的兴趣,是因为我从操作系统开始认识到了计算机的工作原理,认识到了之前所学的高级语言对计算机运行的作用和意义,以及为什么我们需要这样来编写我们的代码,怎么样才能让我们的代码变得更高质量。而汇编语言能很好的帮助我去更加深入的学习和理解计算机的工作原理。
为什么写这篇博客?
纯属是为了作为自己的学习笔记,当然也不忘记科学的精神:学习和分享!如果这篇博客对你有帮助,那真是太好了。
怎么来学习汇编语言?
我个人是在学习完了操作系统,计算机组成原理再来学习汇编语言的。其实我觉三者的顺序无所谓,主要是要能够结合三者去链接其中的知识,验证计算机的工作原理。所以我建议大家,如果想往硬件走的话,应该是要深入学习三者的,如果你走软方向,了解底层也能帮助你编写更加优秀的代码以及帮助你在计算机科学的道路上走得更远。学习的方法就是:思考+验证(嘿嘿嘿,因为我就是这样没啥特别的技巧,就是每天给自己找麻烦,为什么他是这样的,不能是这样)
一、教材和编译环境
我使用的教材是图书馆免费的
《汇编语言基础教程》清华大学出版 James T.Streib著 远红亮译
使用的编译环境是VS Code。只需要在里面下载插件 即可
至于VS Code的安装和下载,环境变量的配置你可以在CSDN上收,肯定一大把
二、第一章 变量、寄存器与数据移动
1.1引言
简单介绍一下我们在编写高级语言的时候,从编写代码到计算机执行代码的过程,如图:
详细的内容我还是建议大家在网上找找资料好好学习一下,也私信探讨。因为这能帮助你理解整个代码执行流程。
解释一下上面安装的那个插件MASM的意思:Microsoft Assembler微软汇编程序。
1.2 汇编代码编写规则
1.3 变量的类型
在汇编语言中是需要申明变量的类型的,其实你可以把变量类型申明理解为计算机需要开辟多大的空间来存储你的数据,比如字符,当然就只需要1个byte就可以表示了呀。数字12345678,1个byte怎么够肯定需要更大的空间。所以下面的数据类型你可以按照这个方法去记
类型 所占比特数
sdword 32 s表示有符号,即可以表示负数
dword 32 没有s为无符号数,只能表示负数
word 16
sbyte 8
byte 8
1.4立即数和寄存器
立即数:立即数指的是数据能够被指令直接携带而不用再申请一块内存空间来存放他。比如0x12,就是一个很小的数,一条指令的数据位完全可以装下,就没有必要去申请空间来存。而0x12345678。表示这个数字就我们的指令的数据位就肯定不够,所以需要将它存在内存中,将它的内存地址放在指令中传递给CPU,具体的内容可以先去看我的
《Linux应用开发(一)》
寄存器:这里主要是介绍CPU内部的寄存器,目前只需要有个大概的认识就行,后面就会越来越熟悉,大体的内容如下
以前的CPU只有4个通用寄存器,就是ax,bx,cx,dx。只是随着发展计算机的发展实现越来越多的功能,提高计算机的运行速度等,寄存器有了各种各样的发展和升级。之前是ax是16为的寄存器,eax就是扩展的意思升级为了32位。h和l表示高位和低位的意思。
关于每个寄存器的作用如下
a,b,c,d寄存器都是通用寄存器,也就是说程序员可以直接操作的寄存器。对于怎么使用后面会一一介绍。
完整的实例 C语言中嵌入汇编指令
#include<stdio.h>
int main(){
int num1,num2;
num1=5;
num2=num1;
printf("The answer is: %d\n",num2);
return 0;
}
#include<stdio.h>
int main(){
int num1,num2;
num1=5;
_asm{
mov eax, num1
mov num2, eax
}
printf("The answer is:%d\n",num2);
return 0;
}