汇编指令

AT&T下汇编语法

柔情痞子 提交于 2020-01-26 03:12:45
mov movl mov long : 32bits movw mov word : 16bits movb mov byte : 8bits movsb 字符串传输指令 把DS:SI这个地址的N个字节复制到ES:DI这个地址上 lea 取有效地址(偏移量) lea ignore_int, %edx 表示把ignore_int处的有效地址传给edx( note:是去ignore_int处的偏移量,而不是ignore_int处存储的内容 ) lds 使用方法: lds mem,reg 代表意义:mem代表偏移地址,reg代表寄存器;把mem的低字节放入到reg中,mem的高字节放入ds中 les 使用方法: les mem,reg 代表意义:mem代表偏移地址,reg代表寄存器;把mem的低字节放入到reg中,mem的高字节放入es中 lfs lgs lss 同lds、les的用法相同,只不过高字节存入的寄存器不同 push 将栈指针sp移动,然后将数据保存到堆栈中( note:push总是先压入高地址,再压入低地址 ) 下面执行的过程是 ax = 0xff11; sp = sp - 2, 保存ax到栈空间 movb ff11h,%ax push %ax pop 与push相反 call 暂时就先理解为函数调用吧 call xxx(xxx 为标号

一步步学习汇编系列(7)

夙愿已清 提交于 2020-01-24 21:45:29
寄存器(内存访问) 从访问内存的角度继续学习几个寄存器 首先理解几个要点: 1. 内存中字的存储 n 在 0 地址处开始存放 20000 : n 0 号单元是低地址单元, 1 号单元是高地址单元。 备注:任何两个地址连续的内存单元, N 号单元和 N+1 号单元,可以将它们看成两个内存单元 ,也可以看成一个地址为 N 的字单元中的高位字节单元和低位字节单元。 2. DS 和 [address] n CPU 要读取一个内存单元的时候,必须先给出这个内存单元的地址; n 在 8086PC 中,内存地址由段地址和偏移地址组成。 n 8086CPU 中有一个 DS 寄存器,通常用来存放要访问的数据的段地址。 n 例如:我们要读取 10000H 单元的内容可以用如下程序段进行: mov bx,1000H mov ds,bx mov al,[0] n 上面三条指令将 10000H ( 1000:0 )中的数据读到 al 中。 mov 指令的格式: mov 寄存器名,内存单元地址 “[…]” 表示一个内存单元, “[…]” 中的 0 表示内存单元的偏移地址。 那么内存单元的段地址是多少呢?就是上面的 ds 备注: 8086CPU 不支持将数据直接送入段寄存器的操作, ds 是一个段寄存器。 (硬件设计的问题) mov ds,1000H 是非法的。 数据-一般的寄存器-段寄存器 明白了以上原理

深入理解计算机系统(5.1)------优化程序性能

有些话、适合烂在心里 提交于 2020-01-24 04:56:09
  你能获得的对程序最大的加速比就是当你第一次让它工作起来的时候。   在讲解如何优化程序性能之前,我们首先要明确写程序最主要的目标就是使它在所有可能的情况下都能正常工作,一个运行的很快的程序但是却是错误的结果是没有任何用处的,所以我们在进行程序性能优化之前,首先要保证程序能正常运行,且结果是我们需要的。   而且在很多情况下,让程序跑的更快是我们必须要解决的问题。比如一个程序要实时处理视频帧或者网络包,那么一个运行的很慢的程序就不能解决此问题。再比如一个计算任务计算量非常大,需要数日或者数周,如果我们哪怕只是让它运行的快20%也会产生重大影响。 1、编写高效程序的切入点   ①、选择一组合适的算法和数据结构。   ②、编写出编译器能够有效优化以转换成高效可执行的源代码。   ③、多线程并行处理运算。   对于第一点,程序=数据结构+算法,选择合适的数据结构和算法无疑对于提高程序的运行效率有很大的影响。第二点对于编程者则需要理解编译器的优化能力以及局限性,编写程序看上去只是一点小小的改动,可能都会引起编译器优化方式很大的变化;第三点技术主要这对运算量特别大的运算,我们将一个大的任务分成多个小任务,这些任务又可以在多核和多处理器的某种组合上并行的计算,这里我们也需要知道,即使是利用并行性,每个并行的线程都要以最高性能的方式执行。 2、编译器的优化能力和局限性   正确性,正确性

内存模型

你说的曾经没有我的故事 提交于 2020-01-24 03:52:45
在 C++11 标准中,一个重大的更新就是引入了 C++ 多线程内存模型。本文的主要目的在于介绍 C++ 多线程内存模型涉及到的一些原理和概念,以帮助大家理解 C++ 多线程内存模型的作用和意义。 1. 顺序一致性模型 (Sequential Consistency) 在介绍 C++ 多线程模型之前,让我们先介绍一下最基本的顺序一致性模型。对多线程程序来说,最直观,最容易被理解的执行方式就是顺序一致性模型。顺序一致性的提出者 Lamport 给出的定义是: “… the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program.” 从这个定义中我们可以看出,顺序一致性主要约定了两件事情: (1). 从单个线程的角度来看,每个线程内部的指令都是按照程序规定的顺序 (program order) 来执行的 ; (2). 从整个多线程程序的角度来看

查看Java的汇编指令

帅比萌擦擦* 提交于 2020-01-22 11:03:29
查看Java的汇编指令 通过javap 命令,可以将字节码文件反编译。如通过下面的命令: javap -c Xxxx.class 而有时候想看某些JDK底层实现,发现反编译得到的代码并没有什么帮助,因此本文介绍如何查看Java的汇编指令,查看Java代码最真实的运行细节。 Java本身提供这个支持,但需要引入而外的包( hsdis-amd64.dylib )。 Mac下: https://github.com/evolvedmicrobe/benchmarks/blob/master/hsdis-amd64.dylib 下载下来后,将其放置到jre lib目录下即可。 查看Java的汇编指令 1、可以使用命令 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly Main (Main是class文件) 2、在IDEA配置VM options,打印汇编指令,如下图。 -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly 这种方式,在运行程序时,直接在控制台打印汇编指令。 如果遇到: Java HotSpot(TM) 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to

问答题

亡梦爱人 提交于 2020-01-21 23:54:41
一、C语言有什么缺陷 我认为c语言的缺陷有语法定义不严格,运算符和运算优先级过多(不便于记忆)。语法不严格体现在,假如你写同样一个程序,在Java里面会报错,而在c语言里面是不会报错的。比如C语言中你可以将一个浮点型数据赋给一个整型变量,编译时只会警告,因为会丢失精度,但是在 Java 中这样写就会报错,它在语法上就禁止你这样写。这样就会导致你编写的程序会有很多漏洞,黑客往往会抓住这些漏洞进行攻击。也就是说,c语言危险性比较高。这也是为什么c语言比较难学的原因,因为你编写完一个程序很可能就是错的,但又很难发现。 二、简述一下C语言/C++的编译过程 1.预处理 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理。 ①将所有的“#define”删除,并且展开所有的宏定义。 ②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。 ③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。 (注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件) 删除所有的注释。 添加行号和文件名标识。 保留所有的#pragma编译器指令。 2.编译

程序执行的过程 - 一文看懂计算机执行程序的过程

旧街凉风 提交于 2020-01-20 13:15:53
程序就是指令的集合,为使计算机按预定要求工作,首先要编制程序。程序是一个特定的指令序列,它告诉计算机要做哪些事,按什么步骤去做。指令是一组二进制信息的代码,用来表示计算机所能完成的基本操作。   1、程序   程序是为求解某个特定问题而设计的指令序列。程序中的每条指令规定机器完成一组基本操作。如果把计算机完成一次任务的过程比作乐队的一次演奏,那么控制器就好比是一位指挥,计算机的其它功能部件就好比是各种乐器与演员,而程序就好像是乐谱。计算机的工作过程就是执行程序的过程,或者说,控制器是根据程序的规定对计算机实施控制的。例如,对于算式      计算机的解题步骤可作如下安排:   步骤1:取a ;   步骤2:取b ;   步骤3:判断 ;   若 b≥0,执行步骤4   若b<0,执行步骤6   步骤4:执行a+b;   步骤5:转步骤7;   步骤6:执行a-b;   步骤7:结束。   计算机的工作过程可归结为:取指令→分析指令→执行指令→再取下一条指令,直到程序结束的反复循环过程。通常把其中的一次循环称为计算机的一个指令周期。总之,我们可把程序对计算机的控制归结为每个指令周期中指令对计算机的控制。   2、指令   程序是由指令组成的。指令是机器所能识别的一组编制成特定格式的代码串,它要求机器在一个规定的时间段(指令周期)内,完成一组特定的操作

第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

邮差的信 提交于 2020-01-20 13:14:56
姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 一、存储程序计算机 1.1冯诺依曼体系结构:即具有存储程序的计算机体系结构 目前大多数拥有计算和存储功能的设备(智能手机、平板、计算机等)其核心构造均为冯诺依曼体系结构 从硬件来看 CPU与内存通过主线连接,CPU上的IP(可能是16、32、64位)总指向内存的某一块区域;IP指向的CS(代码段)也在内存中;CPU总是执行IP指向的指令。 2. 从软件来看 API(应用程序编程接口,与编程人员)与ABI(程序与CPU的借口界面) 是两个比较重要的软件接口 1.2 关于ABI:指令编码;指令中涉及的寄存器布局;大多数指令可以直接访问内存 1.3 (E代表32位系统)EIP在CPU执行完一条指令之后自加一(自动加一条指令,而不是一个字节或是32位),当然也可以被其它指令,如CALL,RET等修改 二、x86汇编基础 2.1 x86(32位)的寄存器中,低16位作为16位register 2.2 关于堆栈段寄存器 EBP(堆栈基址寄存器);ESP(堆栈顶指针寄存器)。上述两个寄存器较为频繁地使用于汇编程序中 2.3 关于代码段寄存器 CPU实际取指令的时候通过cs

[转载] 32位汇编指令笔记

守給你的承諾、 提交于 2020-01-19 23:15:54
32位CPU所含有的寄存器有: PQJI~u9te} 4个数据寄存器(EAX、EBX、ECX和EDX) <,\Op=$l3I 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) ']'V?@H]4 6个段寄存器(ES、CS、SS、DS、FS和GS) ZaKT~f%%z 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) f*HEw 1、数据寄存器 s ~ Xa= +D 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 3Gyw^ {J 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 {!]7=K)W9 对低16位数据的存取,不会影响高16位的数据。 COnb@uD 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 90rY:!e 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 ~bsL W:.’ 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 %‘L+y 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高; E

ARM 汇编基础

你。 提交于 2020-01-19 18:47:10
转载连接: 1 ARM汇编以及汇编语言基础介绍 2 ARM汇编中的数据类型 3 ARM汇编常用指令集 4 ARM汇编内存访问相关指令 5 ARM汇编之连续存取 6 ARM汇编之条件执行与分支 7 ARM汇编之栈与函数 英文原文链接: https://azeria-labs.com/arm-data-types-and-registers-part-2/ 本文只是转载部分内容,具体请参考原文。 1. ARM汇编基础介绍 1.1 ARM VS. INTEL ARM处理器Intel处理器有很多不同,但是最主要的不同怕是指令集了。Intel属于复杂指令集(CISC)处理器,有很多特性丰富的访问内存的复杂指令集。因此它拥有更多指令代码以及取址都是,但是寄存器比ARM的要少。复杂指令集处理器主要被应用在PC机,工作站以及服务器上。 ARM属于简单指令集(RISC)处理器,所以与复杂指令集先比,只有简单的差不多100条指令集,但会有更多的寄存器。与Intel不同,ARM的指令集仅仅操作寄存器或者是用于从内存的加载/储存过程,这也就是说,简单的加载/存储指令即可访问到内存。这意味着在ARM中,要对特定地址中存储的的32位值加一的话,仅仅需要从内存中加载到寄存器,加一,再从寄存器储存到内存即可。 简单的指令集既有好处也有坏处。一个好处就是代码的执行变得更快了。