10.5汇编语言整理
【汇编语言相关语法】
1.汇编语言的组成部分
1.伪操作:不参与程序的执行,但是用于告诉编译器程序该怎么编译 .text .global .end .if .else .endif .data
2.汇编指令 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能
3.伪指令 不是指令,看起来像是一条指令,可以实现和指令类似的功能。一条伪指令实际上可能是由多条指令共同实现
4.注释 单行注释: @ 多行注释 /* */ 条件编译 .if 0 指令段 .else 指令段 .endif
2.汇编指令的介绍
1.基本数据操作指令 数据搬移指令 = 数据移位指令 << >> 数据算数运算指令 + - * / 位运算指令 & | ~ ^ 数据比较指令
2.跳转指令
3.内存读写指令
4.状态寄存器读写指令
5.软中断指令
3.汇编指令的基本语法格式
指令的基本格式: <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
解释:
<opcode>:指令码
{<cond>}:条件码
{s}:状态位,如果在指令后面加上s,则运算的结果会影响CPSR的条件位
<Rd>:目标寄存器
<Rn>:第一操作寄存器 只能是寄存器
<shifter_operand>:第二操作数,可以是寄存器,也可以是立即数 按照指令码将第一操作寄存器和第二操作数进行运算,将运算后的结果保存在目标寄存器
注意: 1.一条汇编指令一般占一行 2.汇编不区分大写小写
【汇编指令】
1.数据搬移指令
1.1 格式
<opcode>{<cond>}{s} <Rd>, <shifter_operand>
解释:
<opcode>:指令码
{<cond>}:条件码
{s}:状态位,如果在指令后面加上s,则运算的结果会影响CPSR的条件位
<Rd>:目标寄存器 <shifter_operand>:第一操作数,可以是寄存器,也可以是立即数 按照指令码将第一操作数运算后的结果保存在目标寄存器
指令码功能: mov:将第一操作数的值保存在目标寄存器
mvn:将第一操作数的值按位取反,将结果保存在目标寄存器
1.2 示例
1.3 立即数的概念
定义:能够直接当作指令的一部分参与到指令的执行过程中的数据就是立即数.立即数由一个0-255范围内的数循环右移偶数位获得。
在指令的32为中将低12位预留保存立即数的数据
如何判断一个数据是不是立即数: 在0-255范围内找一个数,让它循环右移偶数位(一个0-15范围内的数*2得到),如果能够得到这个数据,则这个数就是一个立即数。
循环右移:最低位移出去的数补到最高位 0000 0000 0000 0000 0000 0000 0000 1010
右移两位: 0000 0000 0000 0000 0000 0000 0000 0010
循环右移两位: 100000 0000 0000 0000 0000 0000 0000 10 ex: 0X104: 0000 0000 0000 0000 0000 0001 0000 0100
循环右移2位-》000000 0000 0000 0000 000000 0100 0001 -》0x41 换句话说,将0x41循环右移30位得到0X104,所以,0X104是一个立即数 0X101:0000 0000 0000 0000 0000 0001 0000 0001 0X101找不到一个0-255范围内的数循环右移得到它,所以0X101不是立即数
1.4 将非立即数保存至寄存器中
伪指令: LDR 目标寄存器,=数值 将指定的数据放在目标寄存器中 ex:LDR r1,=0X12345678
2.移位指令
2.1 格式以及指令码
格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
解释:将第一操作寄存器的数值移位第二操作数指定的位数,将结果保存在目标寄存器中
指令码: LSL:左移运算 低位补0
LSR:右移运算 高位补0
ROR:循环右移:低位移出的值补到高位
2.2 示例
1.左移mov r0,#0XFFlsl r1,r0,#0X4 @将R0的值左移4位保存在r1寄存器 R1结果:0XFF02.右移mov r0,#0XFF
lsr r1,r0,#0X4 @将R0的值右移4位保存在r1寄存器 R1结果:0XF
3.循环右移
mov r0,#0XFF
ror r1,r0,#0X4 @将R0的值循环右移4位保存在r1寄存器 R1结果:0XF000000F
4.c风格写法
mov r0,#0XFF
ror r1,r0,#(0X1<<2) @将R0的值循环右移4位保存在r1寄存器 R1结果:0XF000000F
3.位运算指令
3.1 格式以及功能码
格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
解释:将第一操作寄存器和第二操作数进行位运算,将结果保存在目标寄存器中
指令码: and:与 与0清0 与1不变
orr:或 或1置1 或0不变
eor:异或 相同为0 不同为1
bic:按位清零指令,想将哪一位设置为0,只需要用bic指令给这一位运算一个1即可
3.2 示例
1.and:
mov r0,#0XFFand r1,r0,#0XF0 @R1结果为0XF02.ORR:mov r0,#0XFForr r1,r0,#0XF000 @R1结果为0XF0FF
3.EOR:ldr r0,=0xf0f0EOr r1,r0,#0XFF @R1结果为0XF00F
0000 0000 0000 0000 0000 0000 1111 1111
0000 0000 0000 0000 1111 0000 1111 0000
结果:0000 0000 0000 0000 1111 0000 0000 1111 -》0XF00F4.BICldr r0,=0xFFBIC r0,r0,#(0x1<<5) @将R0的值第5位清0 @R0结果为0XDF
3.3 练习
LDR r1,=0X12345678 @将0X12345678存放在r1寄存器
0001 0010 0011 0100 0101 0110 0111 1000
1.将R1寄存器的第4位清0,其他位不变and r1,r1,#(~(0X1<<4))或者BIC R1,R1,#(0x1<<4)
2.将r1寄存器第7位置1,其他位不变
orr r1,r1,#(0X1<<7)
3.将r1寄存器[31:28]清0,其他位不变
and r1,r1,#(~(0Xf<<28))或者BIC R1,R1,#(0xF<<28)
4.将r1寄存器[7:4]置1,其他位不变
orr r1,r1,#(0XF<<4)
5.将r1寄存器[15:11]设置为10101,其他位不变 @先清0BIC R1,R1,#(0X1F<<11)@再置位orr r1,r1,#(0X15<<11)
4.算数运算指令
4.1 格式以及指令码
格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>
解释:将第一操作寄存器的值和第二操作数进行算数运算,结果保存在目标寄存器中
add:加法运算
adc:进行加法运算时需要考虑CPSR的条件位
sub:减法运算
sbc:进行减法运算时需要考虑CPSR的条件位
mul:乘法运算
4.2 示例
1.ADD:加法ex1: mov r1,#1mov r2,#2add r3,r1,r2@r3=r1+r2ex:mov r1,#0XFFFFFFFEmov r2,#2addS r3,r1,r2@r3=r1+r2 @运算的结果影响到条件位
2.SUBmov r1,#0XFFFFFFFEmov r2,#2sub r3,r1,r2@r3=r1-r2ex2:mov r1,#0XFFFFFFFEmov r2,#2subs r3,r2,r1@r3=r2-r1
3.ADC
mov r1,#0XFFFFFFFE
mov r2,#2ADDS r3,r2,r1 @r3=r1+r2 ADC R4,R2,#3 @R4=R2+3+cpsr(C位) 6 4.sbc:减法运算考虑条件位
mov r1,#0XFFFFFFFEmov r2,#2SUBS r3,r2,r1 @r3=R2-R1 4sbC R4,R1,#3 @R4=R1-3-CPSR(C位取反)
4.3 64位数据进行算数运算
原则: 一个 64位数保存在两个寄存器
高32位运算,低32位运算
mov r1,#0XFFFFFFFE @保存第一个数据的低32位
mov r2,#2@保存第一个数据的高32位
mov r3,#3 @保存第二个数据的低32位
mov r4,#4 @保存第2数据的高32位 @低32位运算要求影响条件位
ADDS R5,R1,R3@R5保存运算后结果的低32位
ADC R6,R2,R4@R6寄存器保存运算结果的高32位,需要考虑条件位
5.比较指令
格式: cmp 第一操作数,第二操作寄存器 比较两个数据
cmp命令本质:实际上就是比较的两个数进行减法运算,并且减法运算的结果会影响到CPSR寄存器的条件位 通常比较指令完毕之后会使用条件码进行判断,根据判断的结果做不同的逻辑
条件码
在一个指令后面加上条件码的助记词后缀,如果满足条件码对应的条件,我们就会进行对应的指令操作,否则不进行操作
mov r1,#3 mov r2,#4 cmp r1,r2 @比较两个数
SUBHI r3,r1,r2 @如果r1>r2 进行减法运算
MULEQ r3,r1,r2@如果两数相等,进行乘法运算
ADDCC R3,R1,R2@如果r1<r2 ,进行加法运算
6. 跳转指令
格式:
<opcode>{<cond>} 标签
功能:跳转到指定的标签下指令码:
b:跳转时不影响LR寄存器的值ex:.text
.global _start_start:mov r1,#3mov r2,#4b fun1 @程序跳转mul r5,r1,r2stop:b stop fun1:add r4,r1,r2.endbl:跳转时影响LR寄存器的值.text
.global _start_start:mov r1,#3mov r2,#4bl fun1 @程序跳转mul r5,r1,r2stop:b stop fun1:add r4,r1,r2mov pc,lr @程序返回.end
【内存读写指令】
int *p=0X12345678
*p=100;//向内存中写入数据
int a= *p;//从内存读取
1.单寄存器内存读写指令
讨论如何将单个寄存器的数据向内存中读写
1.1 指令码以及功能
向内存中写:
str:向内存中写一个字(4字节)的数据
strh:向内存写半个字(2字节)的数据
strb:向内存写一个字节的数据
从内存读:
ldr:从内存读取一个字的数据
ldrh:从内存读取半个字的数据
ldrb:从内存读取一个字节的数据
1.2 格式
指令码{条件码} 目标寄存器 [目标地址]
str 目标寄存器 ,[目标地址]:将目标寄存器的数据写入到以目标地址为起始的内存中
ldr 目标寄存器 ,[目标地址]:从以目标地址为起始的内存中读一个字的数据到目标寄存器
1.3 示例
mov r1,#0XFFFFFFFFldr r2,=0X40000000@向内存写入str r1,[r2]@从内存读ldr r3,[r2]
1.4 单寄存器读写的地址索引方式
1.前索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2,#8]@将r1寄存器的值保存到r2+8为起始地址的内存中ldr r3,[r2,#8]@从r2+8为起始地址的内存中读2.后索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2],#8 @将r1寄存器的值保存到r2为起始地址的内存中,r2值=让r2+83.自动索引mov r1,#0XFFFFFFFFldr r2,=0X40000000str r1,[r2,#8]! @将r1寄存器的值保存到r2+8w为起始地址的内存中,r2=r2+8
2.批量寄存器的内存读写方式
2.1 指令码以及格式
向内存写:
stm 目标地址,{寄存器列表} 将寄存器列表中每一个寄存器的值都写道目标地址指向的连续空间之中 从内存读
ldm 目标地址,{寄存器列表} 将目标地址指向的连续内存中的数据读到寄存器列表中的寄存器中
注意事项: 1.如果寄存器列表中寄存器的编号连续,可以用-表示列表,如果不连续,用,分割寄存器 {r1-r5,r7}
2.无论寄存器列表中如何表示,我们在读写内存的时候始终是低地址 对应低寄存器编号
2.2 示例代码
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stm r6,{r1,r2,r3,r4,r5} @将r1-r6寄存器的值写道r6指向的连续内存中ldm r6,{r7,r8,r9,r10,r11}@从r6指向的连续内存中读取数据保存到r7-r11寄存器中
2.3 批量寄存器的地址增长方式
每次向指定寄存器保存的地址中写入一个数据,保存地址的寄存器保存的地址也会发生相应的改变
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stm r6!,{r1-r5}先向r6指向的内存中写一个数据,然后r6保存的地址向地址大的方向增长
ia后缀
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmia r6!,{r1-r5}先向r6指向的内存中写一个数据,然后r6保存的地址向地址大的方向增长
ib后缀
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmib r6!,{r1-r5}先让R6寄存器保存的地址往地址大的方向增长,再向R6寄存器保存的地址中写入数据
da后缀
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000800stmda r6!,{r1-r5}先向R6指向的内存中存数据,然后R6寄存器保存的地址往地址小的方向增长
DB后缀
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000800stmdb r6!,{r1-r5}先将R6寄存器保存的地址往地址小的方向增长,再往R6寄存器保存的地址内存中存入数据
mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5ldr r6,=0X40000000stmia r6!,{r1-r5} @ia存,db取ldmdb r6!,{r7-r11}
3.栈内存读写
栈指针寄存器:R13/SP
栈:栈本质上就是一段内存,我们在内存中指定一片区域用于保存一些临时数据,这片区域就是栈区
3.1 栈的类型
增栈:压栈结束后,栈顶往地址大的方向增长
减栈:压栈结束后,栈顶往地址小的方向增长
空栈:压栈结束后,栈顶区域没有有效数据
满栈:压栈结束后,栈顶区域存放有效数据 空增栈(EA)/空减栈(ED)/满增栈(FA)/满减栈(FD) ARM使用的栈是满减栈
3.2 满减栈压栈出栈操作
ex1:ldr sp,=0X40000020 @指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5push {r1-r5} @压栈pop {r6-r10} @将栈顶元素数值出栈
ex2:ldr sp,=0X40000020 @指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5STMDB sp!,{r1-r5} @压栈LDMIA sp!,{r6-r10} @将栈顶元素数值出栈
EX3:ldr sp,=0X40000020 @指定顶地址mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5STMfd sp!,{r1-r5} @压栈LDMfd sp!,{r6-r10} @出栈
4.栈实例---叶子函数的调用过程
.text
.global _start _start:ldr sp,=0X40000020 @初始化栈b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
@压栈保护现场stmfd sp!,{r1,r2}mov r1,#3mov r2,#4sub r4,r2,r1@出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lr @返回main函数wh: b wh .end
5.栈实例---非叶子函数的调用过程
.text
.global _start _start:ldr sp,=0X40000020 @初始化栈b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
@压栈保护现场stmfd sp!,{r1,r2,lr}mov r1,#3mov r2,#4bl fun1sub r4,r2,r1@出栈恢复现场ldmfd sp!,{r1,r2,lr}mov pc,lr @返回main函数
fun1:
@压栈保护现场stmfd sp!,{r1,r2}mov r1,#4mov r2,#5mul r5,r1,r2@出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lrwh: b wh .end
相关文章:
10.5汇编语言整理
【汇编语言相关语法】 1.汇编语言的组成部分 1.伪操作:不参与程序的执行,但是用于告诉编译器程序该怎么编译 .text .global .end .if .else .endif .data 2.汇编指令 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存&…...
Connect to 127.0.0.1:1080 [/127.0.0.1] failed: Connection refused: connect
报错信息 A problem occurred configuring root project CourseSelection. > Could not resolve all artifacts for configuration :classpath.> Could not resolve com.android.tools.build:gradle:3.6.1.Required by:project :> Could not resolve com.android.tool…...
驱动器类产品的接口EMC拓扑方案
驱动器类产品的接口EMC拓扑方案 1. 概述 本文以高压伺服驱动器和变频器类产品为例,对常用端口滤波拓扑方案进行总结,后续根据不同的应用场景可进行适当删减,希望对大家有帮助。 2. 驱动器验证等级 本文推荐拓扑的实验结果,满足…...
2023最新ICP备案查询系统源码 附教程 Thinkphp框架
2023最新ICP备案查询系统源码 附教程 thinkphp框架 本系统支持网址备案,小程序备案,APP备案查询,快应用备案查询 优势: 响应速度快,没有延迟,没有缓存,数据与官方同步 源码下载:ht…...
大数据Doris(六):编译 Doris遇到的问题
文章目录 编译 Doris遇到的问题 一、js_generator.cc:(.text+0xfc3c): undefined reference to `well_known_types_js’...
vue重修004上部
文章目录 版权声明组件的三大组成部分scoped解决样式冲突scoped原理2.代码演示 组件data函数说明演示 组件通信组件关系分类通信解决方案父子通信流程子向父通信代 props详解props校验props&data、单向数据流 小黑记事本(组件版)基础组件结构需求和实…...
【C++ techniques】要求/禁止/判断—对象产生于堆中
有时候我们想让某种对象具有“自杀”的能力,所以我们必须要求对象存在堆中,以便我们调用delete this;另一些时候,我们要求拥有某种确定性,保证某一些类型绝不会发生内存泄漏,原因是没有任何一个该类型的对象…...
吃鸡高手亲授:玩转绝地求生,分享顶级游戏干货!
绝地求生(PUBG)自上线以来,成为了全球热门游戏。作为吃鸡行家,我将分享一些独家技巧和干货,帮助您提高游戏战斗力,享受顶级游戏作战体验! 首先,让我们谈一谈战斗力升级。想要在吃鸡游…...
Vue中如何进行自定义图表与可视化图形设计
Vue中如何进行自定义图表与可视化图形设计 在现代Web应用程序开发中,数据可视化图表和图形设计是至关重要的一部分。Vue.js是一个流行的JavaScript框架,它提供了强大的工具来构建交互性强大的用户界面。本文将探讨如何在Vue.js中进行自定义图表和可视化…...
学信息系统项目管理师第4版系列19_质量管理
1. 公差 1.1. 质量测量中公差是测量指标的可允许变动范围,而不是实际测量值与预期值的差 1.1.1. 【高22下选35】 1.2. 结果的的可接受范围 2. 控制界限 2.1. 统计意义上稳定的过程或过程绩效的普通偏差的边界 3. 3版 3.1. 质量控制新七工具 3.1.1. 【高19下…...
react库的基础学习
React介绍 React.js是前端三大新框架:Angular.js、React.js、Vue.js之一,这三大新框架的很多理念是相同的,但是也有各自的特点。 React起源于Facebook的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满…...
FFmpeg 基础模块:容器相关的 API 操作
目录 AVFormat 模块 AVFormat 前处理部分 AVFormat 读写处理部分 小结 思考 FFmpeg 目录中包含了 FFmpeg 库代码目录、构建工程目录、自测子系统目录等,具体内容如下: 现在你知道 FFmpeg 的源代码目录中都包含了哪些内容,在之后使用 FFm…...
SpringMVC+统一表现层返回值+异常处理器
一、统一表现层返回值 根据我们不同的处理方法,返回的数据格式都会不同,例如添加只返回true|false,删除同理,而查询却返回数据。 Result类 为此我们封装一个result类来用于表现层的返回。 public class Result {//描述统一格式…...
2023年地理信息系统与遥感专业就业前景与升学高校排名选择
活动地址:毕业季进击的技术er 地理信息系统(GIS,Geographic Information System),又称“地理信息科学”(Geographic Information Science),是一种具有信息系统空间专业形式的数据管理…...
第五章:最新版零基础学习 PYTHON 教程—Python 字符串操作指南(第二节 - Python 字符串—Python 字符串 len()的语法)
Python len() 函数返回字符串的长度。 目录 Python len() 语法 Python len() 示例 示例 1:带有元组和字符串的 Len() 函数...
ubuntu22.04使用共享文件设置
从ubuntu20.04开始,设置共享文件就很麻烦 第一步: 安装samba: sudo apt install samba第二步; 创建一个共享文件夹 我以桌面Desktop为例子 第三步: 设置密码: sudo smbpasswd -a ygc第四步: sudo vim …...
pycharm配置python3.8版本专门用于undecteded_chromedriver测试
pycharm配置python3.8版本专门用于undecteded_chromedriver测试 作者:虚坏叔叔 博客:https://pay.xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 一、Pycharm及python环境的配置 1.安装python-3.8.7rc1-amd64.e…...
基于SpringBoot的民宿在线预定平台
目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 民宿信息管理 民宿资讯管理 民宿分类管理 用户注册 民宿信息 我的订单 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实…...
CTFHUB SSRF
目录 web351 编辑 web352 web353 web354 sudo.cc 代表 127 web355 host长度 web356 web357 DNS 重定向 web358 bypass web359 mysql ssrf web360 web351 POST查看 flag.php即可 web352 <?php error_reporting(0); highlight_file(__FILE__); $url$_…...
FreeRTOS入门教程(队列详细使用示例)
文章目录 前言一、队列基本使用二、如何分辨数据源三、传输大块数据总结 前言 上篇文章我们已经讲解了队列的概念和队列相关的API函数,那么本篇文章的话就开始带大家来学习使用队列。 一、队列基本使用 这个例子将会创建三个任务,其中两个任务用来发送…...
【Kafka专题】Kafka收发消息核心参数详解
目录 前置知识课程内容一、从基础的客户端说起(Java代码集成使用)1.1 消息发送者源码示例1.2 消息消费者源码示例1.3 客户端使用小总结 *二、从客户端属性来梳理客户端工作机制*2.1 消费者分组消费机制2.2 生产者拦截器机制2.3 消息序列化机制2.4 消息分…...
matlab 使用激光雷达检测、分类和跟踪车辆
目录 1、算法概述2、加载数据3、地平面分割4、语义分割5、聚类和边界盒拟合6、可视化设置7、循环遍历数据8、面向跟踪的包围盒9、 总结10、 支持功能11、 参考</...
代码随想录训练营二刷第四十八天 | 139.单词拆分 背包问题总结
代码随想录训练营二刷第四十八天 | 139.单词拆分 背包问题总结 一、139.单词拆分 题目链接:https://leetcode.cn/problems/word-break/ 思路:单词拼字符串,完全背包。定义dp[i],为true表示可以拆分为一或多个单词。可能会出现ab…...
【数据挖掘】2017年 Quiz 1-3 整理 带答案
目录 Quiz 1Quiz 2Quiz 3Quiz 1 Answer Problems 1-2 based on the following training set, where A , B , C A, B, C A,B,</...
吃鸡高手必备工具大揭秘!提高战斗力,分享干货,一站满足!
大家好!你是否想提高吃鸡游戏的战斗力,分享顶级的游戏作战干货,方便进行吃鸡作图和查询装备皮肤库存?是否也担心被骗,希望查询游戏账号是否在黑名单上,或者查询失信人和VAC封禁情况?在这段视频中…...
集群化环境前置准备
目录 部署 1. 配置多台Linux虚拟机 1.1 首先,关机当前CentOS系统虚拟机(可以使用root用户执行init 0来快速关 机) 1.2 新建文件夹 1.3 克隆 1.4 同样的操作克隆出:node2和node3 1.5 开启node1,修改主机名为node1&…...
nodejs开发环境搭建
Nodejs是一个开源的、跨平台JavaScript运行时环境,其使用V8引擎对JavaScript脚本执行解释,在前后端分离的应用架构设计中,其既能支持web页面服务应用的开发、也能支持后端接口服务应用的开发,类似于Java语言的J2EE运行时环境&…...
C语言qsort函数
排序qsort int int cmp(const void *a, const void *b) {return *(int *)a - *(int *)b;//先强转成int型,后解引用取值比较大小 }字符串数组 char a[] “hello world” //字符串数组,存放的是字符 int cmp(const void *a, const void *b) {return *(…...
如何使用 Hotshot 通过文字生成 GIF 动画
Hotshot 是一个基于人工智能的工具,可用于通过文字生成 GIF 动画。该工具使用最新的图像生成技术来创建逼真的动画,即使是复杂的文字描述也能做到。 hotshot访问地址 使用 Hotshot 生成 GIF 动画 要使用 Hotshot 生成 GIF 动画,您需要首先…...
吃鸡高手必备!这些技巧帮你提高战斗力!
大家好!作为一名吃鸡玩家,我们都想提高自己的战斗力,享受顶级游戏作战干货,装备皮肤库存展示和查询,并避免被骗游戏账号。在这里,我将为大家介绍一些实用的技巧和工具,让你成为吃鸡高手…...
网站建设需要个体营业执照/seo推广软件下载
CDN概述 CDN的全称是Content Delivery Network,即内容分发网络。 CND加速主要是加速静态资源,如网站上面上传的图片、媒体,以及引入的一些Js、css等文件。 CND加速需要依靠各个网络节点,例如100台CDN服务器分布在全国范围…...
西安市阎良区建设局网站/东莞搜索引擎推广
过程赋值:用于对reg型变量赋值,改变寄存器的值或为以后排定改变。 语法 {阻塞性(blocking)赋值} RegisterLValue [ TimingControl] Expression; {非阻塞性(non-blocking)赋值} RegisterLValue < [ TimingControl] Expression; 阻塞:…...
做网站还有钱赚吗/最厉害的搜索引擎
学习ehcache文档: 介绍:Ehcache是一个开源的项目,用来提高性能的基于标准化的缓存,无需使用数据库,简化了可扩展性。他是最广泛使用的基于java的缓存,因为他是强壮的,被证实的,功能全…...
惠州建站模板/腾讯广点通
1、按下Esc键进入命令模式 2、然后输入下列命令 :set nu #让当前文档内容显示行号,后面删除的时候是根据行号来删除的3、看下面例子 :1,19d #敲下回车之后就会删除第1~19行的全部内容...
2023b站推广入口/网站提交工具
“一年级的孩子考试成绩80多分,处于一个什么样的水平?”有人问。孩子从上一年级开始,其成绩就一直牵动家长的心。孩子的每一次成绩,估计很多家长都牵肠挂肚。一年级的孩子考试成绩80多分,是不是挺差的?估计…...
web网站开发技术介绍/站长之家是什么
浏览器事件循环进程与线程进程与线程 进程是系统分配的独立资源,是CPU资源分配的基本单位。进程由一个或多个线程组成;线程是进程的执行流,是CPU调度和分派的基本单位。同一个进程中多个线程之间是共享该进程的资源。...