【Linux阅读笔记】LinuxC一站式编程2-数据类型、运算符与汇编基本

目录

      • 数据类型分析
        • 浮点型
        • 类型转换
      • 运算符分析
        • 移位问题
        • 异或运算特性
      • 计算机体系结构
        • MMU 内存管理单元
      • 汇编基本
        • 最简汇编程序
        • 汇编语法分异
        • x86 寄存器
        • 求最值汇编
        • 寻址方式
        • ELF 文件

数据类型分析

浮点型

浮点数在不同平台上实现不同
有的处理器有浮点运算单元(Floating Point Unit,FPU),称为硬浮点(Hard-float)实现
有的处理器没有浮点运算单元,只能做整数运算,需要用整数运算来模拟浮点运算,称为软浮点(Soft-float)实现

在 x86 平台上,大多数编译器实现的 long double 型是 80 位
gcc 实现的 long double 型是 12 字节(96 位)


类型转换

C 中有转换级别机制,以下类型转换级别(Rank)越来越高:char、short、int、long、long long


运算符分析

移位问题

避免不同类型数值赋值操作;
因为 C 语言中不存在 8 位整数的二进制位运算,所有位运算执行之前都被提升为 int 类型

在一定的取值范围内
左移 1 位=乘以 2
右移 1 位=除以 2


异或运算特性

一个数和自己做异或的结果是 0

和 0 做异或保持原值不变,和 1 做异或得到原值的相反值

可用于奇偶校验:例如 a1 ^ a2 ^ a3 ^ … ^ an 的结果是 1,则表示 a1、a2、a3…an 之中 1 的个数为奇数个,否则为偶数个

x ^ x ^ y == y


计算机体系结构

CPU 的核心功能包括这部分

  1. 寄存器:特殊寄存器、通用寄存器
  2. 程序计数器 PC:特殊寄存器,保存着 CPU 取下一条指令的地址
  3. 指令译码器:负责解释从 CPU 中取出的指令对应段的含义(比如内存地址、寄存器编号等等)
  4. 算术逻辑单元 ALU:译码器转换的运算指令给 ALU 进行运算
  5. 地址与数据总线 Bus

内存映射 LO 定义
无论是在 CPU 外部接总线的设备还是在 CPU 内部接总线的设备都有各自的地址范围,都可以像访问内存一样访问


MMU 内存管理单元

MMU 工作原理
CPU 发出获取内存地址请求,此时传递虚拟地址 VA 给 MMU,MMU 将 VA 转换成物理地址 PA 给 CPU 外部的指定芯片引脚

如果 MMU 不工作,那么 CPU 发出的内存地址请求均为 PA,直接对应外部芯片引脚

MMU 管理一张虚拟页表,一一对应物理内存上的物理页表内容
每次 CPU 访问内存时,都会触发 MMU 的查表和地址转换操作


MMU 存在的意义

  • 内存保护机制。MMU 可以拦截不同用户组的请求,根据其拥有的权限选择是否拦截(不转换地址)或者放行(转换地址)
  • 有效避免内核空间和用户空间地址污染,使二者独立

汇编基本

最简汇编程序

汇编程序根据编译器的不同,使用 asm 或者 s 作为后缀;
首先要将汇编源文件使用汇编器翻译成机器指令,生成后缀为 o 的文件,然后再通过链接器编译成可执行文件

.section .data
.section .text
.globl _start

_start:
movl $1,%eax #this is the Linux kerneL command

movl $4,%ebx #this is the status number we wiLL

int $0x80   #this wakes up the kerneL to run

# 汇编中表示单行注释

汇编程序中以.开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,称为汇编指示(Assembler Directive)伪操作(Pseudo-operation)

.section .text section 表示开始划分段的标志,text 表示后续的代码都属于 text 段

.globl 可理解为设置全局变量

_start 汇编程序入口点,必须被设置为全局变量
_start: 在这里开始写主入口程序


movl $1,%eax
movl 其实是 mov+l 的结合,l 表示该变量类型为 long
1 表示立即数 1 ( 1 表示立即数1( 1表示立即数1加任意数字都可以表示一个立即数)
%eax 表示寄存器 eax(所有寄存器都必须加%)

不难得出移位的格式为 movl [立即数],[欲保存到的寄存器]

int $0x80 软中断指令,可使程序故意产生一个异常导致程序终止运行;可以将其视为程序出口点


汇编语法分异

x86 汇编存在两种主流语法:

  1. AT&T 派:数据传送指令 mov 这样写 movl $1,%eax
  2. Lntel 派:数据传输指令这样写 mov eax,edx(寄存器不加%且存取位置互换)
  3. UNLX 平台一般采用 AT&T 语法

x86 寄存器

x86 通用寄存器:eax、ebx、ecx、edx、edi、esi

某些特殊场景下,他们会变得不那么“通用”,此时寄存器会有一个或者多个限制
(比如进行除法运算时)

x86 特殊寄存器:ebp、esp、eip、efLags
efLags 保存着计算过程中产生的标志位
ebp 和 esp 用于维护函数调用的栈帧


求最值汇编

# 定义数据存储段data
.section .data
# 类似于数组名
data_items:
# 定义数组类型,.long表示32位,.byte表示8位
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0

# 主程序段text
.section .text
# 程序入口点与全局变量
.globl _start
_start:
movl $0,%edi    #move 0 into the index register
movl data_items(,%edi,4), %eax # Load the first byte of data
movl %eax,%ebx   #since this is the first item,%eax is

# 循环开始,开头定义一个start_loop
start_loop:
cmpl $0,%eax  # 比较寄存器eax是否等于0,如果为0表示已到末尾,需要跳出循环
je loop_exit  # je即比较,如果上方代码相等,那么跳转到对应标志位

incl %edi   # edi寄存器移到下一位(即加载下一个数据)
movl data_items(,%edi,4), %eax
cmpl %ebx,%eax
jle start_loop # jle(jump if less than or equal)

movl %eax,%ebx
jmp start_loop # jmp是一个无条件跳转指令,类似c语言中的default

# 循环结束,结尾定义一个loop_exit
loop_exit:

movl$1,%eax
int $0x80

寻址方式

访问内存的三个方式:数组基地址、元素长度和下标

内存寻址指令的通用格式:ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER)

几种主要的寻址方式

  • 直接寻址:只能用 ADDRESS_OR_OFFSET 寻址
  • 变址寻址:如 movI data_items (,%edi,4)中的%eax
  • 间接寻址:只使用 BASE_OR_OFFSET 寻址
  • 基址寻址:只使用 ADDRESS_OR_OFFSET 和 BASE_OR_OFFSET 寻址,便于访问结构体成员
  • 立即数寻址
  • 寄存器寻址

ELF 文件

UNIX 可执行文件均采用 ELF 格式,它包含以下三种类型

  • 可重定位的目标文件(Relocatable,或者 Object File)
  • 可执行文件(Executable)
  • 共享库(Shared Object,或者 Shared Library)

程序简易的汇编、链接、运行流程

  1. 编写汇编程序保存为 demo.s 文件
  2. 汇编器读取 demo.s,将源码中的.section 编译为目标文件的 Section
  3. 链接器将目标文件的 Section 汇总为 Segment,生成可执行文件 demo
  4. 加载器根据 Segment 信息加载运行程序!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/13158.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Mysql】分库分表

【Mysql】分库分表 文章目录 【Mysql】分库分表1. 介绍2. 拆分策略2.1 垂直拆分2.1.1 垂直分库2.1.2 垂直分表 2.2 水平拆分2.2.1 水平分库2.2.2 水平分表 3. MyCat3.1 概述 1. 介绍 采用单数据库进行数据存储存在以下瓶颈: IO瓶颈:热点数据太多&#x…

java IO流_1

目录 分类 字节流 InputStream OutputStream 文件拷贝 字符流 FileReader FileWriter 处理流 BufferedReader BufferedWriter 文本拷贝 流是从起源到接受的有序数据,通过流的方式允许程序使用相同的方式来访问不同的输入/输出源。 分类 按数据…

4.26和4.27、selectAPI介绍(4.27、select代码)

4.26和4.27、selectAPI介绍(4.27、select代码) 1.selectAPI介绍①select多路复用流程图②select多路复用缺点 2.select代码使用介绍3.select代码实现①select服务端实现②select客户端实现 1.selectAPI介绍 主旨思想: 首先要构造一个关于文件…

echarts中横坐标显示为time,使用手册

需求: 后端传递(两段数据,不同时间间隔)的24h实时数据,前端需要根据24小时时间展示,要求:x轴为0-24h,每个两小时一个刻度 误区: 刚开始通过二维数据的形式秒点&#xff…

MySQL数据库从入门到精通学习第2天(创建数据库)

创建数据库 通过CREATE DATABASE语句来创建数据库通过CREATE SCHEMA语句来创建数据库通过IF NOT EXISTS进行判断创建 通过CREATE DATABASE语句来创建数据库 创建数据库的语法格式如下: CREATE DATABASE 【数据库名】; 创建数据库的库名跟标识符一样也是有要求的&…

设计模式-结构型模式之桥接模式

2. 桥接模式 2.1. 模式动机 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案: 第一种设计方案是为每一种形状…

android sdl编译

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台。 1 下载SDL源码 http://www.libsd…

这篇把「精准测试」算是讲明白了

作为测试同学,我们经常在工作中会有这样的困惑:我写的用例真的有效且全面吗,我的测试真的做到有效覆盖了吗?回归阶段我到底需要回归什么,回归验证充分吗?这次的改动到底影响范围有多大?针对以上…

从编译器角度理解C++编译和连接原理

C编译链接整体介绍 链接主要工作 1 所有.o文件段的合并,符号表合并后,进行符号解析 链接时就是在符号表中找对应的符号是否只出现于.text或.data段一次,若一次都无,则符号未定义;若出现多次,符号重定义 符…

学习风`宇博客用户权限菜单模块

文章目录 用户-角色-菜单-资源 各表关系图菜单 和 路由菜单表及分析分析 /api/admin/user/menus接口MenuServiceImpl#listUserMenus接口返回示例及分析 前端代码分析menu.jsSideBar.vue 接口权限控制资源表 及 分析分析 WebSecurityConfig权限控制整体流程先说登录UserDetailsS…

行业那么多,为什么计算机领域这么火?

行业那么多,为什么计算机领域这么火? 计算机领域火已经不是一天两天了,从开始的进入互联网时代、到“互联网”、再到大数据、人工智能时代、数字化经济……计算机技术从行业内部的自我发展逐渐渗透到各行各业,甚至成为社会整体经济…

JVM-GC回收机制

目录 1.判定垃圾 1.引用计数 2.可达性分析 2.清理垃圾 1.标记清除 2.复制算法 3.标记整理 4.分代回收 上文讲述的Java运行时内存划分,对于程序计数器,虚拟机栈,本地方法栈来说,生命周期是和线程有关的,随着线程而生,随线程而灭,当方法结束或者线程结束时,它们的内存就自…

【Python_Scrapy学习笔记(十)】基于Scrapy框架的下载器中间件创建代理IP池

基于Scrapy框架的下载器中间件创建代理IP池 前言 本文中介绍 如何基于 Scrapy 框架的下载器中间件创建代理IP池。 正文 1、添加中间件的流程 在 middlewares.py 中新建 代理IP 中间件类在 settings.py 中添加此下载器中间件,设置优先级并开启 2、基于Scrapy框…

软件安全之CRC检测

CRC介绍 在玩某些游戏,例如fps类游戏时,你想要修改某些特定的数值实现一些功能,这时你很有可能会被查封账号甚至禁封机器码。因为你更改了游戏中的数据,从而导致接收方收到”错误的数据“。为尽量提高接收方收到数据的正确率&…

最新版本VSCode配置Python、PyQt5、QtDesigner环境并创建一个ui界面测试

参考链接:最新版本VSCode配置Python、PyQt5、QtDesigner环境并创建一个ui界面测试 一、安装Python3 PyQt5所支持的python版本是从3.5开始的,因此安装的Python3版本必须大于3.5。 我安装的位置是C:\Python\Python38。 参见真小白入门Pyhton的安装 二、安…

项目协同中的git

在远程代码仓库(云效,gitee,github,Coding等)新建一个代码库, 我使用的云效 新建一个develop分支,后续所有人的提交代码都合并到develop分支上面,一般develop分支是用来开发用的&…

NVM-无缝切换Node版本

NVM-无缝切换Node版本 如果未使用nvm之前已经下载了node,并且配置了环境变量,那么此时删除这些配置(Node的环境以及Node软件),使用nvm是为了在某些项目中使用低版本的node NVM下载 进入github的nvm readme: https://github.com/coreybutler/nvm-windows…

1007、1009:与进制问题、输出问题

1007 题目:本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A B * Q R成立 思路:对于数字元素拆分,除法的计算方法用代码实现(唯一一点就是在输出的…

【高危】Apache Spark 权限提升漏洞(CVE-2023-22946)

漏洞描述 Apache Spark 是一款支持非循环数据流和内存计算的大规模数据处理引擎。 使用 spark-submit 脚本在集群中启动任务可以通过指定proxy-user参数限制运行用户。在 Apache Spark 受影响版本中,攻击者通过指定自定义的classpath,则可以覆盖该配置…

homeassistant配置MQTT集成以及传感器实体(STM32连接进入homeassistant)

大家可以看作者的小破站教学视频(如果喜欢的话可以点个关注,给个三联!啊哈哈哈哈哈哈): 【homeassistant配置MQTT集成以及传感器实体(STM32连接进入homeassistant)】 最近homeassistan更新之后…
最新文章