当前位置:网站首页>【精通高并发】深入理解汇编语言基础
【精通高并发】深入理解汇编语言基础
2022-06-25 15:57:00 【华为云】
作者简介:小明的Java问道之路,某大型金融互联网公司后端研发高级工程师,擅长订单/交易领域的高安全/可用/并发/性能的架构设计与落地,专注于研究计算机底层与金融科技领域技术
如果此文还不错的话,还请关注、点赞、收藏三连支持一下博主
本文导读:本篇作为【精通高并发系列】第一章【深入理解计算机原理】这部分分为3篇文章,汇编语言基础(一),C语言基础与汇编下的C语言(二),计算机组成原理和操作系统(三)。本文作为整个系列的开篇为读者讲解机器语言基础,汇编语言基础知识,寄存器的分类与工作原理,文中给出常见的汇编指令方便记忆与查询。
一、汇编语言基础
1.机器语言
在计算机语言最初试机器语言,机器语言就是机器指令的集合,机器指令就是一串形如10100001010的二进制数字,计算机可以直接识别和执行;现在的计算机是通过CPU来完成此处理,CPU由于硬件设计和构造的不同,需要不同的电平脉冲来控制,所有每种CPU有自己的机器指令集(这个机器指令集就是机器语言)
2.汇编语言
汇编语言的主体是汇编指令,汇编是机器指令方便书写的形式,例如,把寄存器bx的内容传送到ax中,机器指令为:1000100111011000,汇编指令:mov ax,bx。
mov(传送的意思,指令写法:MOV target,source),通用寄存器(ax、bx、cx、dx、si、di)
汇编直接面向处理器(CPU),操作的对象是寄存器或者存储器,汇编语言的核心是汇编指令,汇编指令就是机器指令的的易于人类阅读的的形式,然后通过汇编器编译成计算机识别的语言。机器语言在上层抽象出了一层编译器(分层思想)。
汇编语言主要有以下3项组成:
汇编指令:会生成对应的机器码,例如mov等
伪指令:不生成对应的机器码,由编译器执行,计算机不执行,例如 ENTRY伪指令用来告诉编译器的执行入口
其他符号:如+ - * /等,由编译器识别,不生成对应的机器码
3.寄存器
寄存器就是,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)
4.内联汇编
是指在C语言中插入汇编。在Linux中编写汇编常见,后续文章中会见到
5.常见的操作指令
注: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
边栏推荐
- [Third Party framework] retrofit2 (2) - add point configuration of network access framework
- Understanding of reflection part
- Precautions for function default parameters (formal parameter angle)
- Bypass technology to talk about 'cross end'
- 数据存储和传输文件之XML使用和解析详解
- 1-8Vmware中的文件共享
- 数字经济时代文化消费新特征
- Final, override, polymorphic, abstract, interface
- 10 Super VIM plug-ins, I can't put them down
- 一行代码可以做什么?
猜你喜欢

Stop "outsourcing" Ai models! The latest research finds that some "back doors" that undermine the security of machine learning models cannot be detected

加密潮流:时尚向元宇宙的进阶

使用hbuilder X创建uniapp项目

Navicat Premium 15 for Mac(数据库开发工具)中文版

Lifeifei's team applied vit to the robot, increased the maximum speed of planning reasoning by 512 times, and also cued hekaiming's MAE

The third day of mysql45

What plug-ins are available for vscade?

1-8Vmware中的文件共享

error Parsing error: Unexpected reserved word ‘await‘.

10 Super VIM plug-ins, I can't put them down
随机推荐
Function and implementation of closures
一行代码可以做什么?
What can NFT metauniverse development do?
GO语言-什么是临界资源安全问题?
About: encryption and decryption of rsa+aes data transmission [chapter], project practice (special summary)
数据存储和传输文件之XML使用和解析详解
Generate post order traversal according to pre order traversal and mid order traversal
About the use of Aidl, complex data transmission
Resolve the format conflict between formatted document and eslint
Dart syntax
Nsurlsession learning notes (III) download task
error Parsing error: Unexpected reserved word ‘await‘.
10款超牛Vim插件,爱不释手了
Alvaria宣布客户体验行业资深人士Jeff Cotten担任新首席执行官
Flutter textfield setting can input multiple lines
What are some tricks that novice programmers don't know?
Alvaria announces Jeff cotten, a veteran of the customer experience industry, as its new CEO
Data type variable operator
flutter
The database records are read through the system time under the Android system, causing the problem of incomplete Reading Records!