汇编指令

CPU

不问归期 提交于 2019-12-12 10:36:07
CPU 1. CPU是什么? 2.CPU 实际做什么? 3.CPU 的内部结构 4.CPU 是寄存器的集合体 5.计算机语言 6.汇编语言 7.程序计数器 8.条件分支和循环机制 9.标志寄存器 10.函数调用机制 11.通过地址和索引实现数组 12.CPU 指令执行过程 13.总结 1. CPU是什么? CPU 的全称是 Central Processing Unit ,它是你的电脑中最硬核的组件,这种说法一点不为过。CPU 是能够让你的计算机叫计算机的核心组件,但是它却不能代表你的电脑,CPU 与计算机的关系就相当于大脑和人的关系。 它 是一种小型的计算机芯片 ,它嵌入在台式机、笔记本电脑或者平板电脑的主板上。通过在单个计算机芯片上放置数十亿个微型晶体管来构建 CPU。 这些晶体管使它能够执行运行存储在系统内存中的程序所需的计算,也就是说 CPU 决定了你电脑的计算能力。 2.CPU 实际做什么? CPU 的核心是从程序或应用程序获取指令并执行计算。 此过程可以分为三个关键阶段: 提取,解码和执行 。 CPU从系统的 RAM 中提取指令,然后解码该指令的实际内容,然后再由 CPU 的相关部分执行该指令。 RAM : 随机存取存储器 (英语:Random Access Memory,缩写:RAM),也叫主存,是与 CPU 直接交换数据的内部存储器。它可以 随时读写 (刷新时除外)

链接过程详解

橙三吉。 提交于 2019-12-11 05:39:26
一:链接的基本概念 链接(linking)是将各种代码和数据片段收集并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。 链接可以执行于编译时,也可以执行于加载时,甚至执行于运行时。在现代系统中,链接是由叫做链接器(linker)的程序自动执行的。 为什么需要链接器呢?一切都是为了简单、为了方便!试想一下,一个巨大的工程有巨大的源文件,包含N多个模块,如果没有链接的存在,那么当你改动某个模块时,不得不重新编译整个工程,消耗巨大的时间和资源。而在链接器的帮助下,你只需要简单编译修改过的模块,之后重新链接生成可执行文件就OK了。 下面,我们将基于一个运行Linux的x86-64系统,详细讨论关于链接的各个方面。 二:从代码到可执行文件 考虑如下的一个c语言程序: code/link/main.c int sun(int *a, int n); int array[2] = {1, 2}; int main() { int val = sum(array, 2); return val; } code/link/sum.c int sum(int *a, int n) { int i, s = 0; for (i = 0; i < n; i++) s += a[i]; return s; } 从源文件到可执行文件需要哪几个步骤呢? 1:预处理器将C的源程序main

基础常用arm汇编指令

一个人想着一个人 提交于 2019-12-11 03:55:36
内存访问指令:ldr,str,ldm,stm ldr( Load from memory into register): ldr{条件} 目的寄存器 <存储器地址> 作用: 指令从内存中读出数据到寄存器中 比如: ldr r1, [r2,#4] //将地址r2+4的内存单元的数据读取到r1中 ldr r1,[r2] //将地址r2的内存单元的数据读取到r1中。 R1<——[R2] 注意:ldr中的第二个参数为=时,表示伪指令,或者表示内存访问指令 比如 ldr r1,=4096 ; str: Store from a register into memory 把指令寄存器的值储存到内存中。 比如: str r1,[r2,#4] //将r1的数据保存到地址为r2+4的内存单元中 str r1,[r2] //将r1的数据保存到地址为r2的内存单元中 R1——>[R2] ldm: Load from memory into many register 格式如下: ldm{cond}<addressing_mode> {!} {^} <addressing_mode>表示地址变化模式,有以下4中方式 1、ia(increment after):事后递增 2、ib(increment before):事先递增 3、da(decrement after):事后递减 4、db(decrement

ARM汇编指令

让人想犯罪 __ 提交于 2019-12-10 07:40:14
转载: arm汇编指令-Bingghost-博客园 学习嵌入式系统时的资料收集 ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令6大指令 一、跳转指令 跳转指令用于实现程序流程的跳转 跳转指令分类 Ⅰ.使用专门的跳转指令 分支指令 B 带链接的分支指令: BL 带状态切换的分支指令 BX Ⅱ. 程序计数器PC控制 直接向程序计数器PC写入跳转地址值,通过向程序计数器PC写入跳转地址值 可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令 可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。 ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令: 1、B指令 B指令的格式为: B{条件} 目标地址 2、BL指令 BL指令的格式为: BL{条件} 目标地址 BL是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容, 因此,可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个 指令处执行。 该指令是实现子程序调用的一个基本但常用的手段 3、BLX指令 BLX指令的格式为: BLX 目标地址 BLX指令从ARM指令集跳转到指令中所指定的目标地址

汇编学习记录之十二

时光总嘲笑我的痴心妄想 提交于 2019-12-09 18:18:59
资料来源:汇编语言第二版-王爽 1.loop指令 loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。 对ip的修改范围都为:-128~127。 指令格式:loop 标号 ( (cx) = (cx) - 1 ,如果(cx)≠0,转移到标号处执行。) 操作:(1) (cx)=(cx)-1; (2) 如果(cx)≠0,(ip)=(ip)+8位位移。 如果(cx)=0,什么也不做(程序继续向下执行)。 我们从loop的功能可以看出,指令 'loop 标号' 的功能相当于: (cx)--; if((cx) ≠ 0) jmp short 标号; 2.根据位移进行转移的意义 jmp short 标号、jmp near ptr 标号、jcxz 标号、loop 标号等几种汇编指令,它们对ip的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是目的地址的位移。 这种设计,方便了程序段在内存中的浮动装配。 例如: 汇编指令 机器指令 mov cx,6 B9 06 00 mov ax,10 B8 10 00 s: add ax,ax 01 C0 loop s E2 FC 这段程序装在内存中的不同位置都可以正确执行,因为loop s 在执行时只涉及到s的位移(-4,前移4个字节,补码表示为FCH)

arm 汇编指令

北慕城南 提交于 2019-12-08 15:08:30
参考文章: https://www.cnblogs.com/ylhwx/p/7834969.html 主要的命令说明: 1、 寄存器与内存的拷贝操作 ldr、str 2、 乘法指令 mvl、mla 4、 加法、减法指令 add, sub 5、 cpsr访问指令: mrs, msr 6、 跳转指令: bl b 7、 cp15指令: mcr、 mrc 8、 算术右移、逻辑左移、右移、循环左移、循环右移、 ASR LSL LSR ROR RRX 9、 逻辑判断 AND、 ORR、 CMP、 汇编伪指令的学习 .type name,@type:将符号name的type属性设为type。其中type可以是function或object .globl == kernel export 全局可以使用 .INCBIN 文件名 INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理 .LTORG //定义数据缓冲池 data SPACE 4200 //从当前开始分配40字节的内存单元并初始化为0 .type initrd_start,#object .globl initrd_start initrd_start: .incbin INITRD .globl initrd_end initrd_end: 来源:

计算机系统基础(一):程序的表示、转换和链接---第一周

做~自己de王妃 提交于 2019-12-07 18:20:36
1.以下有关冯.诺依曼结构思想的叙述中,错误的是( )。 A.程序由指令构成,计算机能自动执行程序中一条一条指令 B.计算机内部以二进制形式表示指令和数据 C.计算机由运算器、存储器、控制器和I/O设备组成 D.指令和数据都放在存储器中,两者在形式上有差别 2.以下有关指令以及指令执行过程的叙述中,错误的是( )。 A.指令中指定的操作数只能是存放在存储器中的数据 B.将要执行的下条指令的地址总是在程序计数器PC中 C.指令由操作码和操作数或操作数的地址码构成 D.CPU中的控制器对指令操作码进行译码 3.以下有关编程语言的叙述中,错误的是( )。 A.用高级编程语言编写程序比用汇编语言更方便 B.计算机不能直接执行高级语言程序和汇编语言程序 C.汇编语言和机器语言都与计算机系统结构相关 D.不能直接用机器语言(机器指令)编写程序 4.以下有关机器指令和汇编指令的叙述中,错误的是( )。 A.机器指令和汇编指令一一对应,功能相同 B.机器指令和汇编指令都能被计算机直接执行 C.汇编指令中用符号表示操作码和地址码 D.汇编指令中用十进制或十六进制表示立即数 5.以下有关使用高级编程语言编写和开发软件的叙述中,错误的是( )。 A.须程序员在应用程序中直接控制外设进行输入/输出 B.须有一个翻译或转换程序,即编译器或解释器 C.须有程序员与计算机交互的用户接口,即GUI或CUI D

54.windbg-a、.dvalloc (直接写反汇编和new内存,实例:加入附加的printf)

痞子三分冷 提交于 2019-12-07 09:39:02
a(Assemble) a 命令对指令助记符进行汇编,并将指令代码的结果放入内存。 如果没有指定地址,汇编会从指令指针的当前值所指向的地址开始。要汇编新的指令,可以输入需要的助记符并按下ENTER。要结束汇编,直接按下ENTER .dvalloc .dvalloc 命令使得Windows在目标进程中分配附加的内存。 加入附加的printf 以下是原始的测试代码,自己随意写的: char* g_char = "I am string"; DWORD ThreadProc(LPVOID lp) { while(1) { // todo } return 0; } int _tmain(int argc, _TCHAR* argv[]) { printf("%s\n",g_char); CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,0,0,0); getchar(); return 0; } windbg附加: 查看ThreadProc函数 0:000> u 012313c0 L10 test1!ThreadProc [d:\windbg\test1\test1.cpp @ 11]: 012313c0 55 push ebp 012313c1 8bec mov ebp,esp 012313c3 81ecc0000000

汇编 易混淆指令lea offset

旧街凉风 提交于 2019-12-06 15:22:47
lea 是机器指令,offset 是伪指令。 LEA BX, BUFFER ;在实际执行时才会将变量buffer的地址放入bx MOV BX, OFFSET BUFFER ;在编译时就已经计算出buffer的地址为4300(假设),然后将上句替换为: mov bx,4300 lea可以进行比较复杂的计算,比如lea eax,[esi+ebx*4],把ebx的值*4,加上esi的值,存入eax中。 mov就不行了。 OFFSET只能取得用"数据定义伪指令"定义的变量的有效地址,不能取得一般操作数的有效地址(摘自80x86汇编语言程序设计教程) MOV BX,OFFSET [BX+200]这句是错误的 应该用LEA BX,[BX+200] lea eax,[ebp] 说明: eax得到ebp指向的堆栈内容的偏移地址, 和寄存器ebp的值是相同的 OFFSET一般用于对数据段操作, 而LEA在指令中算任意寄存器偏移地址 来源: https://www.cnblogs.com/dgwblog/p/11992736.html

JavaWeb(一):Java技术概览

試著忘記壹切 提交于 2019-12-06 07:03:52
一、Java技术体系 在早期,Java被称为Java开发工具包或JDK,是一门与平台(由一组 必需的API组成)紧密耦合的语言。 从1998年底的1.2版本开始,Java技术栈被分割为下面关键部分: Java是一门包含了严格和强类型语法的语言。 Java 2平台标准版本,被称为J2SE,指的是平台以及java.lang和java.io包中包含的类。它是构建Java应用程序的基础。 Java虚拟机或JVM是一个可运行编译后Java代码的软件虚拟机。因为被编译过的Java代码只是字节码,JVM将在运行代码之前,把字节码编译成机器码。JVM还负责管理内存,从而实现了应用程序代码的简化。 Java开发工具包或JDK。它包括了Java语言编译器、文档生成器、与本地代码协作的工具和用于调试平台类的Java源代码。 Java运行时环境或JRE曾经并且现在也仍是终端用户用于运行编译后Java应用程序的软件。它包含了JVM但不含任何JDK中的开发工具。而JDK包含了一个JRE(即jdk既包含开发工具又包含JRE)。 上述5个组件曾经都只是 规范 ,而不是实现。任何公司都可以通过规范实现Java技术栈,比如IBM有自己的JDK。开源社区则形成了OpenJDK项目,该项目提供Java栈的开源实现。 我们在Oracle网站下载的JDK,实际也是一种实现,sun公司最初就提供了Java、J2SE、JVM