汇编指令

实验1 Windows汇编语言开发环境

时光毁灭记忆、已成空白 提交于 2019-11-28 22:50:31
Windows 、 Linux 等现代操作系统都运行于 CPU 的保护模式下。学习保护模式的汇编语言编程,要选用合适的编译、调试工具,编译工具决定了汇编程序的语法、结构,而调试工具则能够帮助我们迅速查找程序中的错误,提高调试效率。 本实验指导书采用 Microsoft 公司的 MASM 6.14 作为编译工具, Microsoft Visual C/C++ 作为开发调试环境。 1.1 汇编程序结构 和其他语言一样,汇编语言的源程序也要符合一定的格式,才能被编译程序所识别和处理。学习和掌握这些格式,是进行汇编编程的第一步。 1.1.1 一个显示字符串的汇编程序 下面是一个简单的汇编程序。 ;程序清单:test.asm(在控制台上显示一个字符串) .386 .model flat, stdcall option casemap:none ; 说明程序中用到的库、函数原型和常量 includelib msvcrt.lib printf PROTO C :ptr sbyte, :vararg ; 数据区 .data szMsg byte “ Hello World! ” , 0ah, 0 ; 代码区 .code start: mov eax, OFFSET szMsg invoke printf, eax ret end start 1.1.2 程序格式 在源程序 test.asm 中

操作系统

孤街醉人 提交于 2019-11-28 21:35:18
C的内存分配 32bitCPU可寻址4G线性空间, 每个进程都有各自独立的4G逻辑地址, 其中0~3G是用户态空间, 3~4G是内核空间, 不同进程相同的逻辑地址会映射到不同的物理地址中. 其逻辑地址其划分如下: 正文段(code segment/text segment, .text段): 或称代码段, 通常是用来存放程序执行代码的一块内存区域. 这部分区域的大小在程序运行前就已经确定, 并且内存区域通常属于只读, 某些架构也允许代码段为可写, 即允许修改程序. 在代码段中, 也有可能包含一些只读的常数变量, 例如字符串常量等 . CPU执行的机器指令部分. ( 存放函数体的二进制代码 . ) 只读数据段(RO data, .rodata):只读数据段是程序使用的一些不会被改变的数据, 使用这些数据的方式类似查表式的操作, 由于这些变量不需要修改, 因此只需放在只读存储器中. 已初始化读写数据段(data segment, .data段):通常是用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. 常量字符串就是放在这里的, 程序结束后由系统释放(rodata—read only data). 已初始化读写数据段(RW data, .data):已初始化数据是在程序中声明, 并且具有初值的变量, 这些变量需要占用存储器空间,

Alientek I.MX6UL Linux Note,Welcom Come To Discuss

淺唱寂寞╮ 提交于 2019-11-28 20:21:58
第六章 Contex-A7 MPCore架构 Contex-A处理器运行模型   以前的ARM处理器有七种运行模式,现在有九种,新增加Monitor和Hyp运行模式。 模式 描述 USR(User) 用户模式,非特权模式,大部分程序运行的时候处于此模式 FIQ 快速中断模式,进入FIQ中断异常 IRQ 一般中断模式 SVC(Supervisor) 超级管理员模式,特权模式,宫操作系统使用 MON(Monitor) 监视模式,这个模式用于安全扩展模式,指用户安全 ABT(Abort) 数据访问终止模式,用于虚拟存储以及存储保护 HYP(Hyp) 超级监视模式,用于虚拟化扩展 UND(Undef) 未定义指令终止模式 SYS(System) 系统模式,用于运行特权级的操作系统任务 记忆(UFIS MAHUS) Contex-A寄存器组   ARM提供了16个32位通用寄存器(R0 R15)供软件使用,前15个(R0 R14)可以用作通用的数据存储,R15是程序计数器PC,用来保存将要执行的命令,ARM还提供了一个当前程序状态寄存器CPSR和一个备份程序寄存器SPSR,SPSR是CPSR的备份。 总结一下, Cortex-A内核寄存器组成如下(共43个): ①、 34个通用寄存器,包括 R15程序计数器 (PC),这些寄存器都是 32位的。 ②、 8个状态寄存器,包括 CPSR和

Android模拟器检测体系梳理

那年仲夏 提交于 2019-11-28 19:24:15
转自:https://www.wireghost.cn/2018/05/10/Android模拟器检测体系梳理/ 模拟器作为一种虚拟机,配合改机工具,能够以较低成本实现设备多开,因此而备受黑灰产的青睐。如何准确识别模拟器成为App开发中的一个重要模块,目前也有专门的公司提供相应的SDK供开发者识别模拟器。通过前段时间对模拟器检测技术的调研,希望能总结出一套特征挖掘的体系化方案。 模拟器概述 定义 安卓模拟器是一种可以运行在电脑上的虚拟设备,通过它可以实现应用的跨平台操作,让移动端APP无需任何改动即可在PC上执行。 特性 优势 随着技术的不断发展,目前模拟器基本已经能够完成手机90%以上的功能。此外,由于在PC端工作,与传统手机相比,具有以下几点优势: 更炫 :支持大屏幕、提供更炫酷的视觉效果,从而能够天然的将一些移动端由于适配成客户端应用; 易上手 :支持鼠标、键盘、手柄、摄像头等众多硬件外设,将操作方式从手指运动中解放出来,发挥外设的优势; 更强的性能 :通过模拟器可自定义配置性能参数,发挥PC硬件性能优势,跑分数据远超手机,使得高配游戏运行不再卡顿; 更好的操控性 :通过虚拟按键功能,能够将任意点触操作、震动、摇摇等手机独有操作映射到键盘的自定义按键,更加简易、便捷; 使用PC工具 :利用PC端其他辅助工具完成对移动端应用的支持,如通过按键精灵完成自动挂机等操作,解放双手;

汇编指令

巧了我就是萌 提交于 2019-11-28 17:08:26
GAS中每个操作都是有一个字符的后缀,表明操作数的大小。 C声明 GAS后缀 大小(字节) char b 1 short w 2 (unsigned) int / long / char* l 4 float s 4 double l 8 long double t 10/12 注意:GAL使用后缀“l”同时表示4字节整数和8字节双精度浮点数,这不会产生歧义因为浮点数使用的是完全不同的指令和寄存器。 操作数格式: 格式 操作数值 名称 样例(GAS = C语言) $Imm Imm 立即数寻址 $1 = 1 Ea R[Ea] 寄存器寻址 %eax = eax Imm M[Imm] 绝对寻址 0x104 = *0x104 (Ea) M[R[Ea]] 间接寻址 (%eax)= *eax Imm(Ea) M[Imm+R[Ea]] (基址+偏移量)寻址 4(%eax) = *(4+eax) (Ea,Eb) M[R[Ea]+R[Eb]] 变址 (%eax,%ebx) = *(eax+ebx) Imm(Ea,Eb) M[Imm+R[Ea]+R[Eb]] 寻址 9(%eax,%ebx)= *(9+eax+ebx) (,Ea,s) M[R[Ea]*s] 伸缩化变址寻址 (,%eax,4)= *(eax*4) Imm(,Ea,s) M[Imm+R[Ea]*s] 伸缩化变址寻址 0xfc(,%eax,4

汇编指令之STOS、REP

ⅰ亾dé卋堺 提交于 2019-11-28 16:34:37
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。23:28:13,23:28:19 作者By-----溺心与沉浮----博客园 STOS指令:讲Al/AX/EAX的值存储到[EDI]指定的内存单元   STOS BYTE PTR ES:[EDI]       简写为STOSB   STOS WORD PTR ES:[EDI]     简写为STOSW   STOS DWORD PTR ES:[EDI]     简写为STOSD 具体是AL/AX/EAX那就要看具体的宽度是多少, STOS指令同样受D位的影响(Direction Flag),当D位为1的时候,EDI的值会减,当D位为0时,EDI的值会加,前面的博文中有讲过,MOVS指令也是受D位影响 之前在往内存地址中写入东西时,都是用的DS:,这里用到EDI时,统一使用ES,段寄存器,还没涉及,暂且就先这样记住   MOV EAX,12345678   MOV EDI,18FF8C   STOS DWORD PTR ES:[EDI]   STOS WORD PTR ES:[EDI]   STOS BYTE PTR ES:[EDI] 按下F8,执行STOSD指令,仔细观察EDI的值 可以看到,在执行完STOSD指令后,EAX里的值往EDI所代表的地址编号里头写入后,EDI的值减去了4,再来看看STOSW,STOSB

volatile关键字浅析

风格不统一 提交于 2019-11-28 13:01:43
volatile关键字浅析 在并发编程中,volatile是很常用的一个修饰符。JDK官方文档是这么形容volatile的: The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes. A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable. 这里意思很明白,volatile在某些用途下比锁更方便,一个变量被声明为volatile,jvm能够保证所有的线程都看到的是一致的变量,也就说一个线程对一个共享变量修改,其他线程能够立即看到最新的值。 volatile在某些情况下可以代替锁,比synchronized成本和开销更低,因为不会引起线程的上下文切换,为什么上下文切换就会开销比较大,因为原来缓存的指令和数据都没用了,要重新加载指令和数据到缓存中,你说开销大不大。 1.首先看看可见性 volatile修饰的共享变量,当该变量发生写操作时,把该变量刷新到内存中

我的全栈之路-Java基础之Java概述与开发环境搭建

夙愿已清 提交于 2019-11-28 10:44:20
我的全栈之路-Java基础之Java概述与开发环境搭建 我的全栈之路 1.1 信息技术发展趋势 目前信息技术主要经历了互联网、移动互联网以及以大数据、云计算、物联网、人工智能区块为代表的新兴技术三个阶段。 互联网 互联网自从20世纪90年代逐渐兴起,主要是通过网络连接了世界各地的PC机,笔记本以及背后提供数据服务的大型服务器集群。 其中绝大多数PC机都运行着Windows,macOS操作系统,而服务器主要是以类Unix(CentOS,Ubuntu)占据主要市场。 依靠互联网成长起来的公司有Apple、Google、Amazon、Microsoft、Baidu、Alibaba、Tencent。 移动互联网 移动互联网主要从2010开始爆发式增长,主要是通过网络连接了世界各地的移动设备(最典型的就是手机),它们绝大多数都运行着Android,iOS操作系统。 依靠移动互联网成长起来的公司有小米、美团、滴滴、蚂蚁金服。 大数据、云计算 随着用户的爆发式增长,以海量数据为基础的大数据、云计算技术在Badu、Alibaba、Tencent等大型互联网公司有着广泛的商业应用场景。 物联网 物联网会以手机作为中枢,通过物联网连接所有的智能设备,包括智能家居、汽车、电视等嵌入式设备,目前小米、华为等在智能家居、电视、汽车等领域广泛布局,2019年8月华为发布了鸿蒙系统。 人工智能 人工智能(AI

缓冲区溢出实例(一)--Windows

不羁的心 提交于 2019-11-28 06:16:38
一、基本概念 缓冲区溢出:当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被填满从而覆盖了相邻内存区域的数据。可以修改内存数据,造成进程劫持,执行恶意代码,获取服务器控制权限等。 在Windows XP或2k3 server中的SLMail 5.5.0 Mail Server程序的POP3 PASS命令存在缓冲区溢出漏洞,无需身份验证实现远程代码执行。 注意,Win7以上系统的防范机制可有效防止该缓冲区漏洞的利用: DEP:阻止代码从数据页被执行; ASLR:随机内存地址加载执行程序和DLL,每次重启地址变化。 二、实验环境准备: SLMail 5.5.0 Mail Server ImmunityDebugger_1_85_setup.exe mona.py 下载地址: https://slmail.software.informer.com/download/ https://www.softpedia.com/get/Programming/Debuggers-Decompilers-Dissasemblers/Immunity-Debugger.shtml https://github.com/corelan/mona mona手册 https://www.corelan.be/index.php/2011/07/14/mona-py-the

深入浅出计算机组成原理学习笔记:CISC和RISC-为什么手机芯片都是ARM?(第29讲)

久未见 提交于 2019-11-28 03:50:58
一、引子 我在第5讲讲计算机指令的时候,给你看过MIPS体系结构计算机的机器指令格式。MIPS的指令都是固定的32位长度,如果要用一个打孔卡来表示,并不复杂。 第6讲的时候,我带你编译了一些简单的C语言程序,看了x86体系结构下的汇编代码。眼尖的话,你应该能发现,每一条机器码的长度是不一样的。 而CPU的指令集里的机器码是固定长度还是可变长度,也就是 复杂指令集(Complex Instruction SetComputing,简称CISC)和 精简指令集(Reduced Instruction Set Computing,简称RISC)这两种风格的指令集一个最重要的差别。那今天我们就来看复杂指令集和精简指令集之间的对比、差异以及历史纠葛。 二、CISC VS RISC:历史的车轮不总是向前的 1、人月神话 在计算机历史的早期,其实没有什么CISC和RISC之分。或者说,所有的CPU其实都是CISC。 虽然冯·诺依曼高屋建瓴地提出了存储程序型计算机的基础架构,但是实际的计算机设计和制造还是严格受硬件层面的限制。当时的计算机很慢,存储空间也很小。 《人月神话》这本软件工程界的名著,讲的是花了好几年设计IBM 360这台计算机的经验。IBM 360的最低配置,每秒只能运行34500条指令,只有8K的内 存。为了让计算机能够做尽量多的工作,每一个字节乃至每一个比特都特别重要。 所以