ARM汇编基础

1 GNU语法

1.1 GNU汇编

GNU 汇编语法适用于所有的架构,并不是 ARM 独享的,GNU 汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分,如下:

label: instruction @ comment
  • label: 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识符都会被识别为一个标号。
  • instruction:即指令,也就是汇编指令或伪指令。
  • @符号:表示后面的是注释,就跟 C 语言里面的“/”和“/”一样,其实在 GNU 汇编文件中我们也可以使用“/”和“/”来注释。
  • comment: 就是注释内容。

举例:

add:
	MOVS RO, #0X12 @设置R0=0X12

“add:”就是标号,“MOVS R0,#0X12”就是指令,最后的“@设置 R0=0X12”就是注释。

1.2 段

用户可以使用.section伪操作来定义一个段,汇编系统预定义了一些段名:

.text:代码段

.data:初始化的数据段

.bss:为初始化的数据段

.rodata:只读数据段

也可以自己使用.section来定义一个段,每个段以段名开始,以下一段名或文件结尾结束,比如:

.section .testsection @定义一个testsection段

汇编程序的默认入口标号为_start,也可以在链接脚本中使用ENTRY指明其它的入口点,下面的代码使用_start作为入口标号:

.global _start

_start:
	ldr r0, =0x12 @r0=0x12

.global 是伪操作,表示_start 是一个全局标号,类似 C 语言里面的全局变量一样,常见的伪操作有:

  • .byte:定义单字节数据,比如.byte 0x12。
  • .short:定义双字节数据,比如.short 0x1234。
  • .long:定义一个 4 字节数据,比如.long 0x12345678。
  • .equ:赋值语句,格式为:.equ 变量名,表达式,比如.equ num, 0x12,表示 num=0x12。
  • .align:数据字节对齐,比如:.align 4 表示 4 字节对齐。
  • .end:表示源文件结束。
  • .global:定义一个全局符号,格式为:.global symbol,比如:.global _start。

1.3 函数

GNU汇编支持函数,函数格式为:

函数名:
	函数体
	返回语句 @ 不是必须的

返回语句不是必须的。

2 Cortex-A7常用汇编指令

参考:《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》的A4章节

2.1 处理器内部数据传输指令

处理器内部传输数据,常见的操作有:

  • 将数据从一个寄存器传递到另外一个寄存器。
  • 将数据从一个寄存器传递到特殊寄存器,如CPSR和SPSR寄存器。
  • 将立即数传递到寄存器。

数据传输常用的指令有3个:MOV、MRS、MSR,用法如下:

指令 目的 描述
MOV R0 R1 将R1里面的数据复制到R0中
MRS R0 CPSR 将特殊寄存器CPSR里面的数据复制到R0中
MSR CPSR R1 将R1里面的数据复制到特殊寄存器CPSR中
  • MOV 指令用于将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面,使用示例如下:
MOV RO, R1      @将寄存器R1中的数据传递给R0寄存器
MOV R0, #0X12   @将立即数0X12传递给R0寄存器
  • MRS 指令用于将特殊寄存器(如 CPSR 和 SPSR)中的数据传递给通用寄存器,要读取特殊寄存器的数据只.能使用 MRS 指令,使用示例如下:
MRS R0, CPSR  @将特殊寄存器 CPSR 里面的数据传递给 R0,即 R0=CPSR
  • MSR 指令和 MRS 刚好相反,MSR 指令用来将普通寄存器的数据传递给特殊寄存器,也就是写特殊寄存器,写特殊寄存器只能使用 MSR,使用示例如下:
MSR CPSR, R0   @将 R0 中的数据复制到 CPSR 中,即 CPSR=R0

2.2 存储器访问指令

ARM 不能直接访问存储器,比如 RAM 中的数据,用汇编操作RAM需要借助存储器访问指令,一般先将要配置的值写入到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx 中的数据写入到RAM,读取过程相反。

常用的存储器访问指令有两种:LDR 和 STR:

指令 描述
LDR Rd, [Rn, #offset] 从存储器 Rn+offset 的位置读取数据存放到 Rd 中
STR Rd, [Rn, #offset] 将 Rd 中的数据写入到存储器中的 Rn+offset 位置
  • LDR 主要用于从存储加载数据到寄存器 Rx 中,LDR 也可以将一个立即数加载到寄存器 Rx中,LDR 加载立即数的时候要使用“=”,而不是“#”。在嵌入式开发中,LDR 最常用的就是读取 CPU 的寄存器值,比如 I.MX6UL 有个寄存器 GPIO1_GDIR,其地址为 0X0209C004,我们现在要读取这个寄存器中的数据,示例代码如下:
LDR R0, =0X0209C004  @将寄存器地址0X0209C004加载到R0中
LDR R1, [R0]		 @读取地址0X0209C004中的数据到R1寄存器中

读取寄存器 GPIO1_GDIR 中的值,读取到的寄存器值保存在 R1 寄存器中,上面代码中 offset 是 0,也就是没有用到 offset。

  • STR 就是将数据写入到存储器中,同样以 I.MX6UL 寄存器GPIO1_GDIR 为例,现在我们要配置寄存器 GPIO1_GDIR 的值为 0X20000002,示例代码如下:
LDR R0, =0X0209C004  @将寄存器地址0X0209C004加载到R0中
LDR R1, =0X20000002  @R1保存要写入到寄存器的值
STR R1, [R0]         @将R1中的值写入到R0中保存的地址中

LDR 和 STR 都是按照字进行读取和写入的,也就是操作的 32 位数据,如果要按照字节、半字进行操作的话可以在指令“LDR”后面加上 B 或 H,比如按字节操作的指令就是 LDRB 和 STRB,按半字操作的指令就是 LDRH 和 STRH。

2.3 压栈和出栈指令

函数调用时,在调用函数之前,需要将调用者的当前处理器信息保存起来(也就寄存器),当被调用函数执行完之后需要恢复现场。在进行现场保护的时候需要进行压栈(入栈)操作,恢复现场就要进行出栈操作。

压栈的指令为 PUSH,出栈的指令为 POP,PUSH 和 POP 是一种多存储和多加载指令,即可以一次操作多个寄存器数据,他们利用当前的栈指针 SP 来生成地址,PUSH 和 POP 的用法如下:

指令 描述
PUSH <reg_list> 将寄存器列表存入栈中
POP <reg_list> 从栈中恢复寄存器列表
  • 假如我们现在要将 R0~R3 和 R12 这 5 个寄存器压栈,当前的 SP 指针指向 0X80000000,处理器的堆栈是向下增长的,使用的汇编代码如下:
PUSH {R0~R3, R12}  @将R0~R3和R12压栈

压栈完成后的堆栈如图:

image-20230113223721098

  • 出栈的就是从栈顶,也就是 SP 当前执行的位置开始,地址依次减小来提取堆栈中的数据到要恢复的寄存器列表中。比如:
POP {R0~R3, R12}  @恢复R0~R3,R12

PUSH 和 POP 的另外一种写法是“STMFD SP!”和“LDMFD SP!”,上面的代码可以改为:

STMFD SP!, {R0~R3, R12}  @将R0~R3和R12压栈
LDMFD SP!, {R0~R3, R12}  @出栈,恢复R0~R3和R12

STMFD 可以分为两部分:STM 和 FD,同理LDMFD 也可以分为 LDM 和 FD。STM 和 LDM 就是多存储和多
加载,可以连续的读写存储器中的多个连续数据(区别于STR和LDR)。

FD 是 Full Descending 的缩写,即满递减的意思。根据 ATPCS 规则,ARM 使用的 FD 类型的堆栈,SP 指向最后一个入栈的数值,堆栈是由高地址向下增长的,也就是前面说的向下增长的堆栈,因此最常用的指令就是 STMFD 和 LDMFD。STM 和 LDM 的指令寄存器列表中编号小的对应低地址,编号高的对应高地址。

2.4 跳转指令

有多种跳转操作,比如:

  • 直接使用跳转指令 B、BL、BX 等。
  • 直接向 PC 寄存器里面写入数据。

上述两种方法都可以完成跳转操作,但是一般常用的还是 B、BL 或 BX,用法如下:

指令 描述
B <label> 跳转到label,如果跳转范围超过了+/-2KB,可以指定B.W <label>使用32位的跳转指令
BX <Rm> 间接跳转,跳转到存放于Rm中的地址处,并且切换指令集
BL <label> 跳转到标号地址,并将返回地址保存到LR链接寄存器中
BLX <Rm> 跳转到Rm指定的地址,并将返回地址保存到LR中,切换指令集

使用较多的是B指令和BL指令。

  • B指令:B 指令会将 PC 寄存器的值设置为跳转目标地址, 一旦执行 B 指令,ARM 处理器就会立即跳转到指定的目标地址。如果要调用的函数不会再返回到原来的执行处,那就可以用 B 指令,如下示例:
_start:
	ldr sp, =0x80200000  @设置栈指针
	b main   			 @跳转到main函数

上述代码就是典型的在汇编中初始化 C 运行环境,然后跳转到 C 文件的 main 函数中运行。

  • BL指令:在跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以通过将 LR 寄存器中的值重新加载到 PC 中来继续从跳转之前的代码处运行,这是子程序调用一个基本但常用的手段。比如 Cortex-A 处理器的 irq 中断服务函数都是汇编写的,主要用汇编来实现现场的保护和恢复、获取中断号等。但是具体的中断处理过程都是 C 函数,处理函数执行完毕后需要返回,恢复现场,比如:
push {r0, r1}  @ 保存r0, r1
cps #0x13      @ 进入SVC模式,允许其它中断再次进入

bl system_irqhandler  @加载C语言中断处理函数

cps #0x12             @ 进入IRQ模式
POP {r0, r1}          @ 出栈
str r0, [r1, #0x10]   @ 中断执行完成,写EOIR

2.5 算术运算指令

汇编进行算术运算,比如加减乘除,常用运算指令如下:

image-20230113230220692

2.6 逻辑运算指令

汇编语言也可以使用逻辑运算指令,常用的运算指令用法:

image-20230113230334757

本文转载于网络 如有侵权请联系删除

相关文章

  • 为什么只给隔离性设置了级别?

    提到数据库,你多半会联想到事务,进而还可能想起曾经背得滚瓜乱熟的ACID,不知道你有没有想过这个问题,事务有原子性、隔离性、一致性和持久性四大特性,为什么偏偏给隔离性设置了级别?被隔离的隔离性一切还得从事务说起。1.事务(transaction)的起源学习数据库事务的时候,一个典型的案例就是「转账」,这篇文章也不能免俗,故事就从招财向陀螺借100块钱开始吧。一个看似非常简单的现实世界的状态转换,转换成数据库中的操作却并没有那么单纯。这个看起来很简单的借钱操作至少包含了两个动作:陀螺的账户余额-100招财的账户余额+100要保证转账操作的成功,数据库必须把这两个操作作为一个逻辑整体来执行,这个逻辑整体就是一个事务。1.1.事务的定义事务就是包含有限个(单条或多条)数据库操作(增删改查)的、最小的逻辑工作单元(不可再分)。说到这里不得不吐槽一下,事务的英文是transaction,直译为“交易”的意思,但是不知道为什么被意译成了“事务”,让人很难从字面上理解这个概念的含义。中国人对翻译的“信达雅”的偏执在计算机领域或多或少有点不讨喜。1.2.哪些存储引擎支持事务并不是所有的数据库或者所有的

  • 【Oracle】什么?作为DBA,你竟然不会安装Oracle??

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:https://github.com/sunshinelyz/mykit-delay PS:欢迎各位Star源码,也可以pr你牛逼哄哄的代码。写在前面很长一段时间内,国内互联网公司都在提倡“去IOE”,但是很多企业还是愿意为昂贵的Oracle数据库买单,不少读者所在的公司也在用Oracle,很多读者自行安装Oracle数据库时,多多少少遇到了些问题,苦恼于几天下来还是没能解决问题。这不,不少读者跑来问我,让我输出一篇如何在物理机上安装Oracle的文章,最好是安装过程中不会出现各种“疑难杂症”。哈哈,这要求不过分,我周末也着实捣鼓了一番,不过我是安装在CentOS7/CentOS8虚拟机中的,效果和在物理机中一样,整个过程也算是小有所成吧!输出此文,记录捣鼓的过程,与各位Oracle开发者共勉。环境准备1.CentOS7/CentOS864位最小化安

  • 3分钟短文:Laravel写个命令行,你就是下一个Geek!

    引言习惯了在windows下敲敲点点的同学,习惯了没有窗口视图就无从下手的同学,来到linux第一个面临的问题就是,core发行版根本不提供gui,太费空间,太费资源,要啥窗口?所以电影里看到很多懂的,不懂的,懂的装不懂的,不懂的装懂的那么演员们,都在奋力敲击键盘,一串串荧幕输出像火箭似的飞速狂奔。这大概只有拷贝文件,或者debug时才能有的盛举吧。没错儿,在linux下,你是PC小白也好,是行业大神也罢,都得敲那么两下子,这叫——“专业”。本文给那些想写个命令行程序,体验一把geek范的同学一次机会,教你3分钟内迅速跻身geek之列。代码时间使用脚手架指令生成一个命令行类:phpartisanmake:consoleWelcomeNewUsers--command=email:newusers复制该指令在app/Console/Commands/文件夹下生成一个WelcomeNewUsers.php的类,因为使用了--command选项,所以类内指定了命令调用的名字。namespaceApp\Console\Commands; useIlluminate\Console\Comman

  • 在腾讯云服务器上如何发布自己的网站

    这篇文章教小白怎么在腾讯云服务器上如何发布自己的网站,做一个自己的网站很简单,做一个好站很难(领取腾讯云优惠券)腾讯云新客专属福利2860元代金券http://t.cn/EynQerH腾讯云热卖云产品3折起http://t.cn/E2j4VwJ2019新春采购节,30款云产品感恩回馈http://t.cn/ExAqp2x购买腾讯云服务器 选择windows操作系统 进入腾讯云服务器管理中心,在更多中选择重装系统-》服务市场-》基础环境-》php运行环境(windows2008...)wamp框架-》开始重装。 重装完成后,在本地电脑上点击开始——》输入mstsc回车——》输入服务器IP地址——》输入服务器登录密码——》进入远程服务器 进入服务器后打开localhost测试环境是否配置完成。 浏览器中输入localhost/phpadmin/打开数据库,完成数据库操作 数据库默认账号root密码websoft9, 打开文件地址如图片所示,把你的网站上传到此目录即可。更新你网站数据库配置和域名地址即可。

  • 【愚公系列】2022年10月 微信小程序-电商项目-收货地址功能实现

    文章目录前言一、收货地址功能实现二、效果前言在电商系统中,收货地址是必不可少的功能,没有收货地址用户在下单就没法收到货,而且一个用户会有多个收货地址,比如寄给自己,或者寄给别人。一搬在收货地址选择中会有个默认收货地址以防止每次下单都要选择地址。一、收货地址功能实现//miniprogram/pages/address-list/index.js Page({ /** *页面的初始数据 */ data:{ radio:0, selectedAddressId:0, addressList:[], slideButtons:[{ type:'warn', text:'删除' }] }, //选择地址 asynconSlideButtonTap(e){ //e.detail.index是选择按钮的序号 letid=e.currentTarget.dataset.id console.log('slidebuttontap',e.detail,id) letres=awaitwx.wxp.request4({ url:`http:

  • SpringCloud 源码系列(6)—— 声明式服务调用 Feign

    SpringCloud源码系列(1)——注册中心Eureka(上) SpringCloud源码系列(2)——注册中心Eureka(中) SpringCloud源码系列(3)——注册中心Eureka(下) SpringCloud源码系列(4)——负载均衡Ribbon(上) SpringCloud源码系列(5)——负载均衡Ribbon(下) SpringCloud源码系列(6)——声明式服务调用Feign   一、Feign基础入门 1、Feign概述 在使用SpringCloud开发微服务应用时,各个服务提供者都是以HTTP接口的形式对外提供服务,因此在服务消费者调用服务提供者时,底层通过HTTPClient的方式访问。我们可以使用JDK原生的URLConnection、Apache的HTTPClient、OkHttp、Spring的RestTemplate去实现服务间的调用。但是最方便、最优雅的方式是通过SpringCloudOpenFeign进行服务间的调用。 Feign是一个声明式的WebService客户端,它的目的就是让WebService调用更加简单。SpringC

  • [财务][数据化分析][帆软]行式报表-行式引擎适用于大数据量情形下。

    [财务][数据化分析][帆软]行式报表-行式引擎适用于大数据量情形下。   这个设计器,只能用FineReport搞。没关系的,FineBI里面可以兼容展示FineReport报表。 在公司采买的时候,如果资金上允许,请直接购买FineBI。 行式引擎适用于大数据量情况下。使用此引擎很多报表特性将不再支持,详细内容清查看文档相关章节。   通过配置工作目录连接FineBI并进行设计。    一、行式报表简介 https://help.finereport.com/doc-view-396.html 1.描述 在 行式报表 中,介绍了行式列表报表的制作方式,下面来介绍几个在行式报表下的典型应用示例。 在线视频教程请点击: 行式报表 2.索引 小节内容简介文档链接 条件属性 在满足一定条件下改变单元格的格式或者显示成不同的值。 添加预警,间隔背景色-条件 数据过滤 从大量的数据当中,获取到符合条件的数据。 筛选数据-过滤 数据排序 报表展示时,有些数据排序后显示更有层次。 排序 结果集筛选 通过

  • 幸福健康成功的人们所选择的50个生活方式

    幸福健康成功的人们所选择的50个生活方式 1.停止摄入咖啡因 尽管人们认为在咖啡因的帮助下他们状态更好,事实是,并没有。其实我们对咖啡因已经如此依赖使得我们使用它只是为了恢复原本的状态。当我们不使用咖啡因时,就会状态欠佳,变得心有余而力不足。 这难道不荒唐吗? 饮食健康、睡眠充足以及锻炼得宜,你的身体自然会提供比咖啡因所能提供的更多更好的能量给你。戒掉咖啡看看会怎样。你可能会遭受戒断期的头痛。但是过几天,你会感觉棒极了。 2.早中晚祈祷或冥想 在Genius网络策划活动最近的一次采访中,乔·波兰问托尼·罗宾斯,他通过做什么来集中注意力。“你冥想吗?你会怎么做?”乔问道。 “我不知道我在冥想。我不知道我想冥想及啥都不想,”托尼回答说,“我的目标是理清思路。” 并非全然的冥想,托尼有一套晨间惯例,包括几个呼吸练习以及想象技巧让他思路清晰及注意力集中。对我来说,我用祈祷和琢磨(我的冥想版本)作为同样的载体。 不管你采用什么方法,目标都应该是清晰和集中。今天你想如何? 在未来24小时内哪些事情最为重要? 我得到了最好的结果,因为我清晨的祈祷和冥想是有动机的;我下午的祈祷和冥想是有策略的;而我晚

  • 72Financial Management

    #include<stdio.h>  #include<stdlib.h>  #include<string.h>   intmain() {    doublemoney[12],average,sum;     inti;    while(scanf("%lf",&money[0])!=EOF)    {        sum=money[0];        for(i=1;i<12;i++)       {    &

  • 棘手的操作(bzoj 2333)

    Description 有N个节点,标号从1到N,这N个节点一开始相互不连通。第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: 将第x个节点的权值增加v A2 x v: 将第x个节点所在的连通块的所有节点的权值都增加v A3 v: 将所有节点的权值都增加v F1 x: 输出第x个节点当前的权值 F2 x: 输出第x个节点所在的连通块中,权值最大的节点的权值 F3: 输出所有节点中,权值最大的节点的权值   Input   输入的第一行是一个整数N,代表节点个数。 接下来一行输入N个整数,a[1], a[2], …, a[N],代表N个节点的初始权值。 再下一行输入一个整数Q,代表接下来的操作数。 最后输入Q行,每行的格式如题目描述所示。   Output 对于操作F1, F2,

  • Mac 中配置鼠标右键 Open Tabby here

    系统与偏好设置->扩展->访达->OpenTabbyhere 系统与偏好设置->键盘->快捷键->OpenTabbyhere 之后就可以在右键使用OpenTabbyhere了:

  • 【TcaplusDB知识库】TcaplusDB表数据缓写介绍

    【TcaplusDB知识库】TcaplusDB表数据缓写介绍 缓写功能介绍: 表数据缓写服务是指tcaplus的增量数据可以缓写到第三方系统(目前支持MySQL和Kafka),用作产品数据查询与分析。其原理为tcapsvr将(从启用缓写开始的)增量写入数据(基于tcaplusbinlog)同步到tcapdb,tcapdb再写入/更改到MySQL或者Kafka中。所以该功能必须保证tcapdb机器有访问MySQL或者Kafka的权限,如果是MySQL,还要有在Mysql建表的权限。否则改功能无法配置成功。 以缓写MySQL为例(Kafka入口跟配置步骤类似),配置方法为:进入表管理页面,找到相应的表,右边有"缓写"链接,即可配置缓写: 缓写页面如下,填入相应的参数即可配置缓写: 提交后会生成事务,配置服务。 其中: 缓写周期:代表数据用户可以接受的数据从Tcapdb同步到第三方系统的延迟,最小1s,这个值越大,代表用户对时延越不敏感。Tcapdb侧会对缓写周期时间窗口内的请求做去重(例如,1s内对同一个key有多次Replace操作,去重后只需要将最后一次Replace后的内容

  • Flume1.6+Kafka

    需求:   使用Flume读取Linux的文本文件,将文本文件中的数据发送到kafka 前置条件:   安装好zk集群,安装好kafka集群   配置Flume 1.在Flume官方下载最新的flume   wget  http://mirrors.shu.edu.cn/apache/flume/1.9.0/apache-flume-1.9.0-bin.tar.gz 2.解决flume安装包  cd/export/software/ tar-zxvf apache-flume-1.9.0-bin.tar.gz -C/export/servers/ cd/export/servers/ ln-sapache-flume-1.9.0-binflume su-root vi/etc/profile exportFLUME_HOME=/home/hadoop/export/severs/flume exportPATH=$PATH:$FLUME_HOME/bin 3.创建flume配置文件 cd/export/servers/flum

  • POJ 2236 Wireless Network

    题意:有n台电脑,分布在一个二维坐标系中,两台距离不超过d的电脑可以相互通信,初始所有的电脑都是坏的,给出一组操作,第一种操作是修复某台电脑,只有修好的电脑才可以互相通信,第二种操作是询问两台电脑是否可以直接或间接通信。   解法:并查集。将电脑间距离不超过d的两台电脑用无向边连接,当修复一台电脑时就把它和相邻的点合并,查询时只要看是否在一个集里就可以了。   代码: #include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack>

  • 试验删除RAC(ORA10G)节点

    1.环境概述   2.删除一个节点 本实验中以删除第二个节点为示例。 2.1删除数据库实例 在第一个节点上(存活的节点)上使用DBCA删除第二个节点的实例。 执行完以上操作可以看下crs_stat–t ,这时可以发现已经找不到第二个实例信息了。         2.2清除ASM实例 在第一个节点上(存活的节点)上执行。   检查前后两次对比:     删除ASM实例相关文件   删除ASM实例的初始化参数文件(被删除节点操作) 例如:rm-f/u01/oracle/product/10.2.0/asm_1/dbs/*ASM* 删除与ASM实例相关的日志文件(被删除节点操作) 例如:rm-f/u01/oracle/product/10.2.0/asm_1/admin/+ASM 备注:由于ASM实例文件和ORACLE文件使用的是一套,在这里这一步暂且不执行,先不删。     2.3删除监听   在存活节点上使用netca删除节点的

  • PL/SQL本地远程连接数据库

    记录自己在开发中只用一次,但是容易忘记的问题,PL/SQL-ORACLE配置远程数据库访问: 1,下载PL/SQL连接工具,链接:https://pan.baidu.com/s/1kVeeLNp密码:u2hi   2,解压压缩包,配置instantclient_11_2里的tnsnames.ora   3,配置机器对应的环境变量 NLS_LANG=SIMPLIFIEDCHINESE_CHINA.ZHS16GBK TNS_ADMIN=D:\install\PLSQL\instantclient_11_2   4,打开pl/sql进去后配置(工具--首选项--连接),       Oracle主目录名=D:\install\PLSQL\instantclient_11_2       OCI库=D:\install\PLSQL\instantclient_11_2\oci.dll   5,配置完成重新打开pl/sql进行登录连接。  

  • CSS中常用的函数

    一、CSS函数的用法   设置css的属性值时可以使用css函数,如果color:rgba(20,30,50,0.5),css中有很多这样的函数。 二、常用的CSS函数   a.calc()函数    这个函数是的可以计算容器的大小。如果设置容器的宽度:j main{ width:calc(100vh-3.5rem-8rem); }复制   b.fit-content()   这个函数允许我们设置一个根据元素的内容设置容器的大小且有一个最小值。  main{height:fit-content(8rem)}复制      如果元素的内容的高度大于8rem,则使用元素内容的高度,负责使用8rem作为高度。

  • Python title()、upper()、lower()方法--string

    描述 title()方法:将字符串中的单词“标题化”,即首字母大写,其余字母转化为小写。 upper()方法:将字符串中的小写字母转化为大写字母。 lower()方法:将字符串中的大写字母转化为小写字母。 语法 str.title() str.upper() str.lower() 复制   参数 NA 返回值 title():  返回一个首字母大写,其余字母均为小写的字符串 upper():返回一个字母全大写的字符串 lower():返回一个字母全小写的字符串 实例 #!/usr/bin/python3 new_str='hello,PYTHON' print(new_str.title()) print(new_str.upper()) print(new_str.lower()) 复制 输出: Hello,Python#首字母大写,其余小写 HELLO,PYTHON #转为字母全大写 hello,python#转为字母全小写 复制   note:在处理用户的输入时,我们无法保证用户输入的大小写,所以可以

  • 元旦的年前思绪(2021~2022)

    元旦的年前思绪(2021~2022) 2021年就要过去了啊,感觉从1918班到1922班,一切都太快了. 还没有忘记去年的元旦晚会,就要迎来今年的元旦晚会了. OI 退役狗竟然还记得有OI这个东西,还记得博客园(bushi 不过今年cj的竞赛很拉胯就是了,大家基本都回来搞学科力(我的竞争力又--) 旺财和lzf越来越强了,wyl手握银牌还是年级前30,蛤yujun和母鸡也应该能稳稳上线. 我每天和zzy苟且偷生,在晚一下课混日子,(我们都有光明的未来) 学科 分班之后竟然分到了jenny班,从憨憨到德育名师更多的还是不适应吧. 感觉其实也没有很严格,只是和过去自由放荡的日子反差太大了(我才不放荡/ww 好在学科也越来越好(除了物理和数学天天暴毙,语文波澜不定,化学生物赋分,英语要看运气),也没有其他的大问题 还有157天,未来可期,剩下能做的就是努力了! 感觉我好强\(QwQ\) GoodBye2021,Hello2022

  • 【异常】ORA-01536: space quota exceeded for tablespace

    ###Theerrormayexistin/src/main/resources/com/star/css/dao/sql/workflow.xml ###TheerrormayinvolveCOM.STAR.insertHistoryStep-Inline ###Theerroroccurredwhilesettingparameters ###SQL:insertintoWORKFLOWSTEPEN(WORKFLOWSTEPID_PK,BEGINDATE,WORKFLOWINSTANCEID_FK,ISMANUAL,DETAILMESSAGE,PROCESSORID,COMPLETEDATE,OPERATORID,OPERATEDATE,statusid,name_,code_,MEM,CREATEID,MODIFYID,MODIFYDT)values(?,?,?,?,?,?,?,?,?,1,?,?,?,?,?,?) ###Cause:java.sql.SQLException:ORA-01536:spacequotaexceededfortablespace'TBLCSS' ;u

  • 2.安装Spark与Python练习

    一、安装Spark 检查基础环境hadoop,jdk    配置文件、 环境变量           3.试运行python代码 二、Python编程练习:英文文本的词频统计1.准备文本2.统计每个单词出现的次数  3.结果写文件    

相关推荐

推荐阅读