汇编指令

02 编程语言与Python介绍

别等时光非礼了梦想. 提交于 2020-01-19 04:43:19
编程语言与Python介绍 一 引子 二 编程语言分类 2.1 机器语言 2.2 汇编语言 2.3 高级语言 2.3.1 编译型(如C语言) 2.3.2 解释型(如python) 2.4 总结 三 Python介绍 3.1 Python解释器的发展史 3.2 Python解释器有哪些种类? 四 安装Cpython解释器 4.1、下载python解释器 4.2、安装python解释器 4.3、测试安装是否成功 五 第一个Python程序 5.1 运行python程序有两种方式 5.2 Python执行程序的三个阶段 5.3 注释 六 IDE工具Pycharm的使用 6.1 什么是IDE?为什么要有IDE? 6.2 pycharm安装 6.3 Pycharm 创建文件夹 6.4 创建文件并编写程序执行 一 引子 基于上一章所学,有了计算机硬件,在在硬件之上安装好操作系统,我们就有了一个应用程序的运行平台,我们接下来的任务就是学习如何用某款编程语言来开发应用程序。 本章的主题是带大家熟悉一下编程语言,然后重点介绍python这门编程语言。 二 编程语言分类 2.1 机器语言 机器语言是站在计算机(奴隶)的角度,说计算机能听懂/理解的语言。 而计算机能直接理解的就是二进制指令,所以机器语言就是直接用二进制编程。 这意味着机器语言是直接操作硬件的,因此 机器语言属于低级语言 。

JVM 线程中方法执行过程

倖福魔咒の 提交于 2020-01-18 09:56:23
本章节内容参考:《深入理解Java虚拟机》 运行时数据区: 本次只介绍用于程序运行的线程私有的内存模型。 虚拟机栈(FILO):java方法执行的内存模型。   栈帧(线程执行的一个方法的内存模型,每调用一个方法,压入一个栈帧)    局部变量表:编译器可知的8种基本类型、reference类型、returnAddress类型   操作数栈:一个用于计算的临时数据存储区(明显,此栈是为了存放要操作的数据用的)    动态链接:支持java多态   返回地址:方法结束的地方。return/Exception 本地方法栈:Native方法执行的内存模型。 程序计数器:这个计数器记录的是正在执行的虚拟机字节码指令的地址(如果线程正在执行的是一个java方法)。 字节码解释器工作时,就是通过改变这个计数器的值来选取需要执行的字节码 指令(分支,循环,跳转、异常处理、线程恢复) 线程中,方法A调用方法B。 线程的执行的过程:    1、线程开始,分配虚拟机栈大小(JVM参数 -Xss:大小,1.5+默认1M), 2、执行方法A时,创建一个栈帧A压入虚拟机栈顶,根据程序计数器中的记录的下一个要执行的字节码指令的地址,找到并执行指令(将要操作的数据压入操作数栈栈顶,将操作结果放入局部变量表中,详细过程参照下面“合代码演示”部分)。 3、中间调用方法B,则创建栈帧B,接着执行方法B的指令

ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)

痴心易碎 提交于 2020-01-18 02:00:49
原地址:https://www.cnblogs.com/zengjfgit/p/4377243.html 作者:zengif 说明: 1、本文参考的书籍《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》中的Chapter A5: ARM Instruction Set Encoding. 2、本人对本文最终效果中的表格缩进没有对齐的现象表示歉意,因为目前本人解决不了 :) 3、本文的解读流程如下: 1、Format of the CPSR and SPSRs:因为CPSR中有影响指令执行的条件标志; 2、The major subdivisions of the ARM instruction set:这里细分ARM指令为7个种类; 3、The condition code field:对指令中的条件位域进行了解读; 4、Data-processing and miscellaneous instructions:针对the major subdivisions of the ARM instruction set中的7中ARM指令种类,对第一种“Data-processing and miscellaneous instructions”进行了解读; 5、Data-processing (register

volatile深度解析

南楼画角 提交于 2020-01-17 09:03:53
volatile深度解析 volatile是什么 volatile是Java虚拟机提供的 轻量级 的 同步机制 。它有三个特征: 保证可见性 不保证原子性 禁止指令重排 想要理解volatile的工作机制首先要了解JMM,java memory model,即java内存模型。 Java内存模型(JMM) JMM本身是一种抽象的概念,并不真实存在。它描述的是一组 规则或规范 ,通过这组规范定义了程序中各个 变量 (包括实例字段、静态字段和构成数组对象的元素)的 访问方式 。 注意,JMM只是一种规则,在java多线程情况下,如果 不做任何处理 ,每个线程都有自己的工作内存,如果访问主内存中的变量,将会从主内存中拷贝一份到工作内存,即使在某个线程的工作内存中做了修改, 没有刷新回主内存 ,那么对其他线程来说这个修改将是不可见的。具体如下图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u6DHsKZd-1578637312474)(https://i.bmp.ovh/imgs/2019/06/5d19bc34bec03701.png)] 所以为了保证每个线程对主内存中的变量的修改对其他线程是可见的,就要引入volatile关键字。volatile不能保证原子性,但可以保证可见性和有序性(禁止指令重排)。 验证volatile可见性 class

汇编 push ,pop指令

天大地大妈咪最大 提交于 2020-01-17 05:22:16
知识点:  PUSH  POP  CALL堆栈平衡  RETN指令 一、PUSH入栈指令 (压栈指令): 格式: PUSH 操作数 //sub esp,4 ;mov [esp],EBP 操作数可以是寄存器,存储器,或者立即数 二、POP出栈指令 (弹栈指令) 格式:POP 操作数 //mov EBP,[esp] ;add esp,4 操作数是寄存器,或者存储器,不能是立即数 三、代码分析 1、测试PUSH和POP 与ESP栈顶指针的关系 2、CALL与ESP的关系 3、总结栈的特点(后进先出) [EBP-??] // 局部变量 [ EBP+??] //上一个CALL 局部变量, 上一个CALL传入参数 CALL PUSH EIP RETN POP EIP 来源: https://www.cnblogs.com/whzym111/p/6365966.html

Linux内核分析课程笔记(一)

牧云@^-^@ 提交于 2020-01-17 02:29:49
linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机。 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连。CPU上有一些寄存器,IP(Instruction Pointer)是一个指针,总是指向内存的某一块区域CS(Code Segment),CPU即从IP指向的地址取一条指令进行执行,执行完之后IP自增1,加到下一条指令(逻辑意义上的1,因为有些指令系统是变长指令) 从程序员的角度来看,存储程序计算机。CPU从程序员的角度可以抽象成一个无条件的for循环,总是执行下一条指令。 for(;;){ next instruction(); } API(Application Program Interface) ABI(Application Binary Interface) 32位的x86中EIP的三条特性: 每条指令执行完成后EIP自加1 指令的长度不同 EIP还可能会被一些指令修改,如:CALL、RET、JMP以及条件JUMP x86汇编基础 x86寄存器 有8位、16位和32位的寄存器。 16位:AX、BX、CX、DX、BP、SI、DI、SP 32位:EAX(累加器)、EBX(基地址寄存器)、ECX(计数寄存器)、EDX(数据寄存器)、EBP(堆栈基址指针)、ESI与EDI(变址寄存器)

中断&异常

五迷三道 提交于 2020-01-16 04:00:33
中断分类      类别 原因 返回行为 例子 广义 中断 异步中断 ( 狭义中断 ) 中断 ( interrupt) 可屏蔽中断 来自 I/O 设备的信号 总是返回到下一条指令 所有的 IRQ 中断 不可屏蔽中断 电源掉电和物理存储器奇偶校验 同步中断 ( 也称异常 ) 陷阱 (trap) 有意的异常 总是返回到下一条指令 系统调用、信号机制 ( 通过软中断实现 ) 故障 (fault) 潜在可恢复的错误 返回到当前指令 缺页异常、除 0 错误、段错误 终止 (abort) 不可恢复的错误 不会返回 硬件错误 注: 80386有两根引脚INTR和NMI接受外部中断请求信号,INTR接受可屏蔽中断请求。在80386中,标志寄存器EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。 中断的定义( wikipedia ) 中断 是指由于接收到来自外围硬件(相对于 中央处理器 和 内存 )的 异步 信号或来自 软件 的 同步 信号,而进行相应的硬件/软件处理。硬件中断导致处理器通过 一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令(汇编中的int 指令),以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。软中断陷入内核,常被用于实现系统调用(int 80等)。

通过汇编指令影响标志寄存器位

筅森魡賤 提交于 2020-01-16 03:27:45
1、进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。 2、奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。 如果 最低有效字节 “1”的个数为偶数,则PF的值为1,否则其值为0。 3、辅助进位标志AF(Auxiliary Carry Flag): 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0: (1)、在字操作时,发生低字节向高字节进位或借位时; (2)、在字节操作时,发生低4位向高4位进位或借位时。 4、零标志ZF(Zero Flag):零标志ZF用来反映运算结果是否为0。 如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。 5、符号标志SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。 如果最高位为1,则SF为1,否则为0 6、溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。 如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。 OF与CF的区别在于, OF表示有符号数运算结果是否超出范围 CF表示无符号为运算结果是否超出范围 溢出主要是给有符号运算使用的,在有符号的运算中,有如下的规律

汇编语言

强颜欢笑 提交于 2020-01-15 05:59:41
文章目录 1.8086的寻址方式 1.1 立即数寻址方式 1.2 寄存器寻址方式 1.3 存储器寻址方式 1.4 数据寻址寻址方式 2.8086 指令系统 2.1 数据传送指令 2.2算数运算类指令 2.3位操作指令 2.4控制转移指令 2.5处理机控制类指令 3.汇编语言程序格式 3.1 参数、变量和符号 3.2 复杂数据结构 3.2 汇编语言程序开发 程序题: 汇编语言:求最大值 统计二进制中1的个数(汇编) 1.8086的寻址方式 1.1 立即数寻址方式 1.2 寄存器寻址方式 1.3 存储器寻址方式 1.4 数据寻址寻址方式 2.8086 指令系统 2.1 数据传送指令 MOV(传送指令) XCHG(交换指令) XLAT(换码指令) PUSH(进栈指令) POP(出栈指令) LAHF(标志送AH指令) SAHF(AH送标志指令) PUSHF(标志进栈指令) POPF(标志出栈指令) LEA (有效地址传送指令) LDS/LES(指针传送指令) 2.2算数运算类指令 CF(进位指令) OF(溢出指令) INC(增量指令) DEC(减量指令) ADD(加法指令) SUB(减法指令) MUL(无符乘法指令) IMUL(有符乘法指令) DIV(无符除法指令) IDIV(有符除法指令) 2.3位操作指令 逻辑运算指令: AND(逻辑与指令) OR(逻辑或指令) XOR(逻辑异或指令)

CPU指令集架构基础学习

你说的曾经没有我的故事 提交于 2020-01-14 23:17:51
在最初接触C/C++的时候,我对程序编译后的指令非常着迷,循序渐进的学习了C/C++语言编译器生成汇编语言的模式。 就像是语言翻译一样,我们需要做到直接阅读x86等汇编代码,并且能够将其还原成原始的C/C++语句,这是学习逆向最有效的方法。 CPU是执行程序机器码的硬件单元,相关概念包括以下几项: **指令码:**是CPU处理的底层命令,典型的底层命令有:将数据在寄存器之间转移,操作内存,计算数值等指令,每一类CPU都有自己的指令集架构,CPU品牌有Intel,AMD,IBM和Cyrix,IDT,VIA威盛,国产龙芯等。 **汇编语言:**为了让程序员少掉头发而创造出来的,是人类可以易于读写。 **CPU寄存器:**每一种CPU都有其固定的通用寄存器(GPR),x86的CPU中有8个GPR,x64里面有16个GPR,ARM中有16个GPR,CPU寄存器就是一种存储单元,他可以无差别存储所有类型的临时变量,如果写一个程序只用到了8个32位变量,CPU自带的寄存器就可以完成任务。 需要一种将高级编程语言转成CPU可以处理的底层机器语言,这种程序就是编译器(Compiler)。 0x01 指令集架构 x86的指令集架构中,opcode(汇编指令对应的机器码)长度是不同的。 ARM属于RISC(精简指令集)架构 CPU,这种指令集在设计之初就力图保持各个opcode长度一致,最初的时候