汇编指令

汇编.align指令

纵然是瞬间 提交于 2020-03-16 18:26:57
对齐伪指令ALIGN 对齐伪指令格式: .align Num 其中:Num必须是2的幂,如:2、4、8和16等。 伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。 如果下一个地址正好能被Num整除,那么,该伪指令不起作用,否则,汇编程序将空出若干个字节,直到下一个地址能被Num整除为止。 来源: https://www.cnblogs.com/songbeyond/p/12505366.html

深入理解计算机系统之程序的机器级表示部分学习笔记

那年仲夏 提交于 2020-03-16 08:08:11
不论我们是在用C语言还是用JAVA或是其他的语言编程时,我们会被屏蔽了程序的机器级的实现。机器语言不需要被编译,可以直接被CPU执行,其执行速度十分 快。但是机器语言的读写性与移植性较高级语言低。高级语言被编译后便成为了汇编语言,汇编语言 十分接近 机器语言。之后汇编代码会转化为机器语言。虽然现代 的编译器能帮助我们将高级语言转化为汇编语言,解决了不少问题,但是对于一个严谨的程序员来说,需要做到能够阅读和理解汇编语言。我们主要围绕Intel来讲 解。 一 Intel处理器的历史演变 Intel处理器最的早是8086, 它是 十六 位的微处理器,作为第一代单芯片,8086知名度是相当的高。之后又有80286、i386、i486、Pentium、PentiumPro、 Pentium/MMX、PentiumⅡ、PentiumIII等等的一系列处理器出现了。每个时间上相继的处理器都是向后兼容的。Intel称其指令集为IA32,也就是Intel32位体系结 构,也就是我们平常所说的x86。 二 程序编码 我们写一个C程序,用Unix命令行编译p1.c和p2.c两个文件。即为 unix> gcc -02 -o p p1.c p2.c 其 中 -02 告诉编译器使用第二级优化。而二级优化则是在性能优化与使用方便之间一个最好的权衡。所以代码经常使用二级优化。 (1)机器级代码

Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)

狂风中的少年 提交于 2020-03-15 11:39:12
Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解) 1 u-boot.lds 首先了解uboot的链接脚本board/my2410/u-boot.lds,它定义了目标程序各部分的链接顺序。 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定输出可执行文件为ELF格式,32为,ARM小端*/ OUTPUT_ARCH(arm)/*指定输出可执行文件为ARM平台*/ ENTRY(_start)/*起始代码段为 _start*/ SECTIONS { /* 指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置*、 . = 0x00000000;从 0x0位置开始 . = ALIGN(4); 4字节对齐 .text : { cpu/arm920t/start.o (.text) board/my2440/lowlevel_init.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4); .data : { *(.data) } /* 只读数据段

Delphi 预编译指令说明

非 Y 不嫁゛ 提交于 2020-03-13 00:11:44
Delphi作为一个优秀的开发工具,这不仅是由于它开创了“构件(Component)”时代,影响深远;另一个原因是它拥有非常出色的编译器,Borland(Inprise)公司宣称Delphi具有世界上最快的编译器,如果你使用过Visual C++和Delphi你会明显体会到这一点。Delphi快速高效的编译器主要来自Object Pascal的严谨,使用Delphi随时都在和编译器交流,大部份情况下不需要我们干涉编译器的运行,但是有时也需要对编译器进行必要的设置。作为Delphi的使用者,你是否真正了解Delphi的编译环境呢? ********************************************************************************************** A.1 使用编译设置对话框 编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[Project]->[Options]->[Complier]选项页进行设置,绝大部分的编译环境都可以通过这一对话框进行调整,他包含了对代码、语法、调试信息等的设置。 1.代码设置(Code Generation) Optimization: 代码优化开关 Aligned record fields: 字对齐数据

Delphi编译指令说明

夙愿已清 提交于 2020-03-13 00:10:17
Delphi快速高效的编译器主要来自Object PASCAL的严谨,使用Delphi随时都在与编译器交流,大部分情况下不需要干涉编译器的运行,但是有时也需要对编译器进行必要的设置。 ********************************************************************************************** A.1 使用编译设置对话框 编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[Project]->[Options]->[Complier]选项页进行设置,绝大部分的编译环境都可以通过这一对话框进行调整,他包含了对代码、语法、调试信息等的设置。 1.代码设置(Code Generation) Optimization: 代码优化开关 Aligned record fields: 字对齐数据。这个编译指令能够在变量和类型化常量的字节对齐和字对齐之间进行切换,其作用是全局的。 Stack frames: Windows 堆栈帧。其作用域是局部的,他使编译器成为远端过程和函数生成特定的开头和结尾代码。这个指令用于Windows 3.0的实模式,对所有Delphi应用程序他应该是关闭的。 Pentium-safe FDIV: Pentium安全FDIV检查

Delphi 预编译指令说明

牧云@^-^@ 提交于 2020-03-12 23:53:53
Delphi作为一个优秀的开发工具,这不仅是由于它开创了“构件(Component)”时代,影响深远;另一个原因是它拥有非常出色的编译器,Borland(Inprise)公司宣称Delphi具有世界上最快的编译器,如果你使用过Visual C++和Delphi你会明显体会到这一点。Delphi快速高效的编译器主要来自Object Pascal的严谨,使用Delphi随时都在和编译器交流,大部份情况下不需要我们干涉编译器的运行,但是有时也需要对编译器进行必要的设置。作为Delphi的使用者,你是否真正了解Delphi的编译环境呢? ********************************************************************************************** A.1 使用编译设置对话框 编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[Project]->[Options]->[Complier]选项页进行设置,绝大部分的编译环境都可以通过这一对话框进行调整,他包含了对代码、语法、调试信息等的设置。 1.代码设置(Code Generation) Optimization: 代码优化开关 Aligned record fields: 字对齐数据

Delphi编译指令说明

▼魔方 西西 提交于 2020-03-12 23:51:42
Delphi快速高小的编译器主要来自Object PASCAL的严谨,使用Delphi随时都在与编译器交流,大部分情况下不需要干涉编译器的运行,但是有时也需要对编译器进行必要的设置。 ********************************************************************************************** A.1 使用编译设置对话框 编译器的编译指令是用于指定编译器对项目编译过程的动作和行为。可以通过[Project]->[Options]->[Complier]选项页进行设置,绝大部分的编译环境都可以通过这一对话框进行调整,他包含了对代码、语法、调试信息等的设置。 1.代码设置(Code Generation) Optimization: 代码优化开关 Aligned record fields: 字对齐数据。这个编译指令能够在变量和类型化常量的字节对齐和字对齐之间进行切换,其作用是全局的。 Stack frames: Windows 堆栈帧。其作用域是局部的,他使编译器成为远端过程和函数生成特定的开头和结尾代码。这个指令用于Windows 3.0的实模式,对所有Delphi应用程序他应该是关闭的。 Pentium-safe FDIV: Pentium安全FDIV检查

8086汇编 栈操作

蹲街弑〆低调 提交于 2020-03-12 12:23:37
8086汇编 栈操作 栈结构 一、说明 栈是一种只能在一端进行插入或删除操作的数据结构。 栈有两个基本的操作:入栈和出栈。 入栈:将一个新的元素放到栈顶; 出栈:从栈顶取出一个元素。 栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。 栈的操作规则:LIFO(Last In First Out,后进先出)。 二、8086栈 8086CPU提供相关的指令,支持用栈的方式访问内存空间。 基于8086CPU的编程,可以将一段内存当作栈来使用。 栈操作 一、指令介绍   push、pop 实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。 执行push和pop指令时,SP 中的内容自动改变。 在SS,SP中存放栈顶的段地址和偏移地址,入栈和出栈指令根据SS:SP指示的地址,按照栈的方式访问内存单元。 8086CPU中,PUSH(入栈)和 POP(出栈)指令: push ax:将ax中的数据送入栈中 pop ax:从栈顶取出数据送入ax 8086CPU中,有两个与栈相关的寄存器: 栈段寄存器SS      - 存放栈顶的段地址 栈顶指针寄存器SP    - 存放栈顶的偏移地址 SS:SP     - 指向栈顶元素。 注:(以字为单位对栈进行操作) 二、原理解析 1、例

8086汇编 介绍

痞子三分冷 提交于 2020-03-10 12:36:56
8086汇编 介绍 什么是汇编语言   汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。 效率 运行效率:开发软件的核心部件,快速执行和实时响应。 开发效率:做合适的事,开发效率无敌 底层 计算机及外围设备的驱动程序 操作系统的内核 嵌入式系统:家用电器、仪器仪表、物联网…… 8086 CPU介绍   Intel 8086是一个由Intel于1978年所设计的16位微处理器芯片,是x86架构的鼻祖。不久之后,Intel 就推出了 Intel 8088 (一个拥有8位外部数据总线的微处理器)。它是以8080和8085的设计为基础,拥有类似的寄存器组,但是地址总线扩充为20位。总线接口单元(Bus Interface Unit)透过6字节预存(prefetch) 的队列(queue)位指令给执行单元(Execution Unit),所以取指令和执行是同步的,8086 CPU有20条地址线,可直接寻址1MB的存储空间,每一个存储单元可以存放一个字节(8位)二进制信息。  

C语言编译过程总结简版

假如想象 提交于 2020-03-09 20:02:53
C语言编译过程总结详解 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。过程图解如下: 从图上可以看到,整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。 编译过程 编译过程又可以分成两个阶段:编译和会汇编。 编译 编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段: 第一个阶段是预处理阶段,在正式的编译阶段之前进行。预处理阶段将根据已放置在文件中的预处理指令来修改源文件的内容。如#include指令就是一个预处理指令,它把头文件的内容添加到.cpp文件中。这个在编译之前修改源文件的方式提供了很大的灵活性,以适应不同的计算机和操作系统环境的限制。一个环境需要的代码跟另一个环境所需的代码可能有所不同,因为可用的硬件或操作系统是不同的。在许多情况下,可以把用于不同环境的代码放在同一个文件中,再在预处理阶段修改代码,使之适应当前的环境。 主要是以下几方面的处理: (1)宏定义指令,如 #define a b 对于这种伪指令