X86汇编语言

合集下载

汇编语言基于x86处理器

汇编语言基于x86处理器

汇编语言基于x86处理器
汇编语言是一种低级编程语言,用于与计算机硬件直接交互。

基于x86处理器的汇编语言主要用于编写针对x86架构的计算机程序。

x86处理器是一种广泛使用的处理器架构,包括Intel和AMD 等厂商生产的多个处理器系列。

在x86汇编语言中,程序员使用特定的指令集来操作寄存器、内存和其他硬件设备,实现计算机指令的精确控制和数据处理。

以下是一些基于x86处理器的汇编语言的特点和要点:
寄存器:x86处理器提供了多个通用寄存器,如AX、BX、CX、DX等,以及专用寄存器如指令指针寄存器IP、堆栈指针寄存器SP等。

程序员可以使用这些寄存器来存储数据、进行计算和操作。

指令集:x86汇编语言提供了广泛的指令集,包括数据传输、算术运算、逻辑运算、条件分支、循环控制等。

程序员可以使用这些指令来实现各种操作和算法。

内存访问:x86汇编语言可以直接访问内存,读取和写入数据。

程序员需要了解内存地址和数据类型的操作方式,以正确地操作内存中的数据。

栈操作:x86汇编语言中的栈用于存储局部变量、函数调用和
返回地址等信息。

程序员可以使用栈指针寄存器来管理栈,并使用相关指令进行入栈和出栈操作。

中断处理:x86处理器支持中断和异常处理机制。

程序员可以编写中断处理程序,以响应硬件中断或软件触发的异常情况。

编写基于x86处理器的汇编语言程序需要对x86架构的指令集和寄存器使用有深入的理解,以及对计算机硬件和操作系统的了解。

熟练掌握汇编语言的编写技巧和调试工具对于开发和调优x86汇编语言程序非常重要。

汇编语言基于x86处理器

汇编语言基于x86处理器

汇编语言基于x86处理器汇编语言是一种低级编程语言,它直接操作计算机硬件进行指令级编程。

在x86架构下,汇编语言主要用于编写操作系统、驱动程序以及底层的系统软件。

以下是一些关于x86汇编语言的参考内容:1. x86处理器的架构和特点:x86处理器系列有很多型号和版本,比如Intel的Pentium和Core系列、AMD的Athlon和Ryzen系列等。

了解每种型号处理器的架构和特点对于编写高效的汇编程序非常重要。

2. 汇编语言的基本语法:汇编语言是一种低级语言,它使用汇编指令来直接操作计算机硬件。

了解汇编语言的基本语法,包括寄存器、指令和操作码等内容,是编写汇编程序的基础。

3. 寄存器和内存:在x86汇编语言中,寄存器是非常重要的概念。

了解常用的寄存器,如通用寄存器、段寄存器以及标志寄存器,以及寄存器的使用方法和操作规则,在编写汇编程序时能够更加灵活地使用寄存器。

4. 指令集和操作码:x86处理器支持的指令集非常丰富,包括算术和逻辑指令、数据传输指令、控制指令等。

了解常用的指令集和操作码,以及它们的使用方法和功能,是编写汇编程序的基础。

5. 汇编程序的编写和调试:了解如何编写和调试汇编程序,包括使用汇编器将汇编代码转换为机器码、使用调试器进行程序的调试和内存的查看等。

学习汇编程序的编写和调试技巧,能够更加高效地完成汇编程序的开发和调试任务。

6. 汇编程序的优化:汇编语言可以直接操作硬件,因此在一些对性能要求较高的场景,使用汇编语言编写程序可以实现更高效的代码。

了解汇编程序的编译器优化和硬件优化方法,可以提高汇编程序的执行效率。

7. 汇编语言应用案例:了解汇编语言在实际项目中的应用案例,包括操作系统、驱动程序、嵌入式系统等。

通过学习实际应用案例,能够更好地理解汇编语言在底层系统软件开发中的重要性。

总之,汇编语言是一种低级编程语言,基于x86处理器的汇编语言编程需要了解x86处理器的架构和特点,掌握汇编语言的基本语法、指令集和操作码,熟悉寄存器和内存的使用方法,以及编写和调试汇编程序的技巧。

简明x86汇编语言教程

简明x86汇编语言教程

第一章汇编语言简介先说一点和实际编程关系不太大的东西。

当然,如果你迫切的想看到更实质的内容,完全可以先跳过这一章。

那么,我想可能有一个问题对于初学汇编的人来说非常重要,那就是:汇编语言到底是什么?汇编语言是一种最接近计算机核心的编码语言。

不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。

不错,我们可以用机器语言写程序,但现在除了没有汇编程序的那些电脑之外,直接用机器语言写超过1000条以上指令的人大概只能算作那些被我们成为“圣人”的牺牲者一类了。

毕竟,记忆一些短小的助记符、由机器去考虑那些琐碎的配位过程和检查错误,比记忆大量的随计算机而改变的十六进制代码、可能弄错而没有任何提示要强的多。

熟练的汇编语言编码员甚至可以直接从十六进制代码中读出汇编语言的大致意思。

当然,我们有更好的工具——汇编器和反汇编器。

简单地说,汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。

至于宏汇编,则是包含了宏支持的汇编语言,这可以让你编程的时候更专注于程序本身,而不是忙于计算和重写代码。

汇编语言除了机器语言之外最接近计算机硬件的编程语言。

由于它如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。

用汇编语言编写的程序的速度通常要比高级语言和C/C++快很多--几倍,几十倍,甚至成百上千倍。

当然,解释语言,如解释型LISP,没有采用JIT技术的Java虚机中运行的Java 等等,其程序速度更无法与汇编语言程序同日而语。

永远不要忽视汇编语言的高速。

实际的应用系统中,我们往往会用汇编彻底重写某些经常调用的部分以期获得更高的性能。

应用汇编也许不能提高你的程序的稳定性,但至少,如果你非常小心的话,它也不会降低稳定性;与此同时,它可以大大地提高程序的运行速度。

我强烈建议所有的软件产品在最后Release之前对整个代码进行Profile,并适当地用汇编取代部分高级语言代码。

至少,汇编语言的知识可以告诉你一些有用的东西,比如,你有多少个寄存器可以用。

汇编语言的分类

汇编语言的分类

汇编语言的分类汇编语言是计算机编程中一种低级语言,用于将源代码转化为机器码以供计算机执行。

在计算机科学中,汇编语言可以根据不同的特性进行分类。

本文将介绍汇编语言的分类,并对每种分类进行详细说明。

一、按照使用的处理器进行分类根据所使用的处理器类型,汇编语言可以分为多类。

最常见的分类方式是根据处理器架构进行划分,主要包括x86汇编语言、ARM汇编语言和MIPS汇编语言等。

1. x86汇编语言:x86汇编语言是最广泛应用的汇编语言之一,主要用于x86架构的处理器,如英特尔的处理器和AMD的处理器。

x86汇编语言具有较高的执行效率和灵活性,广泛用于操作系统、驱动程序和嵌入式系统开发等领域。

2. ARM汇编语言:ARM汇编语言主要用于ARM架构的处理器,如移动设备和嵌入式系统中常见的ARM处理器。

ARM汇编语言具有较低的功耗和较高的性能,在移动应用、物联网和智能终端等领域得到广泛应用。

3. MIPS汇编语言:MIPS汇编语言用于MIPS架构的处理器,主要应用于嵌入式系统和网络设备等领域。

MIPS汇编语言具有简洁的指令集和高性能的特点,适用于资源有限的嵌入式系统。

二、按照指令系统进行分类根据指令系统的不同,汇编语言可以分为复杂指令集(CISC)和精简指令集(RISC)两类。

1. 复杂指令集(CISC):复杂指令集汇编语言具有丰富的指令集合和复杂的指令格式,可以实现多种功能。

CISC汇编语言中的每个指令可以执行复杂的操作,但由于指令集繁多,编程复杂度较高,难以提高执行效率。

2. 精简指令集(RISC):精简指令集汇编语言以简单、统一的指令格式为特点,指令集较为精简。

RISC汇编语言的每个指令只执行一项基本操作,简化了处理器的设计和编程的复杂性,并能够提高执行效率。

三、按照应用领域进行分类汇编语言还可以根据应用领域进行分类,不同应用领域对汇编语言具有不同的要求。

1. 系统级汇编语言:系统级汇编语言主要用于操作系统和底层系统软件开发,例如操作系统的内核、驱动程序等。

汇编语言基于x86处理器

汇编语言基于x86处理器

汇编语言基于x86处理器
汇编语言是一种底层编程语言,它直接操作计算机底层硬件,不同于高级语言,比如C++和Java等。

汇编语言基于x86处理器,这是一种广泛使用的处理器架构,它被用于大多数的个人计算机以及服务器等设备。

x86处理器架构是由英特尔公司于1978年推出的,它包括了多个版本,如x86-32和x86-64等。

x86-32是一个32位的处理器架构,而x86-64是一个64位的处理器架构。

汇编语言可以在不同版本的x86处理器上运行,但需要进行一些语法上的调整。

汇编语言的编写需要根据特定的处理器架构来进行,因为不同的处理器架构有不同的指令集,即不同的操作码。

指令集定义了可用的指令以及它们的操作方法,这些指令可以让程序员直接控制处理器的执行。

汇编语言程序员需要学习处理器的指令集,并且熟悉不同的指令及其使用方法,才能编写出有效的程序。

汇编语言的主要优点是它可以直接操作底层硬件,因此可以实现非常高效的程序。

但相对于高级语言,汇编语言的缺点是编写的程序通常比较难读懂,也比较难以维护。

此外,汇编语言编写的程序通常比高级语言的程序更容易受到安全漏洞的影响,因为它可以直接操作计算
机的内存和寄存器。

汇编语言的种类

汇编语言的种类

汇编语言的种类汇编语言是计算机领域中的一门编程语言,它与机器语言密切相关,用于书写可以被计算机直接执行的程序代码。

汇编语言直接操作计算机底层硬件,因此在性能和效果上具有很大优势。

在汇编语言中,不同的体系结构和处理器都有不同的指令集和语法规则,这导致了汇编语言的种类繁多。

本文将介绍几种常见的汇编语言。

1. x86汇编语言x86汇编语言是最为广泛应用的汇编语言之一,在PC和服务器领域得到广泛使用。

x86指令集是英特尔和AMD等处理器厂商所采用的指令集架构,在x86汇编语言中,可以直接操作寄存器、内存以及其他外设,具有很高的灵活性和可操作性。

x86汇编语言使用Intel语法和AT&T语法两种不同的语法规则,常用的编译器有MASM、NASM和GAS。

2. ARM汇编语言ARM汇编语言广泛应用于移动设备、嵌入式系统和物联网等领域。

ARM处理器以其低功耗、高性能和内容丰富的架构而闻名,ARM汇编语言可以直接操作处理器寄存器、存储器和外设,具有很好的可移植性和可扩展性。

ARM汇编语言使用ARM体系结构定义的指令集和语法规则,常用的编译器有ARM汇编器和GNU汇编器等。

3. MIPS汇编语言MIPS汇编语言被广泛应用在嵌入式系统、数字信号处理以及网络设备等领域。

MIPS处理器以其简洁的指令集和高效的架构而著称,MIPS汇编语言可以直接控制寄存器、存储器以及其他外设,具有很高的执行效率和指令流水线能力。

MIPS汇编语言使用MIPS体系结构定义的指令集和语法规则,常用的编译器有MIPS汇编器。

4. PowerPC汇编语言PowerPC汇编语言主要应用于IBM PowerPC架构的服务器、工作站以及游戏机等领域。

PowerPC处理器以其高性能和可扩展性而著称,PowerPC汇编语言可以直接操作处理器寄存器、存储器和外设,具有很好的可移植性和性能表现。

PowerPC汇编语言使用PowerPC指令集和语法规则,常见的编译器有PowerPC汇编器。

汇编语言种类

汇编语言种类
汇编语言是一种极为底层的编程语言,其主要功能是将人类易于理解的高级语言转换成机器可执行的低级语言。

随着计算机技术的不断发展,汇编语言的应用范围也越来越广泛。

目前,主要有以下几种汇编语言:
1. x86汇编语言
x86汇编语言是目前应用最广泛的汇编语言之一,特别是在个人电脑和服务器上。

它最早出现在英特尔的16位处理器上,目前已经发展成为可以支持64位处理器的一种汇编语言。

x86汇编语言的使用范围非常广泛,例如操作系统、编译器等大型软件中都会大量使用。

2. ARM汇编语言
ARM汇编语言是一种轻量级、低功耗的汇编语言,它主要应用于嵌入式系统、移动设备、消费类电子产品等领域。

相比x86汇编语言,ARM汇编语言的代码更加紧凑,执行效率更高。

3. MIPS汇编语言
MIPS汇编语言是一种32位RISC(精简指令集计算机)体系结构的汇编语言,主要用于嵌入式系统、网络设备、数字视频等领域。

其指令集极为精简,执行效率较高且可定制性强。

4. AVR汇编语言
AVR汇编语言是一种基于8位微处理器的汇编语言,主要用于嵌入式系统、数字信号处理等领域。

AVR汇编语言的代码具有很强的可读性和易于调试的特点。

总之,汇编语言虽然种类不同,但其基本原理和操作方式都十分
相似,学习一种汇编语言后再学习其他汇编语言就会相对容易了许多。

同时,在实际开发中,也需要根据具体应用场景选择最适合的汇编语言,以获得更好的性能和效率。

汇编语言的类型

汇编语言的类型汇编语言是一种低级语言,它是由机器指令和汇编指令组成的。

汇编语言是一种直接操作计算机硬件的语言,它可以直接控制计算机的各种硬件资源,如CPU、内存、I/O等。

汇编语言的类型主要有以下几种:1. x86汇编语言x86汇编语言是一种基于Intel x86架构的汇编语言,它是目前最为流行的汇编语言之一。

x86汇编语言可以直接操作CPU的寄存器、内存和I/O端口等硬件资源,它可以实现高效的程序设计和优化。

x86汇编语言的语法比较复杂,需要掌握大量的指令和寄存器,但是它可以实现非常高效的程序设计和优化。

2. ARM汇编语言ARM汇编语言是一种基于ARM架构的汇编语言,它是嵌入式系统和移动设备上最为流行的汇编语言之一。

ARM汇编语言可以直接操作CPU的寄存器、内存和I/O端口等硬件资源,它可以实现高效的程序设计和优化。

ARM汇编语言的语法比较简单,但是需要掌握大量的指令和寄存器。

3. MIPS汇编语言MIPS汇编语言是一种基于MIPS架构的汇编语言,它是嵌入式系统和网络设备上常用的汇编语言之一。

MIPS汇编语言可以直接操作CPU的寄存器、内存和I/O端口等硬件资源,它可以实现高效的程序设计和优化。

MIPS汇编语言的语法比较简单,但是需要掌握大量的指令和寄存器。

4. AVR汇编语言AVR汇编语言是一种基于AVR架构的汇编语言,它是嵌入式系统和单片机上常用的汇编语言之一。

AVR汇编语言可以直接操作CPU 的寄存器、内存和I/O端口等硬件资源,它可以实现高效的程序设计和优化。

AVR汇编语言的语法比较简单,但是需要掌握大量的指令和寄存器。

5. PowerPC汇编语言PowerPC汇编语言是一种基于PowerPC架构的汇编语言,它是IBM和苹果电脑上常用的汇编语言之一。

PowerPC汇编语言可以直接操作CPU的寄存器、内存和I/O端口等硬件资源,它可以实现高效的程序设计和优化。

PowerPC汇编语言的语法比较复杂,需要掌握大量的指令和寄存器,但是它可以实现非常高效的程序设计和优化。

x86架构汇编指令

x86架构汇编指令x86架构汇编指令是一种底层的机器语言指令集,用于在x86架构的计算机上执行任务。

它包含了一系列指令,用于操作寄存器、内存和其他硬件设备,以及进行算术和逻辑运算等操作。

本文将介绍几个常用的x86架构汇编指令,包括MOV、ADD、SUB和JMP。

1. MOV指令:MOV指令用于将数据从一个位置复制到另一个位置。

它的语法如下:MOV destination, source其中destination可以是一个寄存器或内存地址,source可以是一个寄存器、内存地址或立即数。

例如,MOV AX, BX将BX寄存器的值复制到AX寄存器中。

2. ADD指令:ADD指令用于将两个数相加,并将结果存储在目标位置。

它的语法如下:ADD destination, source其中destination可以是一个寄存器或内存地址,source可以是一个寄存器、内存地址或立即数。

例如,ADD AX, BX将AX寄存器的值与BX寄存器的值相加,并将结果存储在AX寄存器中。

3. SUB指令:SUB指令用于将两个数相减,并将结果存储在目标位置。

它的语法如下:SUB destination, source其中destination可以是一个寄存器或内存地址,source可以是一个寄存器、内存地址或立即数。

例如,SUB AX, BX将AX寄存器的值减去BX寄存器的值,并将结果存储在AX寄存器中。

4. JMP指令:JMP指令用于无条件地跳转到指定的地址。

它的语法如下:JMP destination其中destination可以是一个标签或地址。

例如,JMP LOOP将跳转到LOOP标签所在的位置。

除了上述指令外,x86架构汇编还包括许多其他指令,如CMP、AND、OR、NOT、XOR等,用于进行比较、逻辑运算和位操作等。

这些指令可以组合使用,以实现复杂的功能。

x86架构汇编指令的编写需要遵循一定的规范和语法。

每条指令都由一个助记符和操作数组成,它们之间用逗号隔开。

汇编语言指令大全X86和X87汇编指令大全(带注释)

汇编语⾔指令⼤全X86和X87汇编指令⼤全(带注释)⽬录⼀、数据传输指令1. 通⽤数据传送指令.2. 输⼊输出端⼝传送指令.3. ⽬的地址传送指令.4. 标志传送指令.⼆、算术运算指令三、逻辑运算指令四、串指令五、程序转移指令六、伪指令七、处理机控制指令:标志处理指令浮点运算指令集1、控制指令2、数据传送指令3、⽐较指令4、运算指令其它1.机械码,⼜称机器码.2.需要熟练掌握的全部汇编知识(只有这么多)3.常见修改(机器码)4.两种不同情况的不同修改⽅法⼀、数据传输指令它们在存贮器和寄存器、寄存器和输⼊输出端⼝之间传送数据.1. 通⽤数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压⼊堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压⼊堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压⼊堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器⾥字节的顺序XCHG 交换字或字节.(⾄少有⼀个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG ⽐较并交换操作数.(第⼆个操作数必须为累加器AL/AX/EAX)XADD 先交换再累加.(结果在第⼀个操作数⾥)XLAT 字节查表转换.----BX指向⼀张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)2. 输⼊输出端⼝传送指令.IN I/O端⼝输⼊. ( 语法: IN 累加器, {端⼝号│DX} )OUT I/O端⼝输出. ( 语法: OUT {端⼝号│DX},累加器 )输⼊输出端⼝由⽴即⽅式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. ⽬的地址传送指令.LEA 装⼊有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送⽬标指针,把指针内容装⼊DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送⽬标指针,把指针内容装⼊ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送⽬标指针,把指针内容装⼊FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送⽬标指针,把指针内容装⼊GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送⽬标指针,把指针内容装⼊SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装⼊AH.SAHF 标志寄存器传送,把AH内容装⼊标志寄存器.PUSHF 标志⼊栈.POPF 标志出栈.PUSHD 32位标志⼊栈.POPD 32位标志出栈.⼆、算术运算指令ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的⼗进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEG 求反(以 0 减之).CMP ⽐较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的⼗进制调整.MUL ⽆符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),IMUL 整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV ⽆符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).IDIV 整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上⼋种移位指令,其移位次数可达255次.移位⼀次时, 可直接⽤操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04 SHL AX,CL四、串指令DS:SI 源串段寄存器 :源串变址.ES:DI ⽬标串段寄存器:⽬标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志 0表⽰重复操作中SI和DI应⾃动增量; 1表⽰应⾃动减量.Z标志⽤来控制扫描或⽐较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串⽐较.( CMPSB ⽐较字符. CMPSW ⽐较字. )SCAS 串扫描.把AL或AX的内容与⽬标串作⽐较,⽐较结果反映在标志位.LODS 装⼊串.把源串中的元素(字或字节)逐⼀装⼊AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或⽐较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或⽐较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令1. ⽆条件转移指令 (长转移)JMP ⽆条件转移指令CALL 过程调⽤RET/RETF 过程返回.2. 条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不⼩于或不等于时转移.JAE/JNB ⼤于或等于转移.JB/JNAE ⼩于转移.JBE/JNA ⼩于或等于转移.以上四条,测试⽆符号整数运算的结果(标志C和Z).JG/JNLE ⼤于转移.JGE/JNL ⼤于或等于转移.JL/JNGE ⼩于转移.JLE/JNG ⼩于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC ⽆进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为 "0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为 "1" 时转移.3. 循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4. 中断指令INT 中断指令INTO 溢出中断IRET 中断返回5. 处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯⽚引线TEST为⾼电平时使CPU进⼊等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置⽅向标志位.CLD 清⽅向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建⽴段寄存器寻址.ENDS 段结束.END 程序结束.七、处理机控制指令:标志处理指令CMC 进位位求反指令STC 进位位置为1指令CLD ⽅向标志置1指令STD ⽅向标志位置1指令CLI 中断标志置0指令STI 中断标志置1指令NOP ⽆操作HLT 停机WAIT 等待ESC 换码LOCK 封锁浮点运算指令集1、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)FINIT 初始化浮点部件机器码 9B DB E3FCLEX 清除异常机器码 9B DB E2FDISI 浮点检查禁⽌中断机器码 9B DB E1FENI 浮点检查禁⽌中断⼆机器码 9B DB E0WAIT 同步CPU和FPU 机器码 9BFWAIT 同步CPU和FPU 机器码 D9 D0FNOP ⽆操作机器码 DA E9FXCH 交换ST(0)和ST(1) 机器码 D9 C9FXCH ST(i) 交换ST(0)和ST(i) 机器码 D9 C1iiiFSTSW ax 状态字到ax 机器码 9B DF E0FSTSW word ptr mem 状态字到mem 机器码 9B DD mm111mmmFLDCW word ptr mem mem到状态字机器码 D9 mm101mmmFSTCW word ptr mem 控制字到mem 机器码 9B D9 mm111mmmFLDENV word ptr mem mem到全环境机器码 D9 mm100mmmFSTENV word ptr mem 全环境到mem 机器码 9B D9 mm110mmmFRSTOR word ptr mem mem到FPU状态机器码 DD mm100mmmFSAVE word ptr mem FPU状态到mem 机器码 9B DD mm110mmmFFREE ST(i) 标志ST(i)未使⽤机器码 DD C0iiiFDECSTP 减少栈指针1->0 2->1 机器码 D9 F6FINCSTP 增加栈指针0->1 1->2 机器码 D9 F7FSETPM 浮点设置保护机器码 DB E42、数据传送指令FLDZ 将0.0装⼊ST(0) 机器码 D9 EEFLD1 将1.0装⼊ST(0) 机器码 D9 E8FLDPI 将π装⼊ST(0) 机器码 D9 EBFLDL2T 将ln10/ln2装⼊ST(0) 机器码 D9 E9FLDL2E 将1/ln2装⼊ST(0) 机器码 D9 EAFLDLG2 将ln2/ln10装⼊ST(0) 机器码 D9 ECFLDLN2 将ln2装⼊ST(0) 机器码 D9 EDFLD real4 ptr mem 装⼊mem的单精度浮点数机器码 D9 mm000mmmFLD real8 ptr mem 装⼊mem的双精度浮点数机器码 DD mm000mmmFLD real10 ptr mem 装⼊mem的⼗字节浮点数机器码 DB mm101mmmFILD word ptr mem 装⼊mem的⼆字节整数机器码 DF mm000mmmFILD dword ptr mem 装⼊mem的四字节整数机器码 DB mm000mmmFILD qword ptr mem 装⼊mem的⼋字节整数机器码 DF mm101mmmFBLD tbyte ptr mem 装⼊mem的⼗字节BCD数机器码 DF mm100mmmFST real4 ptr mem 保存单精度浮点数到mem 机器码 D9 mm010mmmFST real8 ptr mem 保存双精度浮点数到mem 机器码 DD mm010mmmFIST word ptr mem 保存⼆字节整数到mem 机器码 DF mm010mmmFIST dword ptr mem 保存四字节整数到mem 机器码 DB mm010mmmFSTP real4 ptr mem 保存单精度浮点数到mem并出栈机器码 D9 mm011mmmFSTP real8 ptr mem 保存双精度浮点数到mem并出栈机器码 DD mm011mmmFSTP real10 ptr mem 保存⼗字节浮点数到mem并出栈机器码 DB mm111mmmFISTP word ptr mem 保存⼆字节整数到mem并出栈机器码 DF mm011mmmFISTP dword ptr mem 保存四字节整数到mem并出栈机器码 DB mm011mmmFISTP qword ptr mem 保存⼋字节整数到mem并出栈机器码 DF mm111mmmFBSTP tbyte ptr mem 保存⼗字节BCD数到mem并出栈机器码 DF mm110mmmFCMOVB ST(0),ST(i) <时传送机器码 DA C0iiiFCMOVBE ST(0),ST(i) <=时传送机器码 DA D0iiiFCMOVE ST(0),ST(i) =时传送机器码 DA C1iiiFCMOVNB ST(0),ST(i) >=时传送机器码 DB C0iiiFCMOVNBE ST(0),ST(i) >时传送机器码 DB D0iiiFCMOVNE ST(0),ST(i) !=时传送机器码 DB C1iiiFCMOVNU ST(0),ST(i) 有序时传送机器码 DB D1iiiFCMOVU ST(0),ST(i) ⽆序时传送机器码 DA D1iii3、⽐较指令FCOM ST(0)-ST(1) 机器码 D8 D1FCOMI ST(0),ST(i) ST(0)-ST(1) 机器码 DB F0iiiFCOMIP ST(0),ST(i) ST(0)-ST(1)并出栈机器码 DF F0iiiFCOM real4 ptr mem ST(0)-实数mem 机器码 D8 mm010mmmFCOM real8 ptr mem ST(0)-实数mem 机器码 DC mm010mmmFICOM word ptr mem ST(0)-整数mem 机器码 DE mm010mmmFICOM dword ptr mem ST(0)-整数mem 机器码 DA mm010mmmFICOMP word ptr mem ST(0)-整数mem并出栈机器码 DE mm011mmmFICOMP dword ptr mem ST(0)-整数mem并出栈机器码 DA mm011mmmFTST ST(0)-0 机器码 D9 E4FUCOM ST(i) ST(0)-ST(i) 机器码 DD E0iiiFUCOMP ST(i) ST(0)-ST(i)并出栈机器码 DD E1iiiFUCOMPP ST(0)-ST(1)并⼆次出栈机器码 DA E9FXAM ST(0)规格类型机器码 D9 E54、运算指令FADD 把⽬的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在⽬的操作数后的变量或堆栈缓存器) 相加,并将结果存⼊⽬的操作数FADDP ST(i),ST 这个指令是使⽬的操作数加上 ST 缓存器,并弹出 ST 缓存器,⽽⽬的操作数必须是堆栈缓存器的其中之⼀,最后不管⽬的操作数为何,经弹出⼀次后,⽬的操作数会变成上⼀个堆栈缓存器了FIADD FIADD 是把 ST 加上来源操作数,然后再存⼊ ST 缓存器,来源操作数必须是字组整数或短整数形态的变数FSUB 减FSUBPFSUBR 减数与被减数互换FSUBRPFISUBFISUBRFMUL 乘FMULPFIMULFDIV 除FDIVPFDIVRFDIVRPFIDIVFIDIVRFCHS 改变 ST 的正负值FABS 把 ST 之值取出,取其绝对值后再存回去。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编(破解系列基础)(王爽汇编语言笔记第一版2013-8-1)(王爽汇编语言笔记第二版2013-8-11)笔记目录:第一章:基础知识(机器语言与汇编语言,及8086cpu的地址数据控制总线。

)第二章:寄存器cpu工作原理(寄存器的初步认识,字和字节概念,最主要的是8086cpu物理地址的表达方法,及汇编开始执行代码段。

)第三章:寄存器的内存访问(cpu是如何访问内存的,并附加一些简单的汇编指令,重要的是栈概念的引入。

)第四章:第一个程序(==,主要记录DEBUG是怎么用的......)第五章:[bx]和loop指令(循环的引入,及段前缀的概念。

)第六章:包含多个段的程序(包含多个段使程序使数据代码栈更加清晰)第七章:更灵活的定位内存地址的方法(引进SI DI16寄存器使程序寻址更加方便,模拟高级语言中数组和结构体表达,及and和or指令汇编指令。

)第八章:数据处理的两个基本问题(==)第九章:跳转指令的原理(jmp jcxz各种跳转地址表达方法,及offset操作符。

)第十章:call和ret(最重要,类似高级语言中函数的功能。

)第十一章:标志寄存器(各种”jump”,各种标志位...每次执行后可由标志位判断数据处理情况,破解中尤其重要。

)第一章:基础知识1:【机器语言】(010000001000000)0和1的组成2:【汇编语言】:每条汇编指令对应一条机器语言13BE:0100B80010MOV AX,1000(B8对应AX,0010高低字节对应1000,第十章中有详细的解释)3:【CPU对内存的读写】(8086CPU,X86)CPU到内存3条总线:控制总线地址总线数据总线①地址总线(内存索引):8086CPU一共16条,每条传送0或1。

②数据总线(CPU与外部的传送速度)③控制总线(多少种控制总线是CPU对外界器件有多少种控制,有些命令是几根控制线综合发出的)4:【RAM(随机储存)和ROM(只读储存)】RAM和ROM是内存,硬盘是外存。

①RAM主随机存储器②ROM刷BIOS储存引导设置(把病毒刷入BIOS…^^)③接口卡RAM比如显存第二章:寄存器CPU工作原理5:【8086CPU的寄存器】通用类:AX BX CX DX,16位寄存器。

通用类又可以分为高段(AH)低段(AL),也就是高字节和低字节8位段地址类:CS(代码段地址)DS(数据段地址)SS(栈段)ES(混合类)6:【段地址*16(十进制)+偏移地址=物理地址】【段地址*10H(十六进制)+偏移地址=物理地址】两个表达式表达的意思是一样的8086CPU内存空间有1MB,但8086CPU的地址总线只有十六位,2的16次方等于65536(0~65535)等于十六进制的FFFF,65536B/1024=64kb,也就是一个段的长度。

最后引进了段地址*16(十进制)+偏移地址=物理地址。

因为物理地址表达方法是十六进制*16相当于把十六进制向前移了1位,4个二进制等于16进制,FFFFF(10485575)/1024=1023KB(0~1023KB),【2的20次方等于10485575/1024=1024kb】1024KB等于1MB,所以段地址只用移一位在加上偏移地址,用【段地址:偏移地址】(debug)的方法就可以表达8086CPU索引的1MB了。

1230H=100100011000012300H=10010001100000000(二进制左移四位)12300H1230H*10H=12300HFFFFFH=FFF0*10H+FF7:【CS和IP(跳到哪执行)】CS段地址*10H+IP(偏移地址)=CS:IP(debug)汇编:修改CS和IP值(JMP CS:IP)直接跳转到某地址。

Debug:-R CS-R IPCS(代码寄存器)指到的内存段,当作代码要执行,执行汇编语句。

和DS一样的是数据都是十六,但一个解释为数据,一个解释为执行命令。

CS和IP决定从哪执行,把后面的数据当代码执行。

8:【Debug(调试程序)】-R查看寄存器值-T执行(CS:IP)-A写汇编指令-U查看(内存地址十六进制汇编指令)-D查看(二进制)-D段地址:偏移地址首偏移地址尾-E改写内存第三章:寄存器(内存访问)9:【内存器中字的存储】2byte=1字,8bit=1byte。

一个十六进制是4位二进制ADBF是一个字,AD,BF 是一个字节,对字于分低字节高字节。

例如:1单元D82单元263单元17一个字获取两个单元,1的地址单元字的数据是是26D8,因为2的地址单元是高字节,从高字节到低字节读(字的读法)10:【DS和address】DS从内存地址中读数据。

MOV AX,1000HMOV DS,AXMOV BL,[0]前面两句获取内存地址,1000(DS)是数据段段地址,[0]是偏移地址,1000:0。

MOV AL,[0]和MOV AX,[0]区别,一个是把地址当字节(八位)传送,一个是把他当字(十六位)传送,如果是MOV AX,[0]那么AX读取的地址是10001H(高字节)10000H(低字节)11:【栈】先进后出,后进先出。

栈底(高地址)栈顶(低地址),PUSH ax(将AX中数据推进栈中)POP AX(将栈顶的数据取出放入AX)SS:SP栈顶是随时变化的,SS:SP始终指向栈顶。

SS是段地址,SP栈顶偏移地址。

PUSH 推进栈时,栈顶向地址向低物理地址,所以SP-2。

POP出栈时SP+2逐步朝向栈底。

栈空时不存在栈,指向栈空间下一个单元。

PUSH:执行PUSH时,SP先-2,指向准备压入数据的低字节(从图中可看出高字节在下,低字节在上)POP:执行POP时,先将SS:SP指向的数据送入寄存器中,然后POP+2指向新的栈顶。

空栈:空栈时,SP指向栈空间的下一个单元,可以想象PUSH压栈SP-2,向上移两个单元,SP-1放高字节,SP-2放低字节。

也可以想象栈中只有两个单元时POP的情况...第四章:第一个程序13:汇编指令(翻译为机器码,比如MOV)伪指令(由编译器处理,比如assume ends)14:debug追踪查看。

编译的EXE文件所在的目录J:\new\debug new.exe(new.exe是编译过的文件)Debug的追踪数据,CX是文件的长度(字节),程序刚开始追踪,CX没有设值时。

程序加载的过程,首先找一段内存空间(SA),它的前256字节(100H)存放的是PSP (CMD与DEBUG交换数据区域),然后把它SA存入DS中。

总结表达是SA+10H:0000(程序的代码存放地址)SA+10H段地址,计算内存物理地址方法。

段地址×10H+偏移地址(0000)。

(SA+10H)×10H+0000,PSP(100H,256字节)目前来说上面的PSP不重要==第五章:[BX]和LOOP指令15:【[BX]和LOOP】[bx]偏移地址LOOP:循环,CX记循环次数。

每次执行到LOOP标号,CX-1,如果CX=0跳出循环,否则一直执行...嵌套循环时要注意CX多次赋值导致的程序错误。

点我寻找解决方法LOOP标号标号编译器会翻译成执行语句的偏移地址(IP),loop的最大距离FF的正负补码形式,后面会有详细的解释。

16:【LOOP和[BX]的联合应用】原题是将FFFF:0H~FFFF:BH中的字节数据相加,8位字节型不可直接加到16位的寄存器上,这样可能出现错误。

于是有了一种方法,简单的说是把字节数据放到低8位中,高8位设0,然后把高8为低8位结合成16位后。

17:【段前缀和一段安全的空间】修改默认的DS段寄存器,比如MOV AX,SS:[0]。

段地址SS偏移0单元内容放到AX 中。

一段安全空间,0:200~0:2FF。

第六章:包含多个段的程序18:【包含多个代码段程序】汇编查的地址不同,翻译的语句不同(一个字节内容对应指令,没有设入口点一堆字节乱对应)。

设置入口点辨别代码从哪个地址开始翻译。

使用入口标志符,前面的可以用DW定义数据,执行的时候从开始标识符执行CS:IP CS段地址不变IP加偏移19:【在代码段中使用数据】方法如同在代码段中使用数据一样(入口标识符前定义),如果定义8个字单元(0~15)数据,和8个字单元栈(16~31),因为栈的初始化是空的一堆0,所以sp指向的栈顶+2也就是栈的下一字节。

20:【包含多个段的程序】【assume cs:a,ds:b,ss:c】【mov ax,b mov ds,ax】第七章:更灵活定位内存地址的方法21:【AND和OR】AND和OR的运算补充:【XOR和NOT】XOR异或逻辑运算:XOR操作数一,操作数二,如果两个数相等为假,两个书不想等为1。

NOT非逻辑运算,NOT操作数一,对操作数取反吧==。

22:【ASCII】128位标准ASCII码,及扩展ASCII码。

23:【字符形式给出的数据】【db‘A’】定义的字节数据【dw‘A’】定义的字数据,A是字型的。

【db1,2,3】定义的1,2,3是字节数据。

24:【SI和DI】SI和DI十六的寄存器,作用和BX相似但不可以拆分成两个8位寄存器25:【bx+idate】偏移地址的组合,灵活运用。

比如【二维数组】26:【bx+si】比如【嵌套循环】,由于循环LOOP与CX绑定,所以进入第二层循环时会覆盖第一层循环导致程序错误。

这时栈便发生了他的作用,先进后出,可以用栈PUSH外层数据后进入内层循环,内层循环后在用POP恢复外层数据。

27:【bx+si+idata】……注意:[DI+SI]不可以用这种表现方式,BX是女的,SI和DI是男的。

[SI+DI]等于搞基。

第八章:数据处理两个基本问题28:【BX DI SI BP】BP默认段地址在SS中。

29:【数据处理位置的表达】1:立刻数直接包含在机器码中的数据(执行前在CPU缓冲器中)2:寄存器指令要处理的数据在寄存器中3:段地址×16+偏移地址指令要处理的数据在指定的内存中以上三种数据位置表达方式的翻译。

30:【寻址方式】1:直接寻址mov ax,[0]2:寄存器间接寻址mov ax,bx3:寄存器相对寻址mov ax,[bx+1]4:基址变址寻址mov ax,[bx+si]5相对基址变址寻址mov ax,[bx+si+idate] 31:【指令要处理的数据是多长】1:在寄存器位数的情况下MOV AX,10H这个指令处理16位MOV AL,10这个指令处理8位……2:在没有寄存器位数的情况下push AX栈一次推进2字节(sp-2)…….3:ptr指令制定访问单元是byte还是wordmov byte ptr ds:[10],1ds:[10]01mov word ptr ds:[10],1ds:[11]01ds[10]0032:【寻址方式的综合利用】模拟高级语言的数组及结构体33:【div指令】纠结的除法指令==,被除数放在AX或AX和DX中。

相关文档
最新文档