写点什么

【精通内核】深入理解汇编语言

  • 2022 年 8 月 17 日
    上海
  • 本文字数:2028 字

    阅读完需:约 7 分钟

前言

📫作者简介小明java问道之路,专注于研究计算机底层/Java/Liunx 内核,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计📫 

🏆CSDN 专家博主/Java 领域优质创作者、阿里云专家/签约博主、InfoQ 签约博主、华为云专家、51CTO 专家🏆

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


本文导读

本篇作为【精通高并发系列】第一章【深入理解计算机原理】这部分分为 3 篇文章,汇编语言基础(一),C 语言基础与汇编下的 C 语言(二),计算机组成原理和操作系统(三)。

本文作为整个系列的开篇为读者讲解机器语言基础,汇编语言基础知识,寄存器的分类与工作原理,文中给出常见的汇编指令方便记忆与查询。

一、机器语言

在计算机语言最初试机器语言,机器语言就是机器指令的集合,机器指令就是一串形如 10100001010 的二进制数字,计算机可以直接识别和执行;现在的计算机是通过 CPU 来完成此处理,CPU 由于硬件设计和构造的不同,需要不同的电平脉冲来控制,所有每种 CPU 有自己的机器指令集(这个机器指令集就是机器语言)

二、汇编语言

汇编语言的主体是汇编指令,汇编是机器指令方便书写的形式,例如,把寄存器 bx 的内容传送到 ax 中,机器指令为:1000100111011000,汇编指令:mov ax,bx。mov(传送的意思,指令写法:MOV  target,source),通用寄存器(ax、bx、cx、dx、si、di)

汇编直接面向处理器(CPU),操作的对象是寄存器或者存储器,汇编语言的核心是汇编指令,汇编指令就是机器指令的的易于人类阅读的的形式,然后通过汇编器编译成计算机识别的语言。机器语言在上层抽象出了一层编译器(分层思想)。

汇编语言主要有以下 3 项组成:汇编指令:会生成对应的机器码,例如 mov 等伪指令:不生成对应的机器码,由编译器执行,计算机不执行,例如 ENTRY 伪指令用来告诉编译器的执行入口其他符号:如+ - * /等,由编译器识别,不生成对应的机器码

三、寄存器

寄存器就是,CPU 在执行程序时需要读取数据和存储数据,这是需要存储数据的区域,这个区域在 CPU 中被称为寄存器,也就是内存中的变量、地址、指令等信息都需要背加载进寄存器中,然后 CPU 才能读取和执行(寄存了内存中的数据)

这里我对 8086CPU(16 位)进行寄存器类别的分析,通用寄存器、指针寄存器、变址寄存器、控制寄存器、段寄存器

通用寄存器用于存储普通数据,可以存储任何数据 AX:16 位累加寄存器,分为 AL 和 AH,低 8 位构成 AL 寄存器,高 8 位构成 AH 寄存器 BX:16 位基地址寄存器,分为 BL 和 BH,低 8 位构成 BL 寄存器,高 8 位构成 BH 寄存器 CX:16 位技术寄存器,分为 CL 和 CH,低 8 位构成 CL 寄存器,高 8 位构成 CH 寄存器 DX:16 位数据寄存器,分为 DL 和 DH,低 8 位构成 DL 寄存器,高 8 位构成 DH 寄存器

指针寄存器用于保存指针,即某个地址值。指针用于指向内存中的某个地址信息,通过指针寄存器,我们可以获取内存中的值 SP:16 位堆栈指针寄存器,栈指针寄存器指向栈顶 BP:16 基指针寄存器,SP 指向栈顶,BP 指向栈底

变址寄存器,在 8086 中源变址寄存器有两个 SI 寄存器和 DI 寄存器,他们分别用于基址变址寻址和相对变址寻址,也就是,有效地址要由一个基址地址寄存器和一个变址寻址寄存器一起确定最终要访问的内存。SI:16 位源变址寄存器 DI:16 位目的变址寄存器

控制寄存器 IP:指令指针寄存器,在 CPU 中,相当于 JVM 的 PC 计数器,用于指明要获取那一条数据

段寄存器 8086 的 CPU 地址总线有 20 位,寄存器只有 16 位,如何用 16 位表示 20 位的寄存器,我们知道 2^16byte 是 64KB,2^20byte 是 1M,这里将段寄存器左移 4 位,就生成了 20 位的地址,高 4 位指明某个段,低 14 位保存 IP 的 16 位地址,从而实现 1M 的寻址地址空间。IP 的 16 位地址就被称为偏移地址,所以通常使用段地址为 CS,段内偏移地址为 IP 地址,使用 CS:IP 的方式可指明完整的 20 位地址,CS 是代码段寄存器,IP 是指向指令的寄存器,这里 CPU 通过 CS:IP 的地址找到下一条要执行的指令地址,并将它传送至 CPU 中执行。CS:代码段寄存器,指向程序代码段(code segment)DS:数据段寄存器,指向程序数据段(data segment)SS:堆栈段寄存器,指向程序堆栈段(stack segment)ES:附加段寄存器(extra segment)

四、内联汇编

是指在 C 语言中插入汇编。在 Linux 中编写汇编常见,后续文章中会见到

五、常见的操作指令

注:intel 官网有详细的指令集介绍

通用传送指令:MOV、XCHG、PUSH、POP

算数运算指令:INC、DEC、MUL、DIV、ADD.....

逻辑运算指令:NOT、AND、OR、XOR、TEST

重复指令:REP、REPE/REPZ、PEPNE/PEPNZ

转移指令:JMP、JA/JNBE、JAE/JNB、JB/JNAE、TEB......

循环指令:LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE、JCXZ、CALL

方法调用指令:CALL、RET

地址传送指令:LEA、LDS

输入输出指令:IN、OUT

总结

本文作为整个系列的开篇为读者讲解机器语言基础,汇编语言基础知识,寄存器的分类与工作原理,文中给出常见的汇编指令方便记忆与查询。

发布于: 2022 年 08 月 17 日阅读数: 24
用户头像

🏆InfoQ签约作者/技术专家/博客专家 2020.03.20 加入

🏆InfoQ签约博主、CSDN专家博主/Java领域优质创作者、阿里云专家/签约博主、华为云专家、51CTO专家/TOP红人 📫就职某大型金融互联网公司高级工程师 👍专注于研究Liunx内核、Java、源码、架构、设计模式、算法

评论

发布
暂无评论
【精通内核】深入理解汇编语言_指令集_小明Java问道之路_InfoQ写作社区