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汇编语言的参考内容:1. x86处理器的架构和特点:x86处理器系列有很多型号和版本,比如Intel的Pentium和Core系列、AMD的Athlon和Ryzen系列等。
了解每种型号处理器的架构和特点对于编写高效的汇编程序非常重要。
2. 汇编语言的基本语法:汇编语言是一种低级语言,它使用汇编指令来直接操作计算机硬件。
了解汇编语言的基本语法,包括寄存器、指令和操作码等内容,是编写汇编程序的基础。
3. 寄存器和内存:在x86汇编语言中,寄存器是非常重要的概念。
了解常用的寄存器,如通用寄存器、段寄存器以及标志寄存器,以及寄存器的使用方法和操作规则,在编写汇编程序时能够更加灵活地使用寄存器。
4. 指令集和操作码:x86处理器支持的指令集非常丰富,包括算术和逻辑指令、数据传输指令、控制指令等。
了解常用的指令集和操作码,以及它们的使用方法和功能,是编写汇编程序的基础。
5. 汇编程序的编写和调试:了解如何编写和调试汇编程序,包括使用汇编器将汇编代码转换为机器码、使用调试器进行程序的调试和内存的查看等。
学习汇编程序的编写和调试技巧,能够更加高效地完成汇编程序的开发和调试任务。
6. 汇编程序的优化:汇编语言可以直接操作硬件,因此在一些对性能要求较高的场景,使用汇编语言编写程序可以实现更高效的代码。
了解汇编程序的编译器优化和硬件优化方法,可以提高汇编程序的执行效率。
7. 汇编语言应用案例:了解汇编语言在实际项目中的应用案例,包括操作系统、驱动程序、嵌入式系统等。
通过学习实际应用案例,能够更好地理解汇编语言在底层系统软件开发中的重要性。
总之,汇编语言是一种低级编程语言,基于x86处理器的汇编语言编程需要了解x86处理器的架构和特点,掌握汇编语言的基本语法、指令集和操作码,熟悉寄存器和内存的使用方法,以及编写和调试汇编程序的技巧。
详解实模式,保护模式,虚拟8086模式

2014年11月29日 0:59
• 80x86处理器有三种工作模式:实模式,保护模式和虚拟8086模式
• 历史 ○ DOS时代,汇编凭借着特权可以随时访问系统内核,直接操作硬件,对系统安全造成威胁 ○ Windows时代的到来,不仅给我们带来了华丽的界面,更多的是给我们带来了“保护机 制”。将系统内核层层封装,用户仅能通过Windows提供的接口访问内核。即保护模式 ○ 为了兼容以前的MS-DOS程序,虚拟86模式应运而生。虚拟8086模式是以任务形式在保护模式 上执行的, 在80386上可以同时支持由多个真正的80386任务和虚拟8086模式构成的任务 ○ 其实,实模式和虚拟8086模式是为了向下兼容而设置的. 而保护模式是我们的主角, 是我们现
实际上, 80386就是通过在实模式下初始化控制寄存器, GDTR, LDTR, IDTR与TR等管理寄存 器以及页表, 然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的. 当然, 实模式下不支持硬件上的多任务切换
实模式下的中断处理方式和8086处理器相同, 也用中断向量表来定位中断服务程序地址 中断向量表的结构也和8086处理器一样: 每4个字节组成一个中断向量, 其中包括两个字节
○ 虚拟8086模式是以任务形式在保护模式上执行的, 在80386上可以同时支持由多个真正的 80386任务和虚拟8086模式构成的任务。虚拟8086模式以保护模式为基础, 它的工作方式实际 上是实模式和保护模式的混合
• 实模式
○ 以8086架构进行讲解,8086上一代8088 CPU中的寄存器都是8位的。而8086是16位的,是
显示的视频缓冲区和BIOS的地址空间
• 而在内存低端, 安排了中断向量表和BIOS数据区; 剩下从
简明x86汇编语言教程

第一章汇编语言简介先说一点和实际编程关系不太大的东西。
当然,如果你迫切的想看到更实质的内容,完全可以先跳过这一章。
那么,我想可能有一个问题对于初学汇编的人来说非常重要,那就是:汇编语言到底是什么?汇编语言是一种最接近计算机核心的编码语言。
不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。
不错,我们可以用机器语言写程序,但现在除了没有汇编程序的那些电脑之外,直接用机器语言写超过1000条以上指令的人大概只能算作那些被我们成为“圣人”的牺牲者一类了。
毕竟,记忆一些短小的助记符、由机器去考虑那些琐碎的配位过程和检查错误,比记忆大量的随计算机而改变的十六进制代码、可能弄错而没有任何提示要强的多。
熟练的汇编语言编码员甚至可以直接从十六进制代码中读出汇编语言的大致意思。
当然,我们有更好的工具——汇编器和反汇编器。
简单地说,汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。
至于宏汇编,则是包含了宏支持的汇编语言,这可以让你编程的时候更专注于程序本身,而不是忙于计算和重写代码。
汇编语言除了机器语言之外最接近计算机硬件的编程语言。
由于它如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。
用汇编语言编写的程序的速度通常要比高级语言和C/C++快很多--几倍,几十倍,甚至成百上千倍。
当然,解释语言,如解释型LISP,没有采用JIT技术的Java虚机中运行的Java 等等,其程序速度更无法与汇编语言程序同日而语。
永远不要忽视汇编语言的高速。
实际的应用系统中,我们往往会用汇编彻底重写某些经常调用的部分以期获得更高的性能。
应用汇编也许不能提高你的程序的稳定性,但至少,如果你非常小心的话,它也不会降低稳定性;与此同时,它可以大大地提高程序的运行速度。
我强烈建议所有的软件产品在最后Release之前对整个代码进行Profile,并适当地用汇编取代部分高级语言代码。
至少,汇编语言的知识可以告诉你一些有用的东西,比如,你有多少个寄存器可以用。
x86汇编语言:从实模式到保护模式(第2版)

16.1 任务的隔离和特权级保护 16.2 代码清单16-1 16.3 内核程序的初始化 16.4 加载用户程序并创建任务 16.5 用户程序的执行 本章习题
17.1 本章代码清单 17.2 任务切换前的设置 17.3 任务切换的方法 17.4 用jmp指令发起任务切换的实例 17.5 处理器在实施任务切换时的操作 17.6 程序的编译和运行 本章习题
第9章 硬盘和 显卡的访问与 控制
5.1 计算机的启动过程 5.2 创建和使用虚拟机
6.1 本章代码清单 6.2 欢迎来到主引导扇区 6.3 注释 6.4 在屏幕上显示文字 6.5 显示标号的汇编地址 6.6 使程序进入无限循环状态 6.7 完成并编译主引导扇区代码 6.8 加载和运行主引导扇区代码 6.9 程序的调试技术
7.1 代码清单7-1 7.2 跳过非指令的数据区 7.3 在数据声明中使用字面值 7.4 段地址的初始化 7.5 段之间的批量数据传送 7.6 使用循环分解数位 7.7 计算机中的负数 7.8 数位的显示 7.9 其他标志位和条件转移指令
8.1 从1加到100的故事 8.2 代码清单8-1 8.3 显示字符串 8.4 计算1到100的累加和 8.5 累加和各个数位的分解与显示 8.6 程序的编译和运行 8.7 8086处理器的寻址方式 本章习题
3.1 寄存器和字长 3.2 内存访问和字节序 3.3 古老的INTEL 8086处理器 本章习题
4.1 汇编语言程序 4.2 NASM编译器 4.3 配书文件包的下载和使用 本章习题
第6章 编写主引 导扇区代码
第5章 虚拟机的 安装和使用
第7章 相同的功 能,不同的代码
第8章 比高斯 更快的计算
精彩摘录
这是《x86汇编语言:从实模式到保护模式(第2版)》的读书笔记模板,可以替换为自己的精彩内容摘录。
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 str汇编指令
x86 str汇编指令
x86汇编指令中的str指令用于将数据从内存移动到寄存器中。
在x86架构中,mov指令可以实现相同的功能,但str指令具有一些优势。
首先,str指令遵循ARM汇编语义,即“加载/存储”(Load/Store)操作。
在ARM架构中,数据从内存到CPU之间的移动必须通过ldr/str 指令完成。
这与x86架构有所不同,x86架构中的mov指令可以在寄存器之间移动数据,或者将立即数移动到寄存器中。
其次,str指令在移动数据时具有更高的灵活性。
例如,str指令可以加载内存中的一个字节、字或双字数据到寄存器中,而mov指令只能移动一个字节或字。
此外,str指令还可以加载内存中的相对地址,这在某些场景下非常有用。
然而,需要注意的是,x86架构中并没有真正的ldr指令。
在x86汇编中,mov指令可以实现类似的功能,将从内存中某个地址的数据移动到寄存器中。
而str指令在x86架构中主要用作存储器到寄存器的数据传送。
总之,x86汇编指令中的str指令用于将数据从内存移动到寄存器,与mov指令具有相似的功能,但str指令在某些方面更具优势,例如
加载内存中的相对地址。
然而,需要注意的是,x86架构中并没有真正的ldr指令,而是使用mov指令来实现类似的功能。
汇编语言第2章80x86计算机组织
控制标志位
• 控制标志位 :DF 方向标志,用于串处理指令处理
▪ DF位为1时,每次操作后使变址寄存器SI和 DI减量,使串处理从高地址向低地址方向处 理:
▪ 当DF位为0时,则使SI和DI增量,使串处理 从低地址向高地址方向处理:
系统标志位
• IF:中断标志。 当IF=1时,允许中断; IF=0时关闭中断
数据的宽度 • 地址总线宽度:用以确定可访问的存储器的最
大范围
地址总线宽度
• 10位:210=1024单元,1K • 20位:220=1024* 210单元=1024K,1M • 24位:224=16*1M,16M • 30位:230=1024M,1G • 32位:232=4G,即4GB
二、一些名词术语(2)
• TF:陷井标志(跟踪标志)。用于单步方式操作 • IOPL:I/O特权级。控制对I/O地址空间访问
段寄存器
• 8086/8088、80286:四个段寄存器 ▪ 代码段CS,数据段DS,堆栈段SS,附加段ES
• 80386及后继机型:六个段寄存器 ▪ 代码段CS,数据段DS,堆栈段SS,附加段ES、 FS、GS---都是16位
• ZF:零标志。运算结果为0,置1;否则置0。 • CF:进位标志。记录从最高有效位产生的进位值。
最高有效位有进位时置1,否则置0。 • AF:辅助进位标志。记录运算时第3位产生的进位
值。如第3位有进位时置1,否则置0。 • PF:奇偶标志。当结果操作数中1的个数为偶数时置
1,否则置0。
标志符号 举例
段中的某一存储单元的地址 4. SI、DI一般与DS联用:
在串处理指令中,SI和DS联用,DI和ES联用
8086系统的堆栈
• 是存储器中的特殊区域 – 在堆栈段内,“FILO” – SP始终指向栈顶,总是字操作,指示栈顶的 偏移地址; – BP可作为堆栈区中的一个基地址以便访问 堆栈中的其他信息
《x86汇编语言:从实模式到保护模式》检测点和习题答案
《x86汇编语⾔:从实模式到保护模式》检测点和习题答案检测点1.1:按顺序分别为:13 15 78 255 128 56091检测点1.2:按顺序分别为:1000 1010 1100 1111 11001 1000000 1100100 11111111 1111101000 1111111111111111 100000000000000000000检测点1.3:按顺序分别为:8 10 11 12 13 14 15 16 31 1741 1022 4092 65535检测点1.4:按顺序分别为:8 a c f 19 40 64 ff 3e8 ffff 100000检测点1.5:1.按顺序分别为:11 1010 1100 1111 100000 111111 1011111110 1111111111111111 100111111100000001011101 11111001100111111111110111111112.按顺序分别为:1/1 11/3 0101/5 111/7 1001/9 1011/A 1101/D 1111/F 0/0 10/2 100/4 110/6 1000/8 1100/C 1110/E检测点1.6:1.4092/111111111100 2.27B6100/10011110110110000100000000第1章习题:1.5 C =15D=1111B =12D=1100B =10D=1010B =8H=1000B =11D=1011B =14D=1110B =16D=10000B 2.12 10101 10001111 1000000000 1FF检测点2.1:1.(2) (16) (4) (32) 2. (7) (8) 最⾼位 3. (00) (0F) (8) (00、02、04、06、08、0A、0C、0E) 双字时,是00、04、08、0C检测点2.2:A3D8H检测点2.3:1.8 (AX BX CX DX SI DI BP SP) (AH AL BH BL CH CL DH DL) 2.(A) (C) (D F) 3.(A B C D F)第2章习题:1. 64个 2. 25BC0H~35BBFH检测点3.1:1.(略) 2. (B) (A) (C)第3章习题:1. 00H、35H、40H 2. 49H(即73个字节)检测点4.1:1.(0) (0) (1) (0) (0) (1) 2. (A B C)检测点4.2:1.(略) 2. (略) 3.应在屏幕克上⾓显⽰a、s、m三个字母检测点5.1:1.(0xB8000) (0xB800) (0xF9E) (0x27) (0x48) 2. (E F G H J L) A错误的原因是企图向8位寄存器传送16位字; B错误的原因是向段寄存器传送⽴即数; C错误的原因是通过8位寄存器AL向段寄存器传送; D错误的原因是未指⽰内存操作数的长度; I错误的原因是两个寄存器不匹配; K错误的原因是在两个内存单元之间传送。
x86汇编指令集大全
x86汇编指令集⼤全-----------------------------------汇编指令集太多,如果不⽤就会忘记,所以将i处理器官⽅的指令集⼤全写到博客上,有需要的⼈可以参考⼀下!---------- ⼀、数据传输指令 ----------------------------------------------------它们在存贮器和寄存器、寄存器和输⼊输出端⼝之间传送数据.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位标志出栈.---------- ⼆、算术运算指令 ------------------------------------------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 与运算.OR 或运算.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 程序结束.---------- 七、处理机控制指令:标志处理指令 -----------CLC 进位位置0指令CMC 进位位求反指令STC 进位位置为1指令CLD ⽅向标志置1指令STD ⽅向标志位置1指令CLI 中断标志置0指令STI 中断标志置1指令NOP ⽆操作HLT 停机WAIT 等待ESC 换码LOCK 封锁========== 浮点运算指令集 =========⼀、控制指令(带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 E4---------- ⼆、数据传送指令 -----------------------------------------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 D1iii---------- 三、⽐较指令 -----------------------------------------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 E5---------- 四、运算指令 --------------------------------------FADD 把⽬的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在⽬的操作数后的变量或堆栈缓存器) 相加,并将结果存⼊⽬的操作数FADDP ST(i),ST 这个指令是使⽬的操作数加上 ST 缓存器,并弹出 ST 缓存器,⽽⽬的操作数必须是堆栈缓存器的其中之⼀,最后不管⽬的操作数为何,经弹出⼀次后,⽬的操作数会变成上⼀个堆栈缓存器了FIADD FIADD 是把 ST 加上来源操作数,然后再存⼊ ST 缓存器,来源操作数必须是字组整数或短整数形态的变数FSUB 减FSUBPFSUBR 减数与被减数互换FSUBRPFISUBFISUBRFMUL 乘FMULPFIMULFDIV 除FDIVPFDIVRFDIVRPFIDIVFIDIVRFCHS 改变 ST 的正负值FABS 把 ST 之值取出,取其绝对值后再存回去。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前沿:今年的前些时候,在杂志的一篇文章看到如下一句:―掌握汇编,仍是高手必经之路‖。
然而在实际的学习中,汇编往往因为其应用太难而被初学者忽视。
熟悉汇编语言,将是自己在软件调试时的―倚天剑‖,重要性实不言而喻。
也有很多在学习的过程中几次三番,最终退却。
希望这一篇文章可以与你一起,重拾汇编这把双刃剑。
文档转载请注明―天衣有缝‖原创。
0.本文讲述汇编语言的基础知识,寻址方式,指令系统,宏汇编,结构化程序设计,堆栈,函数,中断等知识1.汇编简介:汇编语言是一种符号语言,比机器语言容易理解和掌握,也容易调试和维护。
但是,汇编语言源程序要翻译成机器语言程序才可以由计算机执行。
这个翻译的过程称为―汇编‖,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序。
汇编语言虽然较机器语言直观,但仍然烦琐难懂。
于是人们研制出了高级程序设计语言。
高级程序设计语言接近于人类自然语言的语法习惯,与计算机硬件无关,易被用户掌握和使用。
汇编语言的特点:(1)汇编语言与处理器密切相关。
(2)汇编语言程序效率高。
(3)编写汇编语言源程序比编写高级语言源程序烦琐。
(4)调试汇编语言程序比调试高级语言程序困难。
汇编语言的主要应用场合:(1)程序执行占用较短的时间,或者占用较小存储容量的场合。
(2)程序与计算机硬件密切相关,程序直接控制硬件的场合。
(3)需提高大型软件性能的场合。
(4)没有合适的高级语言的场合。
2.数值数据:数值数据分为有符号数和无符号数。
无符号数最高位表示数值,而有符号数最高位表示符号。
有符号数有不同的编码方式,常用的是补码。
n位二进制数能够表示的无符号整数的范围是:0 ≤I ≤ 2n-1n位二进制数能够表示的有符号整数的范围是:-2(n-1)≤ I ≤+2(n-1)-1ASCII码:标准ASCII码用7位二进制数编码,共有128个。
计算机存储器基本单位为8位,ASCII码的最高位通常为0,通信时,最高位用作奇偶校验位。
ASCII码表中的前32个和最后1个编码是不能显示的控制字符,用于表示某种操作。
ASCII码表中20H后的94个编码是可显示和打印的字符,其中包括数码0~9,英文字母,标点符号等。
BCD码:虽然二进制数实现容易,但不符合人们的使用习惯,且书写阅读不方便,所以在计算机输入输出时通常还是采用十进制来表示数,这就需要实现十进制与二进制间的转换。
为了转换方便,常采用二进制编码的十进制,简称为BCD码。
BCD码就是用4位二进制数表示1位十进制整数。
表示的方法有多种,常用的是8421BCD码。
3.8086体系结构:总线接口部件(BIU)执行部件(EU)_________________ ___________________| 段寄存器| | ||________________| | 通用寄存器组|| 指令指针| | ||________________| |___________________||| || || |||| || || |||| || || ||_________________ || ||| |__________________________________________________| 地址产生与|________________________________________________ || 总线控制| || || | ||________________| __________________ | | || || | 操作数| | ||| || __________________ | ||| || || || | ||| || || || | |_________________ ___________________ | || | | | | || 指令队列|_____________| 标志寄存器|______________| || |_____________| |_______________ ||________________| |___________________||| |||| |||| ||___________________| || 逻辑算术单元|| |___________________4.8086寄存器组:AX:累加器,常用于保存临时数据 §BX:基址寄存器,主要用作指针,也可用作数据存储 §__数据寄存器______§CX:计数器 § §DX:数据寄存器,用于端口操作或临时数据 § §§ §_通用寄存器SP:堆栈指针,指向堆栈当前地址 §__堆栈指针寄存器__§BP:基址指针,常用于指向高级语言堆栈帧§ §SI:源操作数指针 §__变址寄存器______§DI:目的操作数指针 § §IP:指令指针§__控制寄存器FLAGS:标志寄存器§CS:代码段寄存器§DS:数据段寄存器§__段寄存器SS:堆栈段寄存器§ES:附加段寄存器§说明:变址和指针寄存器包括SI、DI、SP、BP4个16位寄存器,主要用于存放某个存储单元的偏移地址。
SI是源变址寄存器,DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。
SP为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址;BP为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。
CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。
8086CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到所在段段首址的字节距离。
在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。
标志寄存器:8086CPU中有一个很重要的16位标志寄存器,它包含9个标志位,主要用于保存一条指令执行后,CPU 所处状态信息及运算结果的特征。
A.条件标志(1)进位标志CF(2)零标志ZF(3)符号标志SF(4)溢出标志OF(5)奇偶标志PF(6)辅助进位标志AFB.状态控制标志(1)方向标志DF(2)中断允许标志IF(3)追踪标志TF5.物理地址的形成:把1M字节地址空间划成若干逻辑段。
每个逻辑段必须满足两个条件:一是逻辑段的起始地址(简称段首址)必须是16的倍数;二是逻辑段的最大长度为64K。
按照这两个条件,1M字节地址空间最多可划分成64K个逻辑段,最少也要划分成16个逻辑段。
逻辑段与逻辑段可以相连,也可以不连,还可以重叠。
计算方法:段乘以16加上偏移即物理地址。
6.寻址方式:A.立即寻址:例如:mov ax,35B.寄存器寻址:例如:mov ax,bxC.直接存储器寻址:例如: value dw 10hmov ax, value ;//利用ds段寄存器(默认)计算它在memory中的实际位置mov ax, ds:33h ;mov ss:2, ax ;//ss * 16 + 2D.间接存储器寻址:(1)寄存器间接寻址例如:mov ax, [bp] ;//ax值为(ss*16 +bp)指向的地址(2)变址寻址例如: table db 100 dup (?)mov ax, table[bx] ;//bx是数字下标(3)基址变址例如:mov ax, [bx][si] ;//bx * 16 + si(4)带位移基址变址例如:mov ax,table[bx][si] ;//指向table + bx + simov ax,10[bp][di] ;//指向10 + bp + diE:跨段问题:MOV AX,DS:[BP]MOV CX,SS:[SI]该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。
上述2条指令的源操作数物理地址分别为:PA1 =(DS)左移4位+[BP]PA2 =(SS)左移4位+[SI]7.指令系统之数据传送类指令:A.通用数据传送指令:1.传送指令MOV2.数据交换指令XCHG ----功能:将源地址与目的地址中的内容互换3.查表转换指令XLATB.堆栈操作指令:1.进栈指令PUSH2.出栈指令POPC.标志寄存器传送指令:1.标志送AH指令LAHF2.AH送标志指令SAHF3.标志寄存器进栈指令PUSHF4.标志寄存器出栈指令POPFD.地址传送指令:1.传送偏移地址指令LEA例如: a db ?lea bx, a ;bx is a's address2.传送偏移地址及数据段首址指令LDS语句格式:LDS OPD,OPS功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器。
3.传送偏移地址及附加数据段指令LES ---- 功能:将主存某字单元内容送指定寄存器。
语句格式:LES OPD,OPS功能:将主存某字单元内容送指定寄存器。
即(OPS)→OPD,(OPS+2)→ES。
E.输入输出指令:1.输入指令IN2.输出指令OUT8.指令系统之算术运算类指令:A.加法指令1.加1指令INC2.加指令ADD3.带进位加指令ADCB.减运算指令1.减1指令DEC2.减指令SUB3.求补指令NEG4.带借位减指令SBB5.比较指令CMP ---- 结果只影响标志位C.乘运算指令1.无符号数乘法指令MUL2.有符号乘指令IMULD.除运算指令1.无符号除指令DIV2.有符号除指令IDIVE.符号扩展指令1.字节转换成字指令CBW ---- 将AL中的符号位数据扩展至AH2.将字转换成双字指令CWD ---- 将AX中的符号位数据扩展至DXF.十进制调整指令1.压缩BCD码调整指令DAA2.非压缩BCD码调整指令DASG.非压缩BCD码调整指令(1)加法的非压缩BCD码调整指令AAA(2)减法的非压缩BCD码调整指令AAS(3)乘法的非压缩BCD码调整指令AAM(4)除法的非压缩BCD码调整指令AADH.位操作类指令逻辑运算指令1.求反指令NOT2.逻辑乘指令AND3.测试指令TEST4.逻辑加指令OR5.按位加指令XOR移位指令1.算术左移和逻辑左移指令SAL(SHL)语句格式:SAL OPD,1 或SHL OPD,1SAL OPD,CL或SHL OPD,CL功能:将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。
2.算术右移指令SAR语句格式:SAR OPD,1或SAR OPD,CLCF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。