ARM02汇编指令
文章目录
- 一、keil软件介绍
- 1.1 创建工程
- 1.2 解析start.s文件(重点)
- 1.3 乱码解决
- 1.4 更换背景颜色
- 1.5 C语言内存分布
- 1.6 解析map.lds文件(重点)
- 1.7 常见错误信息
- 1.8 仿真
- 二、汇编三种符号
- 2.1 汇编指令
- 2.2 伪指令
- 2.3 伪操作
- 三、汇编指令格式
- 3.1 格式
- 3.2 注意事项
- 四、数据操作指令
- 4.1 数据搬移指令 mov mvn
- 4.2 立即数
- 4.3 伪指令 ldr
- 4.4 移位操作指令
- 4.5 位运算操作指令
- 4.5.1 代码1
- 4.5.2 代码2
- 4.6 算数运算指令
- 4.7 比较指令
- 五、跳转指令
- 5.1 指令码
- 作业1
- 作业2
- 总结
一、keil软件介绍
1.1 创建工程
跟着文档进行创建就可以,注意不要出现中文路径
1.2 解析start.s文件(重点)
.text @文本段
.global _start @ 声明一个_start函数入口
_start: @ _start标签,相当于C语言中函数mov r0,#0x1 @ 一条汇编指令stop: @ stop标签,相当于C语言中函数b stop @ 跳转到stop标签下的第一条指令执行,相当于C语言中while(1).end @结束标志
1.3 乱码解决
1.4 更换背景颜色
将群里下发global.prop文件替换到C:\Keil_v5\UV4,重启keil软件
1.5 C语言内存分布
1.6 解析map.lds文件(重点)
map.lds文件:链接脚本文件
作用:给编译器进行使用,告诉编译器对各个段,如何进行分布
/*输出格式:32位可执行程序,小端对齐*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
/*输出架构:arm架构*/
OUTPUT_ARCH(arm)
/*入口:_start*/
ENTRY(_start)
/*段*/
SECTIONS
{. = 0x00000000;/*入口地址*/. = ALIGN(4);/*4字节对齐*/.text :{./Objects/start.o(.text) /*第一个文件存放start.o文件,指定start.o位置*/*(.text) /*其余文件没有要求,编译器随便放*/}. = ALIGN(4);.rodata : /*只读数据段*/{ *(.rodata) }. = ALIGN(4);.data : /*数据段*/{ *(.data) }. = ALIGN(4);__bss_start = .; .bss : /*.bss段*/{ *(.bss) }__bss_end__ = .;
}
1.7 常见错误信息
c:/program files (x86)/codesourcery/ld.exe: cannot find ./start.o =====> 不能找到./start.o
解决方法:1)在当前工程下,查看start.o位置 ======> 编译器决定start.o在哪个位置2)修改map.lds文件
1.8 仿真
二、汇编三种符号
2.1 汇编指令
编译器将一条汇编指令编译生成机器码,占用代码段空间
2.2 伪指令
伪指令本身不是一条指令,编译器可以将其编译生成多条指令,共同完成一条指令功能
2.3 伪操作
指导编译器对代码如何进行编译,所有以.开头的为伪操作,伪操作不占用代码段空间
三、汇编指令格式
3.1 格式
{cond}{s} Rd,Rn,#oprand2
:指令码
{cond}:条件码
加条件码:指令有条件执行
不加条件码:指令默认无条件执行
{s}:状态位
加s:影响CPSR寄存器
不加s:不影响CPSR寄存器
Rd:目标寄存器
Rn:第一操作寄存器
#oprand2:第二操作数
1)立即数
2)寄存器
3)有效数:将一个数按位取反之后,如果这个数为立即数,说明这个数为有效数
3.2 注意事项
1、{cond}{s}需要连在一起编写
2、Rd,Rn,#oprand2需要用逗号分隔开
3、{cond}{s}和Rd,Rn,#oprand2需要用空格隔开
4、一条汇编指令占用一行,并且没有分号
5、汇编中不区分大小写
四、数据操作指令
4.1 数据搬移指令 mov mvn
指令码:mov mvn
指令格式:{cond}{s} Rd,#oprand2
mov ====> 将第二操作数进行赋值
mvn ====> 将第二操作数,按位进行取反之后,进行赋值
mov r0,#0xf @ r0 = 0xf ====> 立即数
mov r1,#0xff @ r1 = 0xff ====> 立即数
mov r8,r1 @ r8 = r1 = 0xff ====> 寄存器
@ mov r2,#0xfff @ r2 = 0xfff ====> error
@ mov r3,#0xffff @ r3 = 0xfffff ====> error
@ mov r4,#0xfffff @ r4 = 0xfffff ====> error
mov r5,#0xffffff @ r5 = 0xffffff = ~r5 = 0xff000000 ====> 有效数
mov r6,#0xfffffff @ r6 = 0xfffffff = ~r6 = 0xf0000000 ====> 有效数
mov r7,#0xffffffff @ r7 = 0xffffffff = ~r7 = 0 ====> 有效数
mov r0,#0xff @ r0 = 0xff
mvn r1,#0xff @ r1 = ~ r1 = 0xffffff00
4.2 立即数
1、从判断的数中,找到0~0xff之间的数 ===> 判断的这个数所有1包含
2、将找到的0~0xff之间的数,循环右移偶数位 ===> 低位移出,补到高位
3、如果能够得到你要判断的那个数,说明这个数就是立即数
判断的数0 ~ 0xff之间数循环右移偶数是否立即数
判断的数 | 0 ~ 0xff之间数 | 循环右移偶数 | 是否立即数 |
0xf | 0xf | 0 | 是 |
0xf000000f | 0xff | 4 | 是 |
0xff000000 | 0xff | 8 | 是 |
0x000000ff | 0xff | 0 | 是 |
0x1fe00000 | 0xff | 11 | 不是 |
0x1f800000 | 0x7E | 10 | 是 |
0x0000000f =====> 判断的数
0000 0000 0000 0000 0000 0000 0000 1111 =====> 判断的数
0 ~ 0xff之间数:0xf
循环右移偶数: 0 0xf000000f =====> 判断的数
1111 0000 0000 0000 0000 0000 0000 1111 =====> 判断的数
0000 0000 0000 0000 0000 0000 1111 1111 =====> 0 ~ 0xff之间数
0 ~ 0xff之间数: 0xff
循环右移偶数: 40xff000000 =====> 判断的数
1111 1111 0000 0000 0000 0000 0000 0000 =====> 判断的数
0000 0000 0000 0000 0000 0000 1111 1111 =====> 0 ~ 0xff之间数
0 ~ 0xff之间数:0xff
循环右移偶数: 80x000000ff =====> 判断的数
0000 0000 0000 0000 0000 0000 1111 1111 =====> 判断的数
0000 0000 0000 0000 0000 0000 1111 1111 =====> 0 ~ 0xff之间数
0 ~ 0xff之间数:0xff
循环右移偶数: 00x1fe00000=====> 判断的数
0001 1111 1110 0000 0000 0000 0000 0000 =====> 判断的数
0000 0000 0000 0000 0000 0000 1111 1111 =====> 0 ~ 0xff之间数
0 ~ 0xff之间数:0xff
循环右移偶数: 110x1f800000 =====> 判断的数
0001 1111 1000 0000 0000 0000 0000 0000 =====> 判断的数
0000 0000 0000 0000 0000 0000 0111 1110 =====> 0x7E
0 ~ 0xff之间数:0x7E
循环右移偶数: 10
4.3 伪指令 ldr
思考:在0~4G空间,有很多数都不是立即数,那么如何进行赋值呢?
指令码:ldr
格式:ldr 寄存器,=值
ldr r0,=0xfff @ r0 = 0xfff
ldr r1,=0xffff @ r1 = 0xffff
ldr r2,=0xfffff @ r2 = 0xfffff
4.4 移位操作指令
指令码:lsl lsr ror asr
指令格式:{cond}{s} Rd,Rn,#oprand2
lsl:逻辑左移 =====> 特点:无符号数左移,高位移出,低位补0
lsr:逻辑右移 =====> 特点:无符号数右移,低位移出,高位补0
ror:循环右移 =====> 特点:低位移出,补到高位
asr:算数右移 =====> 特点:低位移出,高位补符号位
mov r0,#0xff @ r0 = 0xff = 0000 0000 0000 0000 0000 0000 1111 1111@1.将r0寄存器中的值,逻辑左移4位,并且存放到目标寄存器r1@ 0000 0000 0000 0000 0000 0000 1111 1111@ 0000 0000 0000 0000 0000 1111 1111 0000lsl r1,r0,#0x4 @ r1 = r0 << 4 = 0xff0@2.将r1寄存器中的值,逻辑右移4位,并且存放到目标寄存器r2@ 0000 0000 0000 0000 0000 1111 1111 0000@ 0000 0000 0000 0000 0000 0000 1111 1111lsr r2,r1,#0x4 @ r2 = r1 >> 4 = 0x000000ff@3.将r2寄存器中的值,循环右移4位,并且存放到目标寄存器r3@ 0000 0000 0000 0000 0000 0000 1111 1111@ 1111 0000 0000 0000 0000 0000 0000 1111 ror r3,r2,#0x4 @ r3 = 0xf000000fldr r4,=0x8000000f@4.将r4寄存器中的值,算数右移4位,并且存放到目标寄存器r5@ 1000 0000 0000 0000 0000 0000 0000 1111 @ 1111 1000 0000 0000 0000 0000 0000 0000asr r5,r4,#0x4 @ r5 = 0xf8000000
4.5 位运算操作指令
指令码:and orr eor bic
格式:{cond}{s} Rd,Rn,#oprand2
and:按位与 =====> 与0清0,与1不变
orr:按位或 =====> 或0不变,或1置1
eor:按位异或 =====> 异或0不变,异或1取反(相同为0,相异为1)
bic:按位清零 =====> 第二操作哪一位写1,对应位进行清0
真值表
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1
0 ^ 0 = 0
4.5.1 代码1
/* mov r0,#0xff @ r0 = 0xff@ 31 4 3210@ **** **** **** **** **** **** **** ****@ 0000 0000 0000 0000 0000 0000 1111 1111@ 1111 1111 1111 1111 1111 1111 1110 1111@将r0寄存器中第4位进行清0,保证其他位不变,并且存放到目标寄存器r0中@ 第一种方法:and r0,r0,#0xffffffef@ 第二种方法:推荐使用and r0,r0,#(~(0x1 << 4))@ 备注:当目标寄存器和第一操作寄存器相同,可以合并 and r0,#(~(0x1 << 4))@ 第三种方法bic r0,r0,#(0x1 << 4)
*/ mov r0,#0xEf @ r0 = 0xEf@ 0000 0000 0000 0000 0000 0000 1110 1111@ 1 1110 1111@将r0寄存器中第8位进行置1,保证其他位不变,并且存放到目标寄存器r1中orr r1,r0,#(0x1 << 8) @ r1 = 0x1efmov r2,#0xf @ r0 = 0xf@ 0000 0000 0000 0000 0000 0000 0000 1111@ 0111@将r2寄存器中第3位进行取反,保证其他位不变,并且存放到目标寄存器r3中eor r3,r2,#(0x1 << 3) @ r3 = 0x7
4.5.2 代码2
ldr r0,=0x12345678
@ 1> 将R0寄存器中的第[4]位清0,保持其他位不变
and r0,r0,#(~(0x1 << 4))
@ 2> 将R0寄存器中的第[7]位置1,保持其他位不变
orr r0,r0,#(0x1 << 7)
@ 3> 将R0寄存器中的第[31:28]位清0,保持其他位不变
and r0,r0,#(~(0xf << 28))
@ 4> 将R0寄存器中的第[7:4]位置1,保持其他位不变
orr r0,r0,#(0xf << 4)
@ 5> 将R0寄存器中的第[15:11]位修改位10101,保持其他位不变 @ 先清零bic r0,r0,#(0x1f << 11)@ 在置1orr r0,r0,#(0x15 << 11)
4.6 算数运算指令
指令码:add adc sub sbc mul
指令格式:{cond}{s} Rd,Rn,#oprand2
add:普通加法指令
adc:带进位加法指令 ====> CPSR寄存器中C位标志位
sub:普通减法指令
sbc:带借位减法指令
mul:乘法指令 ====> 没有第二操作数,{cond}{s} Rd,Rn
/*练习题1:实现两个64位数相加第一个64位数:高32位r0 = 0x4 低32位r1 = 0xffffffff第二个64位数:高32位r2 = 0x1 低32位r3 = 0x1两个64位数进行相加目标高32位r4表示=0x6,低32位r5表示=00000000mov r0,#0x4mov r1,#0xffffffffmov r2,#0x1mov r3,#0x1adds r5,r1,r3 @ r5 = r1 + r3adc r4,r0,r2 @ r4 = r0 + r2 + c = 0x4 + 0x1 + 1 = 0x6*//*练习题2:实现两个64位数相减第一个64位数:高32位r0 = 0x4 低32位r1 = 0x4第二个64位数:高32位r2 = 0x1 低32位r3 = 0x5两个64位数进行相减目标高32位r4表示=0x2,低32位r5表示=0xffffffff*/mov r0,#0x4mov r1,#0x4mov r2,#0x1mov r3,#0x5subs r5,r1,r3 @ r5 = r1 - r3sbc r4,r0,r2 @ r4 = r0 - r2 - !c = 0x4 - 0x1 - 1 = 0x2/*乘法指令 ====> 没有第二操作数,<opcode>{cond}{s} Rd,Rn*/mov r0,#0x4mov r1,#0x5mul r0,r1 @ r0 = r0 * r1 = 0x14
4.7 比较指令
指令码:cmp
指令格式:{cond} Rn,#oprand2
注意点:
1)比较指令没有目标寄存器
2)比较指令本质做减法运算
3)比较指令的执行结果,会影响CPSR寄存器的NZCV位,并且不需要加s
4)比较指令和条件码搭配使用
5)前面我们所有学习的指令,都是默认无条件执行,比较指令有条件指令
mov r0,#0x4
mov r1,#0x5
cmp r0,r1 @比较r0和r1寄存器中的值
subhi r0,r0,r1 @如果r0 > r1 r0 = r0 - r1
subcc r1,r1,r0 @如果r0 < r1 r1 = r1 - r0
五、跳转指令
5.1 指令码
指令码:b / bl
指令格式:b / bl{cond} 标签 ====> 跳转到标签下,第一条指令执行
b:有去无回,不会保存函数返回地址到LR寄存器中
b:有去有回,会保存函数返回地址到LR寄存器中
mov r0,#0x1
mov r1,#0x2
@ b add_func @有去无回,不会保存函数返回地址到LR寄存器中
bl add_func @有去有回,会保存函数返回地址到LR寄存器中
mov r3,#0x4
b stopadd_func:
add r0,r0,r1 @ r0 = r0 + r1 = 0x1 + 0x2 = 0x3
mov pc,lr @ 恢复现场 pc = lr
作业1
作业2
用for循环实现1~100之间和5050
for(i=1;i<=100;i++)
{sum = sum + i;
}
总结
特殊功能寄存器:sp lr pc cpsr spsr
基本格式:<opcode>{cond}{s} Rd,Rn,#oprand2
数据操作指令1> 数据搬移指令 mov mvn ldr2> 移位操作指令 lsl lsr asr ror3> 算数运算指令 add adc sub sbc4> 位运算操作指令 and orr eor bic5> 比较指令 cmp
跳转指令 b / bl
相关文章:

ARM02汇编指令
文章目录 一、keil软件介绍1.1 创建工程1.2 解析start.s文件(重点)1.3 乱码解决1.4 更换背景颜色1.5 C语言内存分布1.6 解析map.lds文件(重点)1.7 常见错误信息1.8 仿真 二、汇编三种符号2.1 汇编指令2.2 伪指令2.3 伪操作 三、汇编指令格式3.1 格式3.2 注意事项 四、数据操作指…...

从初学者到专家:Java方法的完整指南
目录 一.方法的概念及使用 1.1什么是方法 1.2方法的定义 1.3方法的调用 1.4实参和形参的关系 1.5没有返回值的方法 1.6方法的意义 二.方法重载 2.1方法重载的实现 2.2方法重载的意义 2.3方法签名 一.方法的概念及使用 1.1什么是方法 方法就是一个代码片段. 类似于 …...

【生成式AI】ProlificDreamer论文阅读
ProlificDreamer 论文阅读 Project指路:https://ml.cs.tsinghua.edu.cn/prolificdreamer/ 论文简介:截止2023/8/10,text-to-3D的baseline SOTA,提出了VSD优化方法 前置芝士:text-to-3D任务简介 text-to-3D Problem text-to-3D…...
C++元编程——模拟javascript异步执行
javascript有一个期约调用,就是利用内部的一种协程机制实现的类似并行的操作。以下是用ChatGPT搞出来的一块演示代码: // 异步任务 function asyncTask() {return new Promise((resolve, reject) > {setTimeout(() > {const randomNumber Math.f…...

【JavaEE】懒人的福音-MyBatis框架—复杂的操作-动态SQL
【JavaEE】MyBatis框架要点总结(3) 文章目录 【JavaEE】MyBatis框架要点总结(3)1. 多表查询1.1 映射表resultMap1.2 只有部分属性跨表查询1.2.1 依照常规去写代码1.2.2 用标签去实现接口 1.3 分多步的解决方案1.4 与多线程的结合 …...
Springboot 默认路径说明
Spring Boot基本上是Spring框架的扩展,它消除了设置Spring应用程序所需的样板配置,极大的方便了开发者,其默认识别路径如下: Spring Boot 作为Spring默认将 /** 所有访问映射到以下目录: 1、classpath:/static 用于加…...
springboot注册拦截器与返回统一标准响应格式
响应对象ResultVO package com.example.poi.utils;import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.io.Serializable;/*** A…...

卷王特斯拉又全网降价了,卷死车企们
哈喽,大家好,今天媒介盒子小编又来跟大家分享软文推广的干货知识了,本篇分享的主要内容是:特斯无孔不入的营销手段。 1、特斯拉Model Y降价 车企要打架 自2023 年 8 月 14 日起,Model Y 长续航版起售价从 31.39 万元调整为 29.99 万元,Mode…...

wiley:revision 流程
1 上传修改后的word文件 注意:包括没标注修改位置的word文件和标注了修改位置的word文件 2 上传response回复文件 Your Author Response should include relevant comments that you have copied from the decision letter, along with your comments detailing …...

【论文阅读】基于深度学习的时序预测——Pyraformer
系列文章链接 论文一:2020 Informer:长时序数据预测 论文二:2021 Autoformer:长序列数据预测 论文三:2022 FEDformer:长序列数据预测 论文四:2022 Non-Stationary Transformers:非平…...

玩转IndexedDB,比localStorage、cookie还要强大的网页端本地缓存
随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据。 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的大小不超过 4K…...

RedisDesktopManager连不上redis问题解决(小白版)
常见问题就是 redis.conf配置文件 a.将port 127.0.0.1这一行注释掉 b.protected-mode保护模式改为no 这个可以看到很多博主都说了,相信都搜到这里来了你们都弄了,我就不详细说了 防火墙开放端口 我说明我自己的问题以及解决方法 1、执行telnet 虚拟…...

蓝帽杯 取证2022
网站取证 网站取证_1 下载附件 并解压 得到了一个文件以及一个压缩包 解压压缩包 用火绒查病毒 发现后门 打开文件路径之后 发现了一句话木马 解出flag 网站取证_2 让找数据库链接的明文密码 打开www文件找找 查看数据库配置文件/application/database.php(CodeI…...
MyBatis and or使用列表控制or条件
背景:最近项目需要,师傅可以查找订单,而师傅是指定可以服务2到3个区域,故需要使用到and, or条件的组合,以下记一下代码。 最重要的代码是: 1、构建List<Consumer<LambdaQueryWrapper<T>>&g…...

C语言刷题训练【第11天】
大家好,我是纪宁。 今天是C语言笔试刷题训练的第11天,加油! 文章目录 1、声明以下变量,则表达式: ch/i (f*d – i) 的结果类型为( )2、关于代码的说法正确的是( )3、已知有如下各变…...

正则表达式的使用
1、正则表达式-教程 正则表达式:文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为元字符)。 正则表达式使用单个字符串来描述,匹配一系列匹配某个句法规则的字符串。 2、…...

PHP 求解两字符串所有公共子序列及最长公共子序列 支持多字节字符串
/*** 获取两字符串所有公共子序列【不连续的】 例:abc ac > ac** param string $str1 字符串1* param string $str2 字符串2** return array*/ function public_sequence(string $str1, string $str2): array {$data [[-1, -1, , 0, ]]; // 子序列容器【横坐标 …...
linux内核bitmap之setbit汇编实现
内核版本:kernel 0.12 首先看一段代码,下面这段代码来自内核版本0.12的mm/swap.c中: // mm/swap.c #define bitop(name,op) \static inline int name(char * addr,unsigned int nr) \ { \int __res; \__asm__ __volatile__("bt" …...
Golang设计模式
Golang设计模式 Golang设计模式简介Golang工厂设计模式Golang单例设计模式Golang抽象工厂设计模式Golang建造者模式 (Builder Pattern)Golang 原型模式(Prototype Pattern)Golang适配器模式Golang 桥接模式(Bridge Pattern)Golang装饰器模式(Decorator …...
leetcode151. 反转字符串中的单词
题目:leetcode151. 反转字符串中的单词 描述: 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...