80x86汇编语言基础知识

今天做一下摘抄吧
原文来自微信公众号:计算机与网络安全

汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。

汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。

0x01 发展历程

说到汇编语言的产生,首先要讲一下机器语言。

机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。

上面所说的计算机指的是可以执行机器指令,进行运算的机器。这是早期计算机的概念。在我们常用的PC机中,有一个芯片来完成上面所说的计算机的功能。这个芯片就是我们常说的CPU(Central Processing Unit,中央处理单元)。每一种微处理器,由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。

早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。这样的机器语言由纯粹的0和1构成,十分复杂,不方便阅读和修改,也容易产生错误。程序员们很快就发现了使用机器语言带来的麻烦,它们难于辨别和记忆,给整个产业的发展带来了障碍,于是汇编语言产生了。

图文无关
汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。

1000100111011000	机器指令
mov ax,bx			汇编指令

此后,程序员们就用汇编指令编写源程序。可是,计算机能读懂的只有机器指令,那么如何让计算机执行程序员用汇编指令编写的程序呢?这时,就需要有一个能够将汇编指令转换成机器指令的翻译程序,这样的程序我们称其为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行。

0x02 语言特点

汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。

汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂。例如上面的例子,我们就不能像高级语言一样直接使用数据,而是先要从相应的寄存器AX、BX 中把数据取出。这也就增加了编程的复杂性,因为在高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度。

再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言。所以,汇编语言程序与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。

0x03 语言组成

数据传送

这部分指令包括通用数据传送指令MOV、条件传送指令CMOVcc、堆栈操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。注意,CMOVcc不是一条具体的指令,而是一个指令簇,包括大量的指令,用于根据EFLAGS寄存器的某些位状态来决定是否执行指定的传送操作。

整数和逻辑运算

这部分指令用于执行算术和逻辑运算,包括加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、逻辑运算指令NOT/AND/OR/XOR/TEST等。

移位指令

这部分指令用于将寄存器或内存操作数移动指定的次数。包括逻辑左移指令SHL、逻辑右移指令SHR、算术左移指令SAL、算术右移指令SAR、循环左移指令ROL、循环右移指令ROR等。

位操作指令

部分指令包括位测试指令BT、位测试并置位指令BTS、位测试并复位指令BTR、位测试并取反指令BTC、位向前扫描指令BSF、位向后扫描指令BSR等。

条件设置指令

这不是一条具体的指令,而是一个指令簇,包括大约30条指令,用于根据EFLAGS寄存器的某些位状态来设置一个8位的寄存器或者内存操作数。比如SETE/SETNE/SETGE等等。

控制转移指令

这部分包括无条件转移指令JMP、条件转移指令Jcc/JCXZ、循环指令LOOP/LOOPE/LOOPNE、过程调用指令CALL、子过程返回指令RET、中断指令INTn、INT3、INTO、IRET等。注意,Jcc是一个指令簇,包含了很多指令,用于根据EFLAGS寄存器的某些位状态来决定是否转移;INT n是软中断指令,n可以是0到255之间的数,用于指示中断向量号。

比如INT 13中断是用来做磁盘读写的。

串操作

这部分指令用于对数据串进行操作,包括串传送指令MOVS、串比较指令CMPS、串扫描指令SCANS、串加载指令LODS、串保存指令STOS,这些指令可以有选择地使用REP/REPE/REPZ/REPNE和REPNZ的前缀以连续操作。

输入输出指令

这部分指令用于同外围设备交换数据,包括端口输入指令IN/INS、端口输出指令OUT/OUTS。

高级语言辅助指令

这部分指令为高级语言的编译器提供方便,包括创建栈帧的指令ENTER和释放栈帧的指令LEAVE。

控制和特权指令

这部分包括无操作指令NOP、停机指令HLT、等待指令WAIT/MWAIT、换码指令ESC、总线封锁指令LOCK、内存范围检查指令BOUND、全局描述符表操作指令LGDT/SGDT、中断描述符表操作指令LIDT/SIDT、局部描述符表操作指令LLDT/SLDT、描述符段界限值加载指令LSR、描述符访问权读取指令LAR、任务寄存器操作指令LTR/STR、请求特权级调整指令ARPL、任务切换标志清零指令CLTS、控制寄存器和调试寄存器数据传送指令MOV、高速缓存控制指令INVD/WBINVD/INVLPG、型号相关寄存器读取和写入指令RDMSR/WRMSR、处理器信息获取指令CPUID、时间戳读取指令RDTSC等。

浮点和多媒体指令

这部分指令用于加速浮点数据的运算,以及用于加速多媒体数据处理的单指令多数据(SIMD及其扩展SSEx)指令。这部分指令数据非常庞大,无法一一列举,请自行参考INTEL手册。

虚拟机扩展指令

这部分指令包括INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON等。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 预备知识 1.1 机器语言与汇编语言 1.1.1 机器语言 1.1.2 汇编语言 1.1.3 书中使用符号的说明 1.2 Intel系列机简介 1.2.1 Intel 80X86微处理器简介 1.2.2 Intel 80X86微处理器结构 1.2.3 80X86的3种工作方式 1.3 主存储器和物理地址的形成 1.3.1 主存储器 1.3.2 堆栈 1.3.3 物理地址的形成 1.4 数据在计算机内的表示形式 1.4.1 数值数据在计算机内的表示形式 1.4.2 BCD码 1.4.3 字符数据在机内的表示形式 1.5 标志寄存器 1.5.1 标志位 1.5.2 标志寄存器操作指令 1.6 汇编源程序举例 第2章 寻址方式 2.1 寄存器寻址 2.2 寄存器间接寻址 2.3 变址寻址 2.4 基址加变址寻址 2.5 立即寻址 2.6 直接寻址 2.7 寻址方式的有关问题 2.8 寻址方式综合举例 第3章 宏汇编语言 3.1 宏汇编语言中的表达式 3.1.1 常量与数值表达式 3.1.2 变量、标号与地址表达式 3.2 常用的机器指令语句 3.2.1 数据传送指令 3.2.2 算术运算指令 3.2.3 位操作指令 3.3 伪指令语句 3.3.1 处理器选择伪指令 3.3.2 数据定义伪指令 3.3.3 符号定义伪指令 3.3.4 段定义伪指令 3.3.5 源程序结束伪指令 3.4 常用的DOS系统功能调用 3.4.1 概述 3.4.2 常用的输入/输出系统功能调用 3.5 MASM的功能 3.5.1 MASM的功能 3.5.2 汇编过程 3.5.3 汇编列表文件 3.5.4 符号交叉列表文件 第4章 程序设计的基本方法 4.1 概述 4.2 顺序程序设计 4.3 分支程序设计 4.3.1 转移指令 4.3.2 分支程序设计举例 4.4 循环程序设计 4.4.1 循环程序的结构和控制方法 4.4.2 单重循环程序设计 4.4.3 多重循环程序设计 4.5 子程序设计 4.5.1 子程序的概念 4.5.2 子程序的定义 4.5.3 子程序的调用与返回 4.5.4 子程序调用现场的保护方法 4.5.5 主程序与子程序之间传递参数的方式 4.5.6 子程序及其调用举例 4.5.7 子程序的嵌套 4.6 程序设计中的注意事项 第5章 程序设计的其他方法和技术 5.1 字符串操作 5.1.1 串操作指令简介 5.1.2 串操作指令 5.2 宏功能程序设计 5.2.1 宏定义 5.2.2 宏调用 5.2.3 宏定义与宏调用中的参数 5.2.4 重复汇编伪指令 5.2.5 条件汇编伪指令 5.2.6 宏库的使用 5.2.7 宏指令与子程序的比较 5.3 模块化程序设计 5.3.1 组合方式 5.3.2 通信方式 5.3.3 连接程序(LINK)的功能 5.3.4 地址分配文件举例 5.4 源程序综合举例 5.4.1 模块程序设计中的注意事项 5.4.2 模块程序设计举例 第6章 输入/输出和WIN32编程 6.1 输入/输出指令和数据的传送方式 6.1.1 输入/输出指令 6.1.2 数据的传送方式 6.2 中断与异常 6.2.1 中断的概念 6.2.2 中断矢量表 6.2.3 软中断及有关的中断指令 6.2.4 中断处理程序的设计 6.3 浮点运算 6.3.1 浮点数据格式 6.3.2 FPU中的寄存器 6.3.3 浮点指令与程序设计 6.4 WIN32编程 6.4.1 WIN32编程基础 6.4.2 WIN32程序的结构 6.4.3 Windows API函数简介 6.4.4 编程实例 第7章 上机操作 7.1 在DOS环境下运行汇编源程序的方法 7.1.1 在DOS环境下运行汇编源程序的必备软件 7.1.2 DOS环境下运行汇编源程序的流程 7.1.3 DOS环境下运行汇编源程序的命令(MASM 6.0及以下版本) 7.2 多模块程序的运行及子程序库的使用 7.2.1 多模块程序的运行 7.2.2 子程序库的使用 7.3 在Windows环境下运行汇编源程序的方法 7.3.1 在Windows环境下运行32位汇编源程序的必备软件 7.3.2 在Windows环境下运行汇编源程序的特点 7.3.3 在Windows环境下32位汇编源程序的运行命令 7.4 调试程序Turbo Debugger的使用 7.4.1 TD的启动和退出 7.4.2 利用TD调试汇编语言程序 7.4.3 调试举例 附录 附录Ⅰ ASCII码字符表 附录Ⅱ 80X86指令系统简表 附录Ⅲ 伪指令表 附录Ⅳ DOS的软中断与系统功能调用 附录Ⅴ 常用BIOS子程序的功能及其调用参数 附录Ⅵ 汇编连接程序错误信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值