【好书解读】解读《汇编语言》一书

简介: 学习汇编语言的目的就是通过汇编语言进行深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的。

✌ 作者简介:小明的Java问道之路,某大型金融互联网公司,后端研发高级工程师,擅长订单/交易领域的高安全/可用/并发/性能的架构设计与落地,专注于研究计算机底层与金融科技领域技术

🏆 CSDN博客专家/Java领域新星创作者、系统架构设计师

🔥 如果此文还不错的话,还请关注、点赞、收藏三连支持一下博主

本文导读学习汇编语言的目的就是通过汇编语言进行深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的。

学习汇编语言的目的就是通过汇编语言进行深入地理解计算机底层的基本工作机理,达到可以随心所欲地控制计算机的目的。


一、汇编语言、机器语言与冯诺依曼体系结构

机器语言,就是0100110的二进制串

image.png


汇编语言,用来于硬件沟通,是英文代码

冯诺依曼体系结构:

1、运算器:运算单元,保存临时数据

2、控制器:控制单元

3、输入输出

4、存储器:寄存器组,用来保存指令和数据(为了加快运行速度)。寄存器按功能命名


image.png

EAX: Accumulator for operands and results data 操作数和结果数据累加器

EBX: Pointer to data in the DS segment 指向DS段中数据的指针

ECX: Counter for string and loop operations字符串和循环操作的计数器

EDX: I/O pointer I0指针

ESI: Pointer to data in the segment pointed to by the DS register; source pointer for string operations 指向DS寄存器所指向段中数据的指针,,字符串操作原指针

EDI: Pointer to data (or destination) in the segment pointed to by the ES register; destination pointer for string operations 指向ES寄存器所指向段中数据的指针,字符串操作目标指针

ESP: Stack pointer (in the SS segment) 栈指针( SS段中)

EBP: Pointer to data on the stack (in the SS segment) 指向栈上数据的指针( SS段中)

image.png


在计算机初创时代,涉及到一个问题?基础存储单元多少位最合适?8位,所以在8086时代,一个通用寄存器占16位, 8080时代是8位。 为了兼容8080,16可以拆位两个8位,同理32位可以拆违两个16位。ax(al低8位ah高8位) e(extra)ax (高16位低16位) rax=16 32 64,数据是从高到低还是低到高引入了字节序。


二、汇编语言相关硬件结构

汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。在本节中,对硬件系统结构的问题进行探讨

存储器:CPU是计算机的核心部件,它控制整个计算机的运作并进行运算,要想让一个CPU 工作,就必须向它提供指令和数据。指令和数据在存储器中存放,也就是平时所说的内存。磁盘不同于内存,磁盘上的数据或程序如果不读到内存中,就无法被CPU使用。

存储器相当于语言中的数组,下标从0开始,每一个元素为1字节;

image.png


寄存器:简单的讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。

CPU对存储器的读写:CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行三类信息的交互:一、我要干啥:读还是写命令(控制信息);二、我要的东西在哪:地址总线,存储单元的地址(地址信息);三、我的东西要放哪:数据总线,读或写的数据(数据信息)

那么CPU是通过什么将地址、数据和控制信息传到存储芯片中的呢?电子计算机能处理、传输的信息都是电信号,电信号要用导线传送。

在计算机中专门有连接CPU和其他芯片的导线,通常称为总线,物理上是一根根导线的集合,逻辑上分为地址总线、数据总线、控制总线

image.png


内存地址空间:一个CPU的地址线宽为10,那么可以寻址1024个内存单元,这1024个内存单元就构成CPU的内存地址空间。CPU对存储器进行读写的时候都通过控制总线发出读写命令。

对CPU来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。

主板:PC机有一块主板,主板有核心器件和主要器件,这些器件通过总线(地址总线、数据总线、控制总线)相连


三、CPU工作原理(寄存器)

CPU概述:一个类型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线连接,内部总线实现CPU内部各个器件之间的联系。外部总线实现CPU和主板上其它器件的联系。

寄存器概述:8086CPU所有的寄存器都是16位的,可以存放两个字节。8086CPU有14个寄存器,AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW

CS和IP是8086CPU中最关键的寄存器,他们知识了CPU当前要读取指令的地址

CS:代码段寄存器(存放段地址,一个段寄存器16位、一个PC计数器是16位),IP代码段+IP偏移=指令地址

IP:指令指针寄存器(存放指针的偏移地址)

AX、BX、CX、 DX通常用来存放一般性数据被称为通用寄存器。

DS:寄存器,通常用来存放要访问的数据的段地址。

SS、 SP指示栈顶:改变SP后写内存的入栈指令;读内存后改变SP的出栈指令。

SI和DI是8086CPU中和bx功能相近的寄存器,SI和DI不能够分成两个8位寄存器来使用。

8086PC工作过程

1、从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;2、IP= IP +所读取指令的长度,从而指向下一条指令;3、执行指令,跳转1并重复


四、一些简单地汇编指令

mov指令的几种形式:

mov 寄存器,数据

mov 寄存器,寄存器

mov 寄存器,内存单元

mov 内存单元,寄存器

mov 段寄存器;寄存器

push寄存器:将一个寄存器中的数据入栈

pop寄存器:出栈,用一个寄存器接收出栈的数据

相关文章
|
10月前
|
存储 编译器 程序员
汇编语言与微机原理(1)基础知识
汇编语言与微机原理(1)基础知识
153 1
|
Java 程序员 编译器
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
91 0
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
|
算法 C语言
c语言程序设计 编程题
8.求年龄:有 5 个人坐在一起,问第 5 个人多少岁,他说比第 4 个人大 2 岁。问 第 4 个人多少岁,他说比第 3 个人大 2 岁。问第 3 个人多少岁,他说比第 2 个 人大 2 岁。问第 2 个人多少岁,他说比第 1 个人大 2 岁。最后问第 1 个人,他 说是 10 岁。请问第 5 个人多大? #include <stdio.h> int age(int n) { if (n == 1) return 10; return age(n - 1) + 2; } void main() { printf("%d", age(5)); } 9.猴子吃桃问题:猴子第一天摘下若干个
79 0
|
机器学习/深度学习 C语言
c语言程序设计 编程题
20.求数字:输出 100(含 100)-200(含 200)以内的满足以下条件的数,条件 为:这个数与 3 的和是 5 的倍数,与 3 的差是 6 的倍数,输出这样的数。 #include <stdio.h> void main() { int i; for (i = 100; i <= 200; i++) if ((i + 3) % 5 == 0 && (i - 3) % 6 == 0) printf("%d,", i); } 21.求数字:找出乘积为 399 的两个相邻奇数。 #include <stdio.h> void main() { int i = 1; whil
115 0
|
人工智能 BI C语言
编程题-C 语言程序设计
10.求年份:输出 2000(含 2000)-2020(含 2020)之间所有的闰年年份。 #include <stdio.h> void main() { int y; for (y = 2000; y <= 2020; y++) if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) printf("%d,", y); } 11.求数字:求两个整数的最大公约数及最小公倍数。 #include <stdio.h> /* 最大公约数 */ int gcd(int a, int b) { int t; if (a < b) { t
64 0
|
编译器 程序员 C语言
程序员需要了解的硬核知识之汇编语言(全)(一)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。
113 0
程序员需要了解的硬核知识之汇编语言(全)(一)
|
编译器 程序员 C语言
程序员需要了解的硬核知识之汇编语言(一)(上)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。
75 0
程序员需要了解的硬核知识之汇编语言(一)(上)
|
存储 程序员 编译器
程序员需要了解的硬核知识之汇编语言(一)(下)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。
122 0
程序员需要了解的硬核知识之汇编语言(一)(下)
|
存储 程序员 编译器
程序员需要了解的硬核知识之汇编语言(全)(二)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。
56 0
程序员需要了解的硬核知识之汇编语言(全)(二)
|
存储 编译器 程序员
程序员需要了解的硬核知识之汇编语言(全)(三)
之前的系列文章从 CPU 和内存方面简单介绍了一下汇编语言,但是还没有系统的了解一下汇编语言,汇编语言作为第二代计算机语言,会用一些容易理解和记忆的字母,单词来代替一个特定的指令,作为高级编程语言的基础,有必要系统的了解一下汇编语言,那么本篇文章希望大家跟我一起来了解一下汇编语言。
114 0
程序员需要了解的硬核知识之汇编语言(全)(三)