自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 汇编语言CALL和RET指令:调用一个过程

CALL 指令调用一个过程,指挥处理器从新的内存地址开始执行。过程使用 RET(从过程返回)指令将处理器转回到该过程被调用的程序点上。从物理上来说,CALL 指令将其返回地址压入堆栈,再把被调用过程的地址复制到指令指针寄存器。当过程准备返回时,它的 RET 指令从堆栈把返回地址弹回到指令指针寄存器。32 位模式下,CPU 执行的指令由 EIP(指令指针寄存器)在内存中指岀。16 位模式下...

2019-07-06 21:50:00 4765

原创 汇编语言PROC和ENDP伪指令:定义一个过程

如果大家已经学过了高级编程语言,那么就会知道将程序分割为子过程(subroutine)是多么有用。一个复杂的问题常常要分解为相互独立的任务,这样才易于被理解、实现以及有效地测试。在汇编语言中,通常用术语过程(procedure)来指代子程序。在其他语言中,子程序也被称为方法或函数。就面向对象编程而言,单个类中的函数或方法大致相当于封装在一个汇编语言模块中的过程和数据集合。汇编语言出现...

2019-07-06 21:49:58 10559

原创 汇编语言PUSH和POP指令(压栈和出栈)

汇编里把一段内存空间定义为一个栈,栈总是先进后出,栈的最大空间为 64K。由于 "栈" 是由高到低使用的,所以新压入的数据的位置更低,ESP 中的指针将一直指向这个新位置,所以 ESP 中的地址数据是动态的。PUSH 指令PUSH 指令首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。PUSH 指令有 ...

2019-07-06 21:49:55 18747 3

原创 汇编语言运行时堆栈(内存数组)

运行时堆栈是内存数组,CPU 用 ESP(扩展堆栈指针,extended stack pointer)寄存器对其进行直接管理,该寄存器被称为堆栈指针寄存器(stack pointer register)。32位模式下,ESP 寄存器存放的是堆栈中某个位置的 32 位偏移量。ESP 基本上不会直接被程序员控制,反之,它是用 CALL、RET、PUSH 和 POP 等指令间接进行修改。E...

2019-07-06 21:49:54 1260

原创 汇编语言堆栈简介

如下图所示,如果把 10 个盘子垒起来,其结果就称为堆栈。虽然有可能从这个堆栈的中间移出一个盘子,但是,更普遍的是从顶端移除。新的盘子可以叠加到堆栈顶部,但不能加在底部或中部。堆栈数据结构(stack data structure)的原理与盘子堆栈相同:新值添加到栈顶,删除值也在栈顶移除。通常,对各种编程应用来说,堆栈都是有用的结构,并且它们也容易用面向对象的编程方法来实现。如果...

2019-07-06 21:49:51 1935

原创 汇编语言直接偏移量操作数

变量名加上一个位移就形成了一个直接 – 偏移量操作数。这样可以访问那些没有显式标记的内存位置。假设现有一个字节数组 arrayB:arrayB BYTE 10h,20h,30h,40h,50h用该数组作为 MOV 指令的源操作数,则自动传送数组的第一个字节:mov al,arrayB ;AL = 10h通过在 arrayB 偏移量上加 1 就可以访问该数组的...

2019-07-03 21:55:12 2438

原创 汇编语言XCHG指令:交换两个操作数内容

XCHG(交换数据)指令交换两个操作数内容。该指令有三种形式:XCHG reg, regXCHG reg, memXCHG mem, reg除了 XCHG 指令不使用立即数作操作数之外,XCHG 指令操作数的要求与《MOV指令》一节中介绍的 MOV 指令操作数要求是一样的。在数组排序应用中,XCHG 指令提供了一种简单的方法来交换两个数组元素。下面是几个使用 XCHG 指令的...

2019-07-03 21:55:09 7467

原创 汇编语言LAHF和SAHF指令

LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH。被复制的标志位包括:符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位。使用这条指令,可以方便地把标志位副本保管在变量中: .data saveflags BYTE ? .code lahf ;将标志位加载到 AH mov saveflags...

2019-07-03 21:55:06 2142

原创 汇编语言MOVZX和MOVSX指令

尽管 MOV 指令不能直接将较小的操作数复制到较大的操作数中,但是程序员可以想办法解决这个问题。假设要将 count(无符号,16 位)传送到 ECX(32 位),可以先将 ECX 设置为 0,然后将 count 传送到 CX: .data count WORD 1 .code mov ecx,0 mov cx,count如果对一个有符号整数 -16 进行同样的操作会发生...

2019-07-03 21:55:03 921

原创 汇编语言MOV指令:将源操作数复制到目的操作数

MOV 指令将源操作数复制到目的操作数。作为数据传送(data transfer)指令,它几乎用在所有程序中。在它的基本格式中,第一个操作数是目的操作数,第二个操作数是源操作数:MOV destination,source其中,目的操作数的内容会发生改变,而源操作数不会改变。这种数据从右到左的移动与 C++ 或 Java 中的赋值语句相似:dest = source;在几乎所...

2019-07-03 21:55:00 5792

原创 汇编语言操作数类型

x86 的指令格式为:[label:] mnemonic [operands][ ;comment ]指令包含的操作数个数可以是:0 个,1 个,2 个或 3 个。这里,为了清晰起见,省略掉标号和注释:mnemonicmnemonic [destination] mnemonic [destination] , [source] mnemonic [destination] ,...

2019-07-03 21:54:58 2111

原创 汇编语言整数加减法示例

在《第一个汇编语言程序》一节中给出的 AddTwo 程序,并添加必要的声明使其成为完全能运行的程序。 ; AddTwo.asm -两个 32 位整数相加 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO, dwExitCode:DWORD .code main PROC mov eax,5 ;将数字...

2019-06-29 21:22:17 3332

原创 汇编语言指令详解

指令(instruction)是一种语句,它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行。一条指令有四个组成部分:标号(可选) 指令助记符(必需) 操作数(通常是必需的) 注释(可选)不同部分的位置安排如下所示:[label: ] mnemonic [operands] [;comment]现在分别了解每个部分,先从标...

2019-06-29 21:21:59 3038

原创 汇编语言伪指令

伪指令 (directive) 是嵌入源代码中的命令,由汇编器识别和执行。伪指令不在运行时执行,但是它们可以定义变量、宏和子程序;为内存段分配名称,执行许多其他与汇编器相关的日常任务。默认情况下,伪指令不区分大小写。例如,.data,.DATA 和 .Data 是相同的。下面的例子有助于说明伪指令和指令的区别。DWORD 伪指令告诉汇编器在程序中为一个双字变量保留空间。另一方面,MO...

2019-06-29 21:21:41 692

原创 汇编语言标识符及其命名规则

标识符(identifier)是由程序员选择的名称,它用于标识变量、常数、子程序和代码标签。标识符的形成有一些规则:可以包含 1 到 247 个字符。 不区分大小写。 第一个字符必须为字母 (A—Z, a—z) A 下划线 (_)、@、? 或 $。其后的字符也可以是数字。 标识符不能与汇编器保留字相同。提示:可以在运行汇编器时,添加 -Cp 命令行切换项来使得所有关键字和标...

2019-06-29 21:21:24 5517

原创 汇编语言常量

常量(constant)是程序中使用的一个确定数值,在汇编阶段就可以确定,直接编码于指令代码中,不是保存在存储器中可变的变量,因为是编码在指令中的量,和指令一起存储了,所以不用单独开辟主存空间,所以也就没法动态改变它了,这也正是高级语言常量无法修改的原因。整数常量整数常量(integer literal)(又称为整型常量(integer constant))由一个可选前置符号、一个或...

2019-06-29 21:21:07 1087

原创 第一个汇编语言程序

汇编语言以隐晦难懂而著名,但是本教程从另一个角度来看它——它是一种几乎提供了全部信息的语言。程序员可以看到正在发生的所有事情,甚至包括 CPU 中的寄存器和标志!但是,在拥有这种能力的同时,程序员必须负责处理数据表示的细节和指令的格式。程序员工作在一个具有大量详细信息的层次。现在以一个简单的汇编语言程序为例,来了解其工作过程。程序执行两个数相加,并将结果保存在寄存器中。程序名称为 A...

2019-06-29 21:20:41 347 1

原创 x86计算机组件

本节首先通过检查典型主板配置以及围绕 CPU 的芯片组来了解 x86 如何与其他组件的集成。然后讨论内存、I/O 端口和通用设备接口。最后说明汇编语言程序怎样利用系统硬件、固件,并调用操作系统函数来实现不同访问层次的 I/O 操作。主板主板是微型计算机的心脏,它是一个平面电路板,其上集成了 CPU、支持处理器(芯片组(chipset))、主存、输入输出接口、电源接口和扩展插槽。各...

2019-06-29 21:20:21 279

原创 64位x86-64处理器架构

本节重点关注所有使用 x86-64 指令集的 64 位处理器的基本架构细节。这些处理器包括 Intel 64 和 AMD64 处理器系列。指令集是已讨论的 x86 指令集的 64 位扩展。以下为一些基本特征:1) 向后兼容 x86 指令集。2) 地址长度为 64 位,虚拟地址空间为 2 64 字节。按照当前芯片的实现情况,只能使用地址的低 48 位。3) 可以使用 64 位通用寄...

2019-06-29 21:19:58 2416

原创 32位x86处理器架构

本节重点讲解了 32 位 x86 处理器的基本架构特点。这些处理器包括了 Intel IA-32 系列中的成员和所有 32 位 AMD 处理器。操作模式x86 处理器有三个主要的操作模式:保护模式、实地址模式和系统管理模式;以及一个子模式:虚拟 8086 (virtual-8086) 模式,这是保护模式的特殊情况。以下是对这些模式的简介:1) 保护模式 (Protected Mo...

2019-06-29 21:19:38 308

原创 CPU处理器架构和工作原理浅析

汇编语言是学习计算机如何工作的很好的工具,它需要我们具备计算机硬件的工作知识。基本微机设计下图给出了假想机的基本设计。中央处理单元(CPU)是进行算术和逻辑操作的部件,包含了有限数量的存储位置——寄存器(register),一个高频时钟、一个控制单元和一个算术逻辑单元。其中:时钟 (clock) 对 CPU 内部操作与系统其他组件进行同步。 控制单元 (control ...

2019-06-29 21:19:18 305

原创 字符在计算机中是如何表示的?

如果计算机只存储二进制数据,那么它如何表示字符呢?计算机使用的是字符集,将字符映射为整数。早期,字符集只用 8 位表示。即使是现在,在字符模式(如 MS-DOS)下运行时,IBM 兼容微机使用的还是 ASCII(读为“askey”)字符集。ASCII 是美国标准信息交换码(AmeTican Standard Code for Information Interchange)的首字母缩写。...

2019-06-28 21:35:57 2081

原创 汇编语言布尔表达式(NOT、AND、OR)

布尔代数(boolean algebra)定义了一组操作,其值为真(true)或假(false)。它的发明者是十九世纪中叶的数学家乔治・布尔(George Boole)。在数字计算机发明的早期,人们发现布尔代数可以用来描述数字电路的设计。同时,在计算机程序中,布尔表达式被用来表示逻辑操作。一个布尔表达式(boolean expression)包括一个布尔运算符以及一个或多个操作数。每...

2019-06-28 21:35:31 5468

原创 二进制减法运算

如果采用与十进制减法相同的方法,那么从一个较大的二进制数中减去一个较小的无符号二进制数就很容易了。示例如下: 01101 (十进制数 13)– 00111 (十进制数 7)———-位 0 上的减法非常简单: 01101– 00111———- 0下一个位置上执行(0-1),要向左边的相邻位借1,其结果是从 2 ...

2019-06-27 22:00:01 3239

原创 补码及进制转换

有符号二进制整数有正数和负数。在 x86 处理器中,MSB 表示的是符号位:0 表示正数,1 表示负数。下图展示了 8 位的正数和负数:补码表示负整数用补码(two`s-complement)表示时,使用的数学原理是:一个整数的补码是其加法逆元。(如果将一个数与其加法逆元相加,结果为 0。)补码表示法对处理器设计者来说很有用,因为有了它就不需要用两套独立的电路来处理加法...

2019-06-27 21:59:58 629

原创 十六进制整数

大的二进制数读起来很麻烦,因此十六进制数字就提供了一种简便的方式来表示二进制数据。十六进制整数中的 1 个数字就表示了 4 位二进制位,两个十六进制数字就能表示一个字节。一个十六进制数字表示的范围是十进制数 0 到 15,所以,用字母 A 到 F 来代表十进制数 10 到 15。下表列出了每个 4 位二进制序列如何转换为十进制和十六进制数值。二进制 十进制 十...

2019-06-27 21:59:11 1057

原创 字节(byte)简介

在 x86 计算机中,所有数据存储的基本单位都是字节(byte),一个字节有 8 位。其他的存储单位还有字(word)(2 个字节),双字(doubleword)(4 个字节)和四字(quadword)(8 个字节)。下图展示了每个存储单位所包含的位的个数:下表列出了所有无符号整数可能的取值范围。类型 取值范围 按位计的存储大小 类型 取值范围 ...

2019-06-27 21:58:55 10012

原创 二进制加法运算

两个二进制整数相加时,是位对位处理的,从最低的一对位(右边)开始,依序将每一对位进行加法运算。两个二进制数字相加,有四种结果,如下所示:0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10 1 与 1 相加的结果是二进制的 10(等于十进制的 2)。多出来的数字向更高位产生一个进位。如下图所示,两个二进制数 0000 0100 和 000...

2019-06-27 21:58:53 5476

原创 二进制(bit)整数

计算机以电子电荷集合的形式在内存中保存指令和数据。用数字来表示这些内容就需要系统能够适应开 / 关(on/off)或真 / 假(true/false)的概念。二进制数(binary number)用 2 个数字作基础,其中每一个二进制数字(称为位,bit)不是 0 就是 1。位自右向左,从 0 开始顺序增量编号。左边的位称为最高有效位(Most Significant Bit, MS...

2019-06-27 21:58:28 2078

原创 汇编语言的数据表示

汇编语言程序员处理的是物理级数据,因此他们必须善于检查内存和寄存器。通常,二进制数被用于描述计算机内存的内容;有时也使用十进制和十六进制数。所以必须熟练掌握数字格式,以便快速地进行数字的格式转换。每一种数制格式或系统,都有一个基数(base),也就是可以分配给单一数字的最大符号数。下表给岀了数制系统内可能的数字,这些系统是硬件和软件手册中最常使用的。系统 基数 可能的数字...

2019-06-27 21:58:04 252

原创 虚拟机是什么?

虚拟机概念(virtual machine machine)是一种说明计算机硬件和软件关系的有效方法。在安德鲁 · 塔嫩鲍姆(Andrew Tanenbaum)的书《结构化计算机组织》(Structured Computer Organization)中可以找到对这个模型广为人知的解释。要说明这个概念,先从计算机的最基本功能开始,即执行程序。计算机通常可以执行用其原生机器语言编写的程...

2019-06-27 21:57:31 741

原创 汇编语言的应用(用途)

早期在编程时,大多数应用程序部分或全部用汇编语言编写。它们不得不适应小内存,并尽可能在慢速处理器上有效运行。随着内存容量越来越大,以及处理器速度急速提高,程序变得越来越复杂。程序员也转向高级语言如 C语言、FORTRAN COBOL,这些语言具有很多结构化能力。最近,Python、C++、C# 和 Java 等面向对象语言已经能够编写含数百万行代码的复杂程序了。很少能看到完全用汇编语...

2019-06-27 21:57:00 1793

原创 汇编语言是一种什么程序设计语言?

本教程主要介绍与运行 Microsoft Windows 32 位和 64 位系统的 Intel 和 AMD 处理器相兼容的微处理器编程。教程中使用了 Microsoft 宏汇编器(称为 MASM)的最新版本。Microsoft Visual Studio 的大多数版本(专业版,旗舰版,精简版……)都包含 MASM。可以访问(asmirvine.com),了解 Visual Stud...

2019-06-27 21:56:33 2996

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除