当前位置: 首页 > news >正文

关于ARM和汇编语言

一图流

 ARM

计算机组成

  • 输入设备

  • 输出设备

  • 存储设备

  • 运算器

  • 控制器

处理器读取内存程序执行的过程

  • 取指阶段:控制器器通过地址总线向存储器发送想要获取的指令的地址编号,存储器将指定的指令发送给处理器

  • 译码阶段:控制器对指令进行分析和译码,确定当前指令的作用

  • 执行阶段:控制器通知运算器进行对应的指令运算

指令

  • 机器指令:我们为处理器的每一种运算设置了一条机器指令,机器指令又被称为机器码,由多个0和1组成

  • 汇编指令:将每一条汇编指令理解为一条机器指令的封装形式,当一条汇编指令被编译后,就得到一条机器指令,执行后让处理器进行对应的运算操作

指令集

概念

  • 指令的集合

  • 不同的指令集可以被当作设计不同处理器内核的架构

  • 一般在设计一个内核时会预先将这个处理器内核可以进行的运算的指令设计出来,把这些指令组成一个指令集,按照这个指令集设计这个内核

复杂指令集(CISC)

  • 看重当前处理器的处理能力,将所有能够进行的运算操作的指令组成一个指令集,这种指令集就是复杂指令集

  • 优点:功能强大

  • 缺点:功耗、成本、体积都高

  • 特点

    • 每一条指令的长度不固定

    • 每一条指令的执行周期也不固定

复杂指令集(CISC)

  • 追求功能的特定性,将使用频度最高,比较简单的指令组成指令集

  • 精简指令集优点:开发成本低、功耗低

  • 缺点:实现的功能简单

  • 特点

    • 指令的大小固定

    • 指令的执行周期固定

常见的精简指令集架构

  • ARM架构:ARM公司设计的精简指令集架构,使用的最多

  • RISC-V架构:开源,未来会火

  • MIPS架构:中国龙芯收购,完全垄断

ARM架构

  • ARMV1-ARMV6 //基本不被使用

  • ARMV7:32位处理器架构 支持32位指令集

  • ARMV8:64位处理器架构,支持64位指令集,向下兼容32位指令集

  • ARMV9:64位处理器架构,支持64位指令集

ARM v7架构处理器的工作模式

  • User : 非特权模式,大部分任务执行在这种模式

  • FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式

  • IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式

  • Supervisor(SVC) :当复位或软中断指令执行时将会进入这种模式

  • Abort : 当存取异常时将会进入这种模式

  • Undef : 当执行未定义指令时会进入这种模式

  • System : 使用和User模式相同寄存器集的特权模式

ARMv7架构的寄存器组织

概述

  • 不同工作模式下使用的内核中的寄存器是不一样的

  • 不算MON和HYP模式,用户可操作的寄存器总共有37

  • 每一个寄存器的大小都是4字节

寄存器

  • R0-R12用来保存基本的操作数据和运算的数据

  • R13寄存器

    • 栈指针寄存器(STACK POINTER/sp)

    • sp寄存器保存该模式下栈内存栈顶地址,用于进行栈内存读写

  • R14寄存器

    • 链接寄存器(link register/LR)

    • 链接寄存器是用于特定程序跳转场景下用于保存程序的返回地址

  • R15寄存器

    • 程序计数器(program counter/PC)

    • PC寄存器中保存马上要被取指的指令地址

    • 当PC保存的地址执行后,PC的数值会自动向下加一条指令的大小

    • 实现程序跳转的本质就是修改PC的值

  • SPSR寄存器(saved program status register)

    • 被保存的程序状态寄存器

    • 当处理器因为各种异常切换到异常模式工作时会将CPSR值提前保存到SPSR中,处理器处理完异常之后会将SPSR的值赋值给CPSR,用于恢复处理器的工作状态

  • CPSR寄存器(current program status register)

    • 记录当前程序状态寄存器

    • 工作状态中包含程序的工作模式、中断禁止位以及程序的运算结果条件位等信息

状态寄存器        

  • N[31] : 指令的运行结果为负数时,N位被自动置1,否则为0

  • Z[30] : 指令的运行结果为零时,Z位被自动置1,否则为0.

  • C[29] :

    • 加法:加法运算如果产生进位,C位被自动置1,否则为0.

    • 32位指令:低32位向高32位进位

    • 减法:减法运算如果产生借位,C位被自动清0,否则位1.

    • 32位指令:低32位向高32位借位

  • V[28] : 符号位发送变化,V位被自动置1,否则清0.

  • I[7] : IRQ中断屏蔽位

    • I = 0 : 不屏蔽IRQ中断

    • I = 1 : 屏蔽IRQ中断

  • F[6] : FIQ中断屏蔽位

    • F = 0 : 不屏蔽FIQ中断

    • F = 1 : 屏蔽FIQ中断

  • T[5] : 状态位

    • T = 0 : 表示ARM状态,执行的是ARM指令集

    • T = 1 : 表示Thumb状态,执行的是Thumb指令集

    • ARM指令集 : 一条汇编指令编译生成32位的机器码

    • thumb指令集:一条汇编指令编译生成16位的机器码

    • ARM指令集的代码的密度低,而thumb指令记得代码密度高

    • ARM指令集的功能性要高于Thumb指令集

  • M[4:0] : 模式位

    • 10000 User mode

    • 10001 FIQ mode;

    • 10010 IRQ

    • 10011 SVC mode;

    • 10111 Abort mode;

    • 11011 Undfined mode;

    • 11111 System mode;

    • 10110 Monitor mode;

数据汇编指令

基本格式

  • <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

  • 解释:如果满足 cond 条件,则让 Rn 和 shifter_operand 进行 opcode 操作,如果写了 s 则在运算结束后影响 CPSR 寄存器

  • 参数

    • opcode:指令功能码,表示当前指令

    • cond:条件码,可写可不写,在指令执行之前先判断条件是否满足,不满足则不执行

    • s:可写可不写,如果在指令码后面加了一个s,则进行运算时会影响到CPSR条件位

    • Rd:目标寄存器

    • Rn:第一操作寄存器

    • shifter_operand:第二操作数

  • 注意

    • 第一操作寄存器只能是寄存器,不能是数值

    • 第二操作数可以为寄存器,也可以为数值,如果为数值,需要在前面加上#

    • 汇编指令不区分大小写

数据处理指令

数据搬移指令

  • mov {条件码} 目标寄存器 操作数

    • 将操作数搬移到目标寄存器中

  • mvn {条件码} 目标寄存器 操作数

    • 将操作数先取反,再搬移到目标寄存器中

  • 注意

    • 以上两个操作指令只能搬移立即数

    • 如果需要搬移非立即数可以使用ldr

      • ldr 目标寄存器,=数据

      • 从内存中寻找=数据的值放到目标寄存器中

立即数

        一个32位指令空间中预留了12位保存操作数,可以通过某一个规则对操作数进行处理,将处理后的数值存放在这个12位空间中,所以处理完能够保存到12位空间中的数据就是立即数,否则不是

规则
  • 将操作数循环右移偶数位 ,如果能够得到一个0-255内的数据,就说明这个数据是一个立即数

  • 反过来,得到的数据循环右移偶数位,也可以得到操作数

  • 指令中操作数的12位空间分为低8位和高4位,低8bit保存循环右移得到操作数的那个0-255内的数字

  • 高4位保存0-255内的数据循环右移的偶数位/2

数据移位指令

  • lsl{条件码} 目标寄存器,第一操作寄存器,第二操作数

    • 将第一操作寄存器的数据逻辑左移第二操作数位,然后放到目标寄存器

  • lsr{条件码} 目标寄存器,第一操作寄存器,第二操作数

    • 将第一操作寄存器的数据逻辑右移第二操作数位,然后放到目标寄存器

  • ror{条件码} 目标寄存器,第一操作寄存器,第二操作数

    • 将第一操作寄存器的数据循环右移第二操作数位,然后放到目标寄存器

  • 注意

    • 可以将其写成c语言风格

    • 例:LSL R1,R0,#(0X1<<2),及那个R0的数据逻辑左移2位放到R1中

位运算指令

  • and{条件码} 目标寄存器,第一操作寄存器,第二操作数

    • 将第一操作寄存器的数和第二操作数进行与运算,然后放到到目标寄存器中

  • orr{条件码} 目标寄存器,第一操作寄存器,第二操作数

    • 将第一操作寄存器的数和第二操作数进行或运算,然后放到到目标寄存器中

  • eor{条件码} 目标寄存器,第一操作寄存器,第二操作数

    • 将第一操作寄存器的数和第二操作数进行异或运算,然后放到到目标寄存器中

  • mvn,按位取反

  • bic{条件码} 目标寄存器,第一操作寄存器,第二操作数

    • 将第一操作寄存器的数和第二操作数的取反值进行与运算,结果保存到目标寄存器中

算数运算符指令

  • add{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

    • 目标寄存器=第一操作寄存器+第二操作数

  • adc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

    • 目标寄存器=第一操作寄存器+第二操作数+CPSR寄存器c位的值

  • sub{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

    • 目标寄存器=第一操作寄存器-第二操作数

  • sbc{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

    • 目标寄存器=第一操作寄存器-第二操作数-cpsr寄存器c位的取反值

  • mul{条件码}{s} 目标寄存器,第一操作寄存器,第二操作数

    • 目标寄存器=第一操作寄存器*第二操作数

  • 32位寄存器运算64位数

    • 32位处理器一条指令能运算32位数据,要进行64位数据运算,要多条指令

    • 遵守原则

      • 低32位进行运算,运算的结果影响到CPSR条件位

      • 高32位数据进行运算,运算结果考虑到cpsr条件位

比较指令

  • cmp 第一操作寄存器,第二操作数

    • 将第一操作数和第二操作寄存器进行比较,本质是进行减法运算,然后影响CPSR的位

    • 所以通常会跟这条件码混用

  • tst 目标寄存器,#(0X1<<N)

    • 这个指令用来判断目标寄存器的第N位是否为0,然后影响CPSR的Z位

  • TEQ 目标寄存器,第二操作数

    • 判断目标寄存器的值是否和第二操作数相等,并只能影响CPSR寄存器的z位,无法影响c和v位

跳转指令

  • b 标签

    • 跳转到指定的标签下,跳转后LR寄存器不保存程序返回地址

  • bl 标签

    • 跳转到指定的标签下,跳转后LR寄存器保存程序返回地址

内存读写指令

str

  • str 目标寄存器,[目标地址]

    • 将目标寄存器中4字节数据写入到目标地址对应的内存中

  • strh 目标寄存器,[目标地址]

    • 将目标寄存器中2字节数据写入到目标地址对应的内存中

  • strb 目标寄存器,[目标地址]

    • 将目标寄存器中1字节数据写入到目标地址对应的内存中

ldr

  • ldr 目标寄存器,[目标地址]

    • 从目标地址对应的内存中读取4字节数据保存到目标寄存器中

  • ldrh 目标寄存器,[目标地址]

    • 从目标地址对应的内存中读取2字节数据保存到目标寄存器中

  • ldrb 目标寄存器,[目标地址]

    • 从目标地址对应的内存中读取2字节数据保存到目标寄存器中

寄存器内存读写地址索引

前索引
  • str 目标寄存器,[基地址,偏移量]

    • 将目标寄存器的数据写入到基地址+偏移量的地址中

  • ldr 目标寄存器,[基地址,偏移量]

    • 从基地址+偏移量的地址中读取数据保存到目标寄存器中

后索引(数据先保存,地址再加加)
  • str 目标寄存器,[基地址],偏移量

    • 将目标寄存器的数据写入到基地址的内存中,然后基地址增加偏移量大小

  • ldr 目标寄存器,[基地址],偏移量

    • 从基地址内存中读取数据保存到目标寄存器中,,然后基地址增加偏移量大小

自动索引(地址先加加,再保存到地址)
  • str 目标寄存器,[基地址,偏移量]!

    • 先将基地址自增偏移量大小,再将目标寄存器的数据写入到基地址的内存中

  • ldr 目标寄存器,[基地址,偏移量]!

    • 先将基地址自增偏移量大小,再从基地址内存中读取数据保存到目标寄存器中

批量寄存器内存读写

基地址不变
  • stm 基地址,{寄存器列表}

    • 将寄存器列表中所有寄存器的数据都写入到基地址为首地址的内存中

  • ldm 基地址,{寄存器列表}

    • 从基地址开始往下读取数据,保存到寄存器列表中的每一个寄存器中

  • 注意

    • 寄存器列表可以不连续,但是他始终是从小到大写或读

基地址往大增长
先操作,在增长
  • stmia 基地址!,{寄存器列表}

    • 先向基地址对应的内存中写入一个数据,基地址往大地址方向增长

  • ldmia 基地址!,{寄存器列表}

    • 先读取基地址对应内存的数据,基地址往大地址方向增长

 先增长,再操作
  • stmib 基地址!,{寄存器列表}

    • 基地址往大地址方向增长 再向基地址对应的内存中写入一个数据

  • ldmib 基地址!,{寄存器列表}

    • 先基地址往大地址方向增长,再读取基地址对应内存的数据

基地址往小减少
先操作,再减少
  • stmda 基地址!,{寄存器列表}

    • 先向基地址对应的内存中写入一个数据,基地址往小地址方向增长

  • ldmda 基地址!,{寄存器列表}

    • 先读取基地址对应内存的数据,基地址往小地址方向增长

先减少,在操作
  • stmdb 基地址!,{寄存器列表}

    • 基地址往小地址方向增长 再向基地址对应的内存中写入一个数据

  • ldmdb 基地址!,{寄存器列表}

    • 先基地址往小地址方向增长,再读取基地址对应内存的数据

栈内存读写

栈区是一段指定好的内存空间,一般用来保存临时数据,SP寄存器保存栈顶地址

栈的分类
  • 空栈(EA):压栈完毕后,SP保存的栈顶地址空间中没有有效数据

  • 满栈(ED):压栈完毕后,SP保存的栈顶地址空间中有有效数据

  • 增栈(FA):每次压栈一个数据,SP保存的栈顶地址往大地址增长

  • 减栈(FD):每次压栈一个数据,SP保存的栈顶地址往小地址增长

  • ARM默认使用满减栈

栈的实现
  • 按照ARM默认的方式进行压栈和出栈

    • push {寄存器列表}

    • pop {寄存器列表}

  • 使用批量寄存器的命令实现

  • 使用栈的专属后缀

状态寄存器传送指令

  • MRS 目标寄存器,CPSR

    • 读取CPSR寄存器数值,保存到目标寄存器

  • MSR CPSR,操作数

    • 修改CPSR寄存器的数值为操作数

  • 注意

    • 可以在特权模式下通过修改CPSR数值切换到USER模式

    • 无法在useR模式下修改CPSR数值切换到特权模式,如果想要进入特权模式,需要发生对应的特权事件

异常产生指令

软中断

  • swi 操作数

    • 操作数是一个立即数,这个操作数就是产生的软中断的中断号

异常模式和异常源

  • 异常模式:当处理器发生异常后进入的工作模式

  • 异常源:引发处理器产生异常的源头

  • 五种异常模式,七种异常源

异常的处理过程

处理器发生异常后,会自动进行四大步三小步工作,处理异常

四大步三小步

  • 保存CPSR数值到对应异常模式的SPSR寄存器中

  • 修改CPSR数值

    • 修改模式位为对应的异常模式 [4:0]

    • 修改工作状态为ARM状态 [5]->0

    • 根据当前异常的优先级禁用中断[7:6]

  • 保存程序的返回地址到异常模式的LR寄存器中

  • 修改PC的值到对应异常在异常向量表中的位置

异常的返回(需要手动返回)

  • 将异常模式下的SPSR数值赋值给CPSR,恢复程序的状态

  • 将异常模式下LR的数值赋值给PC,恢复程序执行的位置

伪操作

  • 能够在程序编译过程中起到编译引导作用的内容

  • .text .global .if .else .endif.....

  • 伪操作不占用指令内存

伪指令

不是汇编指令,但是可以起到指令的作用,伪指令也会占用一定内存空间

注释

  • 不同汇编的注释方式不同

  • 单行注释: @ ;

  • 多行注释: /* */

混合编程

意义

  • 混合编程就是c语言资源和汇编资源的相互调用

  • 一般工程会有汇编启动程序,启动程序完成堆栈的相关初始化,完毕之后才跳转到c语言的main函数

  • c语言中几乎不可以直接操作寄存器,但是有些特定场景下需要c中操作寄存器,这时候就需要c语言中嵌套汇编的语法

概述

  • 要想实现C和汇编的混合编程必须遵循ATPCS规范

  • 将汇编的标签当作C语言的函数使用

  • 将C语言的函数当作汇编的标签使用

  • 函数参数的传递采用R0-R3进行传递,如果参数的个数大于4个通过压栈的方式进行传递

  • 函数的返回值通过R0返回,如果函数的返回值大于4个字节通过r0-r1返回

  • ATPCS规范中规定ARM采用满减栈

汇编和C语言互相调用

  • 汇编调用C语言的函数

    • 将C语言的函数当作汇编的标签使用

  • c语言调用汇编标签

    • 将汇编的标签当作c语言的函数

  • c语言内联汇编

    • 在某一些特定的场景下需要在c语言中直接使用汇编的语法,此时需要内联汇编。内联汇编的实现需要通过asm关键字进行修饰

    • 格式

相关文章:

关于ARM和汇编语言

一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段&#xff1a;控制器器通过地址总线向存储器发送想要获取的指令的地址编号&#xff0c;存储器将指定的指令发送给处理器 译码阶段&#xff1a;控制器对指令进行分…...

2024人工智能AI+制造业应用落地研究报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p39068 本报告合集洞察深入剖析当前技术应用的现状&#xff0c;关键技术 创新方向&#xff0c;以及行业应用的具体情况&#xff0c;通过制造业具体场景的典型 案例揭示人工智能如何助力制造业研发设计、生产制造、运营管理 和产品服…...

QTableView和QTableWidget的关系与区别

QTableView 和 QTableWidget 都是 Qt 框架中用于显示表格数据的控件&#xff0c;但它们在设计和使用上有一些重要的区别。 QTableView 模型-视图架构&#xff1a;QTableView 是 Qt 模型-视图架构的一部分&#xff0c;它与模型&#xff08;如 QStandardItemModel 或自定义的 QA…...

Java导出通过Word模板导出docx文件并通过QQ邮箱发送

一、创建Word模板 {{company}}{{Date}}服务器运行情况报告一、服务器&#xff1a;总告警次数&#xff1a;{{ServerTotal}} 服务器IP:{{IPA}}&#xff0c;总共告警次数:{{ServerATotal}} 服务器IP:{{IPB}}&#xff0c;总共告警次数:{{ServerBTotal}} 服务器IP:{{IPC}}&#x…...

ESP8266 MQTT服务器+阿里云

MQTT私有平台搭建&#xff08;EMQX 阿里云&#xff09; 阿里云服务器 EMQX 搭建私有MQTT平台 1、搜索EMQX开源版本 2、查看各版本EMQX支持的UBUNTU版本 3、查看服务器Ubuntu版本 4、使用APT安装模式 5、按照官网指示安装并启动 6、下载安装MQTTX测试工具 7、设置云服务…...

css动画水球图

由于echarts水球图动画会导致ios卡顿&#xff0c;所以纯css模拟 展示效果 组件 <template><div class"water-box"><div class"water"><div class"progress" :style"{ --newProgress: newProgress % }"><…...

【设计模式-行为型】状态模式

一、什么是状态模式 什么是状态模式呢&#xff0c;这里我举一个例子来说明&#xff0c;在自动挡汽车中&#xff0c;挡位的切换是根据驾驶条件&#xff08;如车速、油门踏板位置、刹车状态等&#xff09;自动完成的。这种自动切换挡位的过程可以很好地用状态模式来描述。状态模式…...

2024.1.22 安全周报

政策/标准/指南最新动态 01 工信部印发《关于加强互联网数据中心客户数据安全保护的通知》 原文: https://www.secrss.com/articles/74673 互联网数据中心作为新一代信息基础设施&#xff0c;承载着千行百业的海量客户数据&#xff0c;是关系国民经济命脉的重要战略资源。…...

idea修改模块名导致程序编译出错

本文简单描述分别用Idea菜单、pom.xml文件管理项目模块module 踩过的坑&#xff1a; 通过idea菜单创建模块&#xff0c;并用idea菜单修改模块名&#xff0c;结构程序编译报错&#xff0c;出错的代码莫名奇妙。双击maven弹窗clean时&#xff0c;还是报错。因为模块是新建的&am…...

root用户Linux银河麒麟服务器安装vnc服务

安装必要桌面环境组件 yum install mate-session-manager -y mate-session #确定是否安装成功安装vnc服务器 yum install tigervnc-server -y切换到root为root得vnc设置密码 su root vncpasswd给root用户设置vnc服务器文件 vi /etc/systemd/system/vncserver:1.service [Un…...

CentOS 7使用RPM安装MySQL

MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;允许用户高效地存储、管理和检索数据。它被广泛用于各种应用&#xff0c;从小型的web应用到大型企业解决方案。 MySQL提供了丰富的功能&#xff0c;包括支持多个存储引擎、事务能力、数据完整…...

OpenCV imread函数读取图像__实例详解

OpenCV imread函数读取图像__实例详解 本文目录&#xff1a; 零、时光宝盒 一、imread函数定义 二、imread函数支持的文件格式 三、imread函数flags参数详解 &#xff08;3.1&#xff09;、Flags-1时&#xff0c;样返回加载的图像&#xff08;使用alpha通道&#xff0c;否…...

激光线扫相机无2D图像的标定方案

方案一&#xff1a;基于运动控制平台的标定 适用场景&#xff1a;若激光线扫相机安装在可控运动平台&#xff08;如机械臂、平移台、旋转台&#xff09;上&#xff0c;且平台的运动精度已知&#xff08;例如通过编码器或高精度步进电机控制&#xff09;。 步骤&#xff1a; 标…...

【安当产品应用案例100集】034-安当KSP支持密评中存储数据的机密性和完整性

安当KSP是一套获得国密证书的专业的密钥管理系统。KSP的系统功能扩展图示如下&#xff1a; 我们知道商用密码应用安全性评估中&#xff0c;需要确保存储的数据不被篡改、删除或者破坏&#xff0c;必须采用合适的安全方案来确保存储数据的机密性和完整性。KSP能否满足这个需求呢…...

08.七种排序算法实现(C语言)

目录 一.排序的基本概念 1.1 排序的概念 1.2 常见的排序算法 二.常见排序算法的实现 2.1 插入排序&#xff08;直接&#xff09; 1.基本思想 2.直接插入排序的特性 3.代码实现 2.2 希尔排序 1.基本思想 2.希尔插入排序的特性 3.代码实现 2.3 选择排序 1.基本思想 2…...

Alibaba Spring Cloud 一 核心组件、特性

Alibaba Spring Cloud 是 Alibaba 基于 Spring Cloud 的分布式微服务解决方案&#xff0c;提供了一套高性能、高可靠的微服务开发和运维工具。它扩展了 Spring Cloud 的功能&#xff0c;并优化了许多在生产环境中的实践场景&#xff0c;例如服务发现、配置管理、熔断限流等。 …...

kafka学习笔记7 性能测试 —— 筑梦之路

kafka 不同的参数配置对 kafka 性能都会造成影响&#xff0c;通常情况下集群性能受分区、磁盘和线程等影响因素&#xff0c;因此需要进行性能测试&#xff0c;找出集群性能瓶颈和最佳参数。 # 生产者和消费者的性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-t…...

HQChart使用教程30-K线图如何对接第3方数据45- DRAWRADAR数据结构

HQChart使用教程30-K线图如何对接第3方数据45- DRAWRADAR数据结构 效果图DRAWRADARHQChart代码地址后台数据对接说明示例数据数据结构说明效果图 DRAWRADAR DRAWRADAR是hqchart插件独有的绘制雷达图函数,可以通过麦语法脚本来绘制一个简单的雷达图数据。 雷达图显示的位置固定…...

Java集合学习:HashMap的原理

一、HashMap里的Hash是什么&#xff1f; 首先&#xff0c;我们先要搞清楚HashMap里的的Hash是啥意思。 当我们在编程过程中&#xff0c;往往需要对线性表进行查找操作。 在顺序表中查找时&#xff0c;需要从表头开始&#xff0c;依次遍历比较a[i]与key的值是否相等&#xff…...

ETLCloud在iPaas中的是关键角色?

在当今的数字化时代&#xff0c;企业越来越依赖于其处理和分析数据的能力。为了实现这一目标&#xff0c;企业需要将各种异构的应用和数据源集成在一起&#xff0c;形成一个统一的数据视图。在这一过程中&#xff0c;ETL&#xff08;Extract, Transform, Load&#xff09;和iPa…...

Docker Hub 全面解析及应对策略

在现代 DevOps 和容器化应用开发中&#xff0c;Docker Hub 是一个不可或缺的工具。然而&#xff0c;一些地区或企业对 Docker Hub 的访问受到限制&#xff0c;甚至全面禁止。这种现象引发了开发者和运维人员的广泛关注。那么&#xff0c;为什么 Docker Hub 会被禁用&#xff1f…...

第五天 Labview数据记录(5.1 INI配置文件读写)

5.1 INI配置文件读写 INI配置文件是一种简单的文本文件&#xff0c;通常用于存储软件的配置信息。它具有以下作用&#xff1a; 存储软件配置参数方便软件的维护和更新提高软件的灵活性和可扩展性便于用户修改和共享配置 5.1.1 前面板 1&#xff09;新建项目SaveData_Exampl…...

【算法】经典博弈论问题——巴什博弈 python

目录 前言巴什博弈(Bash Game)小试牛刀PN分析实战检验总结 前言 博弈类问题大致分为&#xff1a; 公平组合游戏、非公平组合游戏&#xff08;绝大多数的棋类游戏&#xff09;和 反常游戏 巴什博弈(Bash Game) 一共有n颗石子&#xff0c;两个人轮流拿&#xff0c;每次可以拿1~m颗…...

ES6语法

一、Let、const、var变量定义 1.let 声明的变量有严格局部作用域 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…...

窥探QCC518x-308x系列与手机之间的蓝牙HCI记录与分析 - 耳机篇

上一篇是介绍如何窥探手机端Bluetooth的HCI log, 本次介绍是如何窥探Bluetooth的HCI log-耳机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 Ultra. QCC518x/QCC308x透过HCI界面取得Log教学. 步骤1: 开启QMDE -> 选择ADK r1102 QCC3083 Headset workspace.步骤2: 点…...

ubuntu k8s 1.31

ubuntu 系统 设置 更新源 apt-get upgradeapt upgradeapt update apt-get update释放root sudo passwd root密码su - 密码设置root可以登录 cd /etc/ssh/sshd_config.d && vi ssh.confPermitRootLogin yes PasswordAuthentication yes:wq 保存退出 systemctl resta…...

Prometheus+grafana实践:Doris数据库的监控

文章来源&#xff1a;乐维社区 Doris数据库背景 Doris&#xff08;Apache Doris&#xff09;是一个现代化的MPP&#xff08;Massive Parallel Processing&#xff0c;大规模并行处理&#xff09;数据库&#xff0c;主要用于在线分析处理&#xff08;OLAP&#xff09;场景。 D…...

【豆包MarsCode蛇年编程大作战】花样贪吃蛇

目录 引言 展示效果 prompt提示信息 第一次提示&#xff08;实现基本功能&#xff09; 初次实现效果 第二次提示&#xff08;美化UI&#xff09; 第一次美化后的效果 第二次美化后的效果 代码展示 实现在线体验链接 码上掘金使用教程 体验地址&#xff1a; 花样贪吃蛇…...

企业级流程架构设计思路-基于价值链的流程架构

获取更多企业流程资料 纸上得来终觉浅&#xff0c;绝知此事要躬行 一.企业流程分级规则定义 1.流程分类分级的总体原则 2.完整的流程体系需要体现出流程的分类分级 03.通用的流程分级方法 04.流程分级的标准 二.企业流程架构设计原则 1.流程架构设计原则 流程框架是流程体…...

AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码

AI编程工具使用技巧&#xff1a;在Visual Studio Code中高效利用阿里云通义灵码 前言一、通义灵码介绍1.1 通义灵码简介1.2 主要功能1.3 版本选择1.4 支持环境 二、Visual Studio Code介绍1.1 VS Code简介1.2 主要特点 三、安装VsCode3.1下载VsCode3.2.安装VsCode3.3 打开VsCod…...