汇编语言
一郎坂田
这个作者很懒,什么都没留下…
展开
-
字节(byte)简介
在 x86 计算机中,所有数据存储的基本单位都是字节(byte),一个字节有 8 位。其他的存储单位还有字(word)(2 个字节),双字(doubleword)(4 个字节)和四字(quadword)(8 个字节)。下图展示了每个存储单位所包含的位的个数:下表列出了所有无符号整数可能的取值范围。类型 取值范围 按位计的存储大小 类型 取值范围 ...原创 2019-06-27 21:58:55 · 9719 阅读 · 0 评论 -
x86计算机组件
本节首先通过检查典型主板配置以及围绕 CPU 的芯片组来了解 x86 如何与其他组件的集成。然后讨论内存、I/O 端口和通用设备接口。最后说明汇编语言程序怎样利用系统硬件、固件,并调用操作系统函数来实现不同访问层次的 I/O 操作。主板主板是微型计算机的心脏,它是一个平面电路板,其上集成了 CPU、支持处理器(芯片组(chipset))、主存、输入输出接口、电源接口和扩展插槽。各...原创 2019-06-29 21:20:21 · 262 阅读 · 0 评论 -
第一个汇编语言程序
汇编语言以隐晦难懂而著名,但是本教程从另一个角度来看它——它是一种几乎提供了全部信息的语言。程序员可以看到正在发生的所有事情,甚至包括 CPU 中的寄存器和标志!但是,在拥有这种能力的同时,程序员必须负责处理数据表示的细节和指令的格式。程序员工作在一个具有大量详细信息的层次。现在以一个简单的汇编语言程序为例,来了解其工作过程。程序执行两个数相加,并将结果保存在寄存器中。程序名称为 A...原创 2019-06-29 21:20:41 · 316 阅读 · 1 评论 -
汇编语言常量
常量(constant)是程序中使用的一个确定数值,在汇编阶段就可以确定,直接编码于指令代码中,不是保存在存储器中可变的变量,因为是编码在指令中的量,和指令一起存储了,所以不用单独开辟主存空间,所以也就没法动态改变它了,这也正是高级语言常量无法修改的原因。整数常量整数常量(integer literal)(又称为整型常量(integer constant))由一个可选前置符号、一个或...原创 2019-06-29 21:21:07 · 1051 阅读 · 0 评论 -
汇编语言标识符及其命名规则
标识符(identifier)是由程序员选择的名称,它用于标识变量、常数、子程序和代码标签。标识符的形成有一些规则:可以包含 1 到 247 个字符。 不区分大小写。 第一个字符必须为字母 (A—Z, a—z) A 下划线 (_)、@、? 或 $。其后的字符也可以是数字。 标识符不能与汇编器保留字相同。提示:可以在运行汇编器时,添加 -Cp 命令行切换项来使得所有关键字和标...原创 2019-06-29 21:21:24 · 5343 阅读 · 0 评论 -
汇编语言伪指令
伪指令 (directive) 是嵌入源代码中的命令,由汇编器识别和执行。伪指令不在运行时执行,但是它们可以定义变量、宏和子程序;为内存段分配名称,执行许多其他与汇编器相关的日常任务。默认情况下,伪指令不区分大小写。例如,.data,.DATA 和 .Data 是相同的。下面的例子有助于说明伪指令和指令的区别。DWORD 伪指令告诉汇编器在程序中为一个双字变量保留空间。另一方面,MO...原创 2019-06-29 21:21:41 · 633 阅读 · 0 评论 -
汇编语言指令详解
指令(instruction)是一种语句,它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行。一条指令有四个组成部分:标号(可选) 指令助记符(必需) 操作数(通常是必需的) 注释(可选)不同部分的位置安排如下所示:[label: ] mnemonic [operands] [;comment]现在分别了解每个部分,先从标...原创 2019-06-29 21:21:59 · 2908 阅读 · 0 评论 -
汇编语言整数加减法示例
在《第一个汇编语言程序》一节中给出的 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 · 3278 阅读 · 0 评论 -
汇编语言运行时堆栈(内存数组)
运行时堆栈是内存数组,CPU 用 ESP(扩展堆栈指针,extended stack pointer)寄存器对其进行直接管理,该寄存器被称为堆栈指针寄存器(stack pointer register)。32位模式下,ESP 寄存器存放的是堆栈中某个位置的 32 位偏移量。ESP 基本上不会直接被程序员控制,反之,它是用 CALL、RET、PUSH 和 POP 等指令间接进行修改。E...原创 2019-07-06 21:49:54 · 1196 阅读 · 0 评论 -
汇编语言PUSH和POP指令(压栈和出栈)
汇编里把一段内存空间定义为一个栈,栈总是先进后出,栈的最大空间为 64K。由于 "栈" 是由高到低使用的,所以新压入的数据的位置更低,ESP 中的指针将一直指向这个新位置,所以 ESP 中的地址数据是动态的。PUSH 指令PUSH 指令首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。PUSH 指令有 ...原创 2019-07-06 21:49:55 · 17747 阅读 · 3 评论 -
汇编语言PROC和ENDP伪指令:定义一个过程
如果大家已经学过了高级编程语言,那么就会知道将程序分割为子过程(subroutine)是多么有用。一个复杂的问题常常要分解为相互独立的任务,这样才易于被理解、实现以及有效地测试。在汇编语言中,通常用术语过程(procedure)来指代子程序。在其他语言中,子程序也被称为方法或函数。就面向对象编程而言,单个类中的函数或方法大致相当于封装在一个汇编语言模块中的过程和数据集合。汇编语言出现...原创 2019-07-06 21:49:58 · 9526 阅读 · 0 评论 -
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 · 2330 阅读 · 0 评论 -
32位x86处理器架构
本节重点讲解了 32 位 x86 处理器的基本架构特点。这些处理器包括了 Intel IA-32 系列中的成员和所有 32 位 AMD 处理器。操作模式x86 处理器有三个主要的操作模式:保护模式、实地址模式和系统管理模式;以及一个子模式:虚拟 8086 (virtual-8086) 模式,这是保护模式的特殊情况。以下是对这些模式的简介:1) 保护模式 (Protected Mo...原创 2019-06-29 21:19:38 · 281 阅读 · 0 评论 -
二进制减法运算
如果采用与十进制减法相同的方法,那么从一个较大的二进制数中减去一个较小的无符号二进制数就很容易了。示例如下: 01101 (十进制数 13)– 00111 (十进制数 7)———-位 0 上的减法非常简单: 01101– 00111———- 0下一个位置上执行(0-1),要向左边的相邻位借1,其结果是从 2 ...原创 2019-06-27 22:00:01 · 3103 阅读 · 0 评论 -
汇编语言操作数类型
x86 的指令格式为:[label:] mnemonic [operands][ ;comment ]指令包含的操作数个数可以是:0 个,1 个,2 个或 3 个。这里,为了清晰起见,省略掉标号和注释:mnemonicmnemonic [destination] mnemonic [destination] , [source] mnemonic [destination] ,...原创 2019-07-03 21:54:58 · 2005 阅读 · 0 评论 -
汇编语言MOV指令:将源操作数复制到目的操作数
MOV 指令将源操作数复制到目的操作数。作为数据传送(data transfer)指令,它几乎用在所有程序中。在它的基本格式中,第一个操作数是目的操作数,第二个操作数是源操作数:MOV destination,source其中,目的操作数的内容会发生改变,而源操作数不会改变。这种数据从右到左的移动与 C++ 或 Java 中的赋值语句相似:dest = source;在几乎所...原创 2019-07-03 21:55:00 · 5628 阅读 · 0 评论 -
汇编语言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 · 875 阅读 · 0 评论 -
汇编语言LAHF和SAHF指令
LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH。被复制的标志位包括:符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位。使用这条指令,可以方便地把标志位副本保管在变量中: .data saveflags BYTE ? .code lahf ;将标志位加载到 AH mov saveflags...原创 2019-07-03 21:55:06 · 1954 阅读 · 0 评论 -
汇编语言XCHG指令:交换两个操作数内容
XCHG(交换数据)指令交换两个操作数内容。该指令有三种形式:XCHG reg, regXCHG reg, memXCHG mem, reg除了 XCHG 指令不使用立即数作操作数之外,XCHG 指令操作数的要求与《MOV指令》一节中介绍的 MOV 指令操作数要求是一样的。在数组排序应用中,XCHG 指令提供了一种简单的方法来交换两个数组元素。下面是几个使用 XCHG 指令的...原创 2019-07-03 21:55:09 · 6982 阅读 · 0 评论 -
汇编语言直接偏移量操作数
变量名加上一个位移就形成了一个直接 – 偏移量操作数。这样可以访问那些没有显式标记的内存位置。假设现有一个字节数组 arrayB:arrayB BYTE 10h,20h,30h,40h,50h用该数组作为 MOV 指令的源操作数,则自动传送数组的第一个字节:mov al,arrayB ;AL = 10h通过在 arrayB 偏移量上加 1 就可以访问该数组的...原创 2019-07-03 21:55:12 · 2368 阅读 · 0 评论 -
汇编语言布尔表达式(NOT、AND、OR)
布尔代数(boolean algebra)定义了一组操作,其值为真(true)或假(false)。它的发明者是十九世纪中叶的数学家乔治・布尔(George Boole)。在数字计算机发明的早期,人们发现布尔代数可以用来描述数字电路的设计。同时,在计算机程序中,布尔表达式被用来表示逻辑操作。一个布尔表达式(boolean expression)包括一个布尔运算符以及一个或多个操作数。每...原创 2019-06-28 21:35:31 · 5288 阅读 · 0 评论 -
字符在计算机中是如何表示的?
如果计算机只存储二进制数据,那么它如何表示字符呢?计算机使用的是字符集,将字符映射为整数。早期,字符集只用 8 位表示。即使是现在,在字符模式(如 MS-DOS)下运行时,IBM 兼容微机使用的还是 ASCII(读为“askey”)字符集。ASCII 是美国标准信息交换码(AmeTican Standard Code for Information Interchange)的首字母缩写。...原创 2019-06-28 21:35:57 · 1961 阅读 · 0 评论 -
CPU处理器架构和工作原理浅析
汇编语言是学习计算机如何工作的很好的工具,它需要我们具备计算机硬件的工作知识。基本微机设计下图给出了假想机的基本设计。中央处理单元(CPU)是进行算术和逻辑操作的部件,包含了有限数量的存储位置——寄存器(register),一个高频时钟、一个控制单元和一个算术逻辑单元。其中:时钟 (clock) 对 CPU 内部操作与系统其他组件进行同步。 控制单元 (control ...原创 2019-06-29 21:19:18 · 260 阅读 · 0 评论 -
汇编语言CALL和RET指令:调用一个过程
CALL 指令调用一个过程,指挥处理器从新的内存地址开始执行。过程使用 RET(从过程返回)指令将处理器转回到该过程被调用的程序点上。从物理上来说,CALL 指令将其返回地址压入堆栈,再把被调用过程的地址复制到指令指针寄存器。当过程准备返回时,它的 RET 指令从堆栈把返回地址弹回到指令指针寄存器。32 位模式下,CPU 执行的指令由 EIP(指令指针寄存器)在内存中指岀。16 位模式下...原创 2019-07-06 21:50:00 · 4708 阅读 · 0 评论