ASM

ASM 判定一个类,实现了指定接口

六月ゝ 毕业季﹏ 提交于 2020-03-02 16:40:07
ASM 判定一个类,实现了指定接口 技术支持 ASM 中,ClassReader 类:对已存在的进行解析,并提供获取类信息的方法。 通过 ClassReader ,实现对一个类的解析。 处理流程 依据如下流程,判断出一个类是否实现了某个接口: 循环判断是否实现目标接口 递归判断父接口是否存在目标接口 递归判断父类是否实现目标接口 具体实现 具体实现代码如下 : package utils; import org.objectweb.asm.ClassReader; import java.io.IOException; import java.util.Set; /** * 判断某类是否实现了指定接口集合 * * @author pengpj * @date 2018/11/27 */ public class SpecifiedInterfaceImplementionChecked { /** * 判断是否实现了指定接口 * * @param reader class reader * @param interfaceSet interface collection * @return check result */ public static boolean hasImplSpecifiedInterfaces(ClassReader reader, Set<String>

ASM

倾然丶 夕夏残阳落幕 提交于 2020-03-02 14:31:29
技术交流,DH讲解. 正式之前,我们看看寄存器和CPU的标志位: OD中的截图,下方的CPAZSTDO就是标志位. Delphi的FPU窗口,右边一列就是标志位. 为什么要给大家看标志位呢?因为ASM中的跳转语句都是由相应的标志位控制的. 而标志位又是由于以下的情况影响的: 1.运算结果为0,Zero Flag(ZF)被设定 2.运算结果太大或者太小,超容了,Carry Flag(CF)被设定 3.Sign Flag(SF)是运算结果的最高位发生变化的时候,结果为正SF=1,为负SF=0 4.指令无效时(al=+127, al+1爆 , al = -128 , al-1爆),Over Flag会被设定 5.运算造成结果的地位中1的个数是偶数个的时候Parity Flag会被设定 指令讲解: 具体指令之前,先说一下:reg代表寄存器,mem代表内存上的数(变量),imm代表立即数(常量) AND ,二元操作符,位与 合法形式 : 1 2 3 4 5 AND reg , reg AND reg , mem AND reg , imm AND mem , reg AND mem , imm 标志位 :总是清除OF和CF,根据结果来设置SF,ZF,PF. 来看个例子吧: 1 2 3 4 5 6 7 8 9 10 11 12 function TestAnd(a,b: Integer ):

ASMSupport局部变量的实现

只谈情不闲聊 提交于 2020-03-02 11:08:34
#局部变量的实现 git@osc地址 在字节码层面,每一个方法都有一个局部变量数组,用来存储当前方法的参数,在方法内声明的变量,如果是非静态方法还要存储当前方法实例的引用this。在我们平时使用java的时候,这个局部变量的大小是在源码编译成class的时候就确定了的,那么如何更高效的利用这个局部变量,并且合理分配每个变量对应在局部变量数组中的位置呢,下面我们就介绍ASMSupport是如何规划局部变量的,先看下面的代码。 代码1 public void method(boolean bool) { int prefix = 1; if(bool) { double d = 2.12; String s = "string"; ... } else { char c = 'a'; long l = 1L; } } 上面的的代码我们用作用域的方式表现出来如下图: 如果按照程序流程执行,很显然这里会有两种执行结果。分别是当bool为真的时候执行if语句块,当bool为false执行else语句块。如下图就是这两种情况的局部变量图 上面前局部变量中,前三个变量是共享的,发生变化的是第后面的变量,对于这两种执行情况,虽然声明的变量类型不同,并且变量字长是不同的,但是由于if和else两个程序块是并行的,所以局部变量中后三个位置是公用的。根据这种情况

Linux

对着背影说爱祢 提交于 2020-03-02 07:40:02
在linux内核的源代码中,以汇编语言编写的程序或程序段,有两种不同的形式。 第一种事完全的汇编代码,这样的代码采用.s作为文件的后缀。事实上,尽管是完全的汇编代码,现代的汇编工具也吸收了C语言的长处,也在汇编之前加上了一趟预处理,而预处理之前的文件则以.s为后缀。此类(.s)文件也和C程序一样,可以使用#include、#ifdef等等成分,而数据结构也一样可以在.h的文件中加以定义。 第二种是嵌在C程序中的汇编语言片断。虽然在ANSI的C语言标准中并没有关于汇编片段的规定,事实上各种实际使用的C编译中都作了这方面的扩充,而 GNU的C编译gcc也在这方面作了很强的扩充。 在DOS/windows领域中,386汇编语言都采用Intel定义的语句格式。可是,在Unix领域中,采用的却是由AT&T定义的格式。 AT&T的汇编与Intel的汇编主要有以下的区别: 在Intel格式中大多使用大写字母,而在AT&T格式中都使用小写字母。 在AT&T格式中,寄存器名要加上“%”作为前缀 ,而在Intel格式中不带前缀。 在AT&T的386汇编语言中,指令的源操作数的顺序与在Intel的386汇编语言中正好相反。 在AT&T格式中,访问指令的操作数的宽度有操作码名称的最后一个字母(操作码的后缀决定)。用作操作码后缀的字母有b(8位)。 w(16位)和1(32位)。 而在Intel格式中

__asm__ __volatile__ GCC的内嵌汇编语法 AT&T汇编语言语法

徘徊边缘 提交于 2020-03-02 06:40:07
开 发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限 制,使用精练的汇编可以缩小目标代码的Size。另外,对于某些需要被经常调用的代码,使用汇编来写可以提高性能。所以我们必须了解汇编语言,即使你有可 能并不喜欢它。 如果你是计算机专业的话,在大学里你应该学习过Intel格式的8086/80386汇编,这里就不再讨论。如果我们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,因为GCC/GAS只支持这种汇编语法。 本书不会去讨论8086/80386的汇编编程,这类的书籍很多,你可以参考它们。这里只会讨论AT&T的汇编语法,以及GCC的内嵌汇编语法。 -------------------------------------------------------------------------------- 0.3.2 Syntax 1.寄存器引用 引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。 80386有如下寄存器: 8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp; 8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,

最牛X的GCC 内联汇编

别说谁变了你拦得住时间么 提交于 2020-03-02 05:55:44
1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本。 发布这篇文档是希望它能够帮助别人,但是没有任何担保;甚至不包括可售性和适用于任何特定目的的担保。关于更详细的信息,可以查看 GNU 通用许可证。 1.2 反馈校正 请将反馈和批评一起提交给 Sandeep.S。我将感谢任何一个指出本文档中错误和不准确之处的人;一被告知,我会马上改正它们。 1.3 致谢 我对提供如此棒的特性的 GNU 人们表示真诚的感谢。感谢 Mr.Pramode C E 所做的所有帮助。感谢在 Govt Engineering College 和 Trichur 的朋友们的精神支持和合作,尤其是 Nisha Kurur 和 Sakeeb S 。 感谢在 Gvot Engineering College 和 Trichur 的老师们的合作。 另外,感谢 Phillip , Brennan Underwood 和 colin@nyx.net ;这里的许多东西都厚颜地直接取自他们的工作成果。 2. 概览 在这里,我们将学习 GCC 内联汇编。这里内联表示的是什么呢?

AT&T的汇编格式&X86内联汇编

徘徊边缘 提交于 2020-03-02 04:47:09
AT&T的汇编格式 一 基本语法 语法上主要有以下几个不同. ★ 寄存器命名原则 AT&T: %eax Intel: eax ★源/目的操作数顺序 AT&T: movl %eax,%ebx Intel: mov ebx,eax ★常数/立即数的格式 AT&T: movl $_value,%ebx Intel: mov eax,_value 把_value的地址放入eax寄存器 AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d ★ 操作数长度标识 AT&T: movw %ax,%bx Intel: mov bx,ax ★寻址方式 AT&T: immed32(basepointer,indexpointer,indexscale) Intel: [basepointer + indexpointer*indexscale + imm32) Linux工作于保护模式下,用的是32位线性地址,所以在计算地址时不用考虑segment:offset的问题.上式中的地址应为: imm32 + basepointer + indexpointer*indexscale 下面是一些例子: ★直接寻址 AT&T: _booga ; _booga是一个全局的C变量 注意加上$是表示地址引用,不加是表示值引用. 注:对于局部变量,可以通过堆栈指针引用. Intel

rhel 7安装oracle 11gr2 rac 遇到的问题

 ̄綄美尐妖づ 提交于 2020-02-29 15:41:03
rhel7 安装11g r2 rac的方法跟之前的还是有很大的区别,以至于遇到很多坑,这里汇总下: 1、共享磁盘udev 绑定方式 这个跟rhel7 之前的版本不一样,特别是磁盘uuid命令方式变化了很多,udev启动方式也发生了变化, for disk in `ls /dev/sd*` do echo $disk /usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=$disk done 映射文件: cat /etc/udev/rules.d/99-oracle-asmdevices.rules KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="36000c298981418c7e8a25a89d0f836c9", SYMLINK+="asm-diskb", OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT==

oracle 19c asm filter driver的使用

末鹿安然 提交于 2020-02-28 21:01:30
从 12.1.0.2开始, oracle 提供了一个 afd的东西,来替代 asm lib库和 udev 用于asm磁盘的处理。 也就是说,从12.1.0.2开始,要配置asm,在磁盘上,可以不用去配置 udev ,或者安装 asmlib程序了,直接使用 afd即可搞定,这个afd是随oracle安装程序自带的,不需要到其他地方去下载,关键是使用 afd,启用了 filter后,root用户使用 dd 也不能破坏 disk ,这点不错。下面我们在19c下面来操作一下 : 1.Log in as the root user and set the environment variable $ORACLE_HOME to the location of the Grid home and the environment variable $ORACLE_BASE to a temporary location. su root set ORACLE_HOME=/u01/app/19.1.0/grid set ORACLE_BASE=/tmp You set $ORACLE_BASE to a temporary location to avoid creating diagnostic or trace files in the Grid home before the Oracle

区块链100讲:深入了解以太坊虚拟机的汇编代码基础

五迷三道 提交于 2020-02-28 15:57:04
Solidity提供了很多高级语言的抽象概念,但是这些特性让人很难明白在运行程序的时候到底发生了什么。我阅读了Solidity的文档,但依旧存在着几个基本的问题没有弄明白。 string, bytes32, byte[], bytes之间的区别是什么? 该在什么地方使用哪个类型? 将 string 转换成bytes时会怎么样?可以转换成byte[]吗? 它们的存储成本是多少? EVM是如何存储映射( mappings)的? 为什么不能删除一个映射? 可以有映射的映射吗?(可以,但是怎样映射?) 为什么存在存储映射,但是却没有内存映射? 编译的合约在EVM看来是什么样子的? 合约是如何创建的? 到底什么是构造器? 什么是 fallback 函数? 我觉得学习在以太坊虚拟机(EVM)上运行的类似Solidity 高级语言是一种很好的投资,有几个原因: Solidity不是最后一种语言。更好的EVM语言正在到来。(拜托?) EVM是一个数据库引擎。要理解智能合约是如何以任意EVM语言来工作的,就必须要明白数据是如何被组织的,被存储的,以及如何被操作的。 知道如何成为贡献者。以太坊的工具链还处于早期,理解EVM可以帮助你实现一个超棒的工具给自己和其他人使用。 智力的挑战。EVM可以让你有个很好的理由在密码学、数据结构、编程语言设计的交集之间进行翱翔。 在这个系列的文章中