
首先我们看到 “编程语言”,大致分为两类,
JavaPython高级语言同样要需要转换成机器语言才能解释、执行
//高级语言程序
ans = a + b
//机器语言程序
a1 00 20 40 00
03 05 04 20 40 00
a3 08 20 40 00
汇编语言,本质上是 机器语言 的助记符版本 ,
还有三个常用"代号"
MOV:搬运数据ADD:做加法JMP:跳到别的位置继续执行举个例子:
mov eax, 5 eax就是cpu中的寄存器的名字
add eax, 3
意思大致是:
把数字 5 放进一个小工作格子里
再给这个格子里的值加上 3
学习汇编语言之前,先了解一些硬件知识,比如
CPU的寄存机,分 COMETII. CPU(模型计算机) 和 Intel CPU(个人计算机) 主要介绍 Intel CPU,
eax、、、、、、和这8个通用寄存器ecxedxebxespebpesiedieflags寄存器也叫“标志寄存器”,包含、、等ZFSFOFZF(Zero Flag,零标志)为1时表示作为计算结果的数值为0;SF(Sign Flag,符号标志)为1时表示数据是负数;OF(Overflow Flag,溢出标志)为1时表示数据溢出(数据无法容纳在容量为32比特的寄存器中)内存并不是一整块模糊的空间,而是按地址一个一个区分开的。程序在运行时,不仅会用到寄存器里的值,也会用到某个地址上的数据,所以了解内存的地址范围,其实就是在了解程序到底是怎么找到数据的。
这样再回头看汇编语言,就会更容易理解,因为很多指令并不是只在“算”,而是在寄存器和内存之间搬运、比较、修改数据。
之所以学习汇编语言之前要先看这些硬件知识,是因为汇编语言不像高级语言那样帮我们把很多细节都藏起来。它更接近 CPU 的工作方式,所以寄存器、标志寄存器、内存地址这些概念,基本都是绕不过去的。
如果前面不先把这些基础概念弄清楚,后面看到指令的时候,就很容易变成只是在记名字,却不知道这些指令到底在和什么东西打交道。