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处理器的架构和特点,掌握汇编语言的基本语法、指令集和操作码,熟悉寄存器和内存的使用方法,以及编写和调试汇编程序的技巧。

详解实模式,保护模式,虚拟8086模式

详解实模式,保护模式,虚拟8086模式
详解实模式,保护模式,虚拟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汇编语言教程

简明x86汇编语言教程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

x86汇编语言:从实模式到保护模式(第2版)

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架构的计算机上执行任务。

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

本文将介绍几个常用的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汇编指令中的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计算机组织

汇编语言第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汇编语言:从实模式到保护模式》检测点和习题答案

《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汇编指令集大全

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 之值取出,取其绝对值后再存回去。

x86-1-32位x86处理器编程架构

x86-1-32位x86处理器编程架构

x86-1-32位x86处理器编程架构x86(32位)-1-32位x86 处理器编程架构Intel 32 位处理器架构简称IA-32(Intel Architecture,32-bit)x86是指intel的86系列的CPU统称,⽐如说8086就是x86⾥⾯中的⼀款CPU。

IA-32,X86-32是指intel的32位CPU架构。

x86系列的处理器架构是从8086发展来的,是基于8086 的,具有延续性和兼容性。

所以x86系列的CPU都可以和8086CPU进⾏类⽐。

1.1 基本执⾏环境:1.1.1 地址空间:32 位的处理器有32根地址线,数据线的数量是32 根或者64根。

因此,它可以访问2的32次⽅(4GB)的内存地址空间,每次可以读写连续的4 字节或者8 字节,这称为双字(Double Word)或者4 字(Quad Word)访问。

1.1.2 寄存器:32位x86 CPU总共包含了8个通⽤寄存器,6个16位段寄存器,⼀个状态处理器EFLAGS和⼀个指令指针寄存器。

1.1.2.1 通⽤寄存器在16位CPU内,有8个通⽤寄存器AX、BX、CX、DX、SI、DI、 BP 和SP,其中,前4个还可以拆分成两个独⽴的8 位寄存器来⽤,即AH、AL、BH、BL、CH、CL、DH 和DL。

32 位处理器在16位处理器的基础上,扩展了这8 个通⽤寄存器的长度,使之达到32位。

其中这个32位相对于16位扩展的寄存器就在16位寄存器的名字上加了⼀个E,这个E就是Extend中⽂扩展的意思。

32 位通⽤寄存器的⾼16 位是不可独⽴使⽤的,但低16 位保持同16 位处理器的兼容性。

在任何时候它们都可以像在16位CPU⾥⼀样使⽤。

32位CPU是兼容16位CPU的,所以照样可以在32 位处理器上运⾏16 位处理器上的软件。

1.1.2.2 指令指针寄存器为了⽣成32 位物理地址,32 位处理器将IP寄存器扩展到了32 位,即EIP。

《x86汇编语言:从实模式到保护模式》勘误表

《x86汇编语言:从实模式到保护模式》勘误表

1,第42页,检测点4.2,第1题。

本程序有误,正确的内容是:(由网易邮箱读者'小小鸟'、QQ读者'闪耀'、'流星梦'和'二玉'发现)mov ax,0xb800mov ds,axmov byte [0x00],'a'mov byte [0x02],'s'mov byte [0x04],'m'jmp $times 510-($-$$) db 0db 0x55,0xaa2,第52页,第24行,正确的内容是:(由QQ读者'闪耀'发现)mov ax,[0x02] ;按字操作3,第53页,第4行,正确的内容是:(由QQ读者'tome'发现)mov [0x02],bl4,第65、80、94、129、138页中,需要更正和明确loop指令、短转移指令jmp short、相对近转移指令jmp near和相对近调用指令call near的操作数计算方法和执行过程。

(由网易邮箱读者'小小鸟'、QQ读者'艾小羊'提出)首先,这些指令的操作数都是相对于目标位置处的偏移量。

但需要指出的是,偏移量的计算方法取决于实际的编译器,书中所说的“用目标位置处的汇编地址减去当前指令的汇编地址,再减去当前指令的长度”,不应算错。

其次,处理器的执行过程严格地说,是非IA-32架构的组成部分。

因此,除了结果是确定的,各步骤的先后次序取决于处理器的设计。

历史上,指令的执行过程有不同的解释和说法。

但本书对这些指令执行过程的解释比较模糊和武断。

为严谨起见,再统一描述如下:在以上指令的编译阶段,编译器用目标位置处的汇编地址减去当前指令的下一条指令的汇编地址,结果做为操作数;处理器在执行一条指令时,指令指针寄存器IP会自动指向下一条指令。

因此,当以上指令执行时,IP的内容就是下一条指令的偏移地址。

X86架构内存编址及启动过程

X86架构内存编址及启动过程

X86架构内存编址及启动过程X86架构内存编址及启动过程1.几个名词X86架构:Intel,AMD CPU采用的结构体系.实模式,16位模式:X86体系CPU 启动是处于此模式.DOS 启动完成也是此模式,直接使用物理地址保护模式,虚模式,32位模式:linux,windows启动后进入此模式.使用虚拟地址.2.8086CPU的限制.X86架构是从8086发展来的,所以后来的CPU都保留了8086的限制.理解内存编址,要了解8086.8086是16为CPU,地址总线20位.8086采用分段机制.寻址方式是段基址+偏移量.8086中,基本的段寄存器是CS,DS,SS,ES.都是16位寄存器.寻址时,段寄存器地址左移4位,加上偏移量.就是需要的物理地址.所以8086最大只能访问0xfffff以内的空间(1M).3.8086编址在这种体系结构下,640K(0xA0000)以下称为基本内存.这就是系统可用的内存.0xA0000~ 0xBFFFF用于显卡缓存.(640K开始的部分)0xC0000开始用于BIOS,一般显卡BIOS从0xC0000开始.系统BIOS放到可访问的1M内存最后.中间是一些其他设备的BIOS,都有各自的固定起始地址.4.8086启动过程.系统加电启动的时候,CPU清0.然后CS寄存器设为0xFFFF,IP寄存器设为0x0000.对应的物理地址就是0xFFFF0.可见这是在系统BIOS 里面.一般是一条跳转指令,跳转到真正的BIOS处开始执行.BIOS首先自检,此时如果发现严重错误,比如没有内存,直接鸣喇叭,(因为还没用显卡初始化.如果没有CPU呢?没有任何反应).然后执行显卡BIOS,显示显卡信息.显示系统BIOS自己的信息.如果是从硬盘启动,读取MBR到0x7C00处.如果引导程序是GRUB,MBR里就包括GRUB的stage1代码.如果不使用state1.5,就通过物理扇区直接寻址stage2(因为没有文件系统).如果是linux系统,就加载kernel image.如果是用"make zImage"编译的内核,就加载到0x10000处(64K位置).如果是用"make bzImage"编译的内核,就加载到0x100000处(1M位置).剩下的就是内核的事情了.。

x86的编码格式

x86的编码格式

x86 是一种常见的处理器架构,其指令集体系结构采用变长指令编码格式。

x86 指令编
码格式包括不同长度的指令前缀、操作码(Opcode)、操作数和寻址模式。

在 x86 架构中,指令长度可以是 1 到 15 个字节不等。

常见的指令长度为 1 到 6 个字节。

以下是 x86 指令编码的常见格式:
1. 前缀字节(Prefix Byte):前缀字节用于修改指令的某些属性,如操作数大小、地址
大小等。

2. 操作码(Opcode):操作码指定了要执行的具体操作,如加法、乘法、跳转等。

3. ModR/M 字节(ModR/M Byte):ModR/M 字节用于指定操作数的寻址模式和寄存
器信息。

4. SIB 字节(SIB Byte):SIB 字节(Scale-Index-Base Byte)用于复杂的内存寻址模式,包括乘法因子、索引寄存器和基址寄存器。

5. Displacement 字节(Displacement Byte):偏移字节用于指定操作数的相对地址或立
即数值。

6. 立即数(Immediate):立即数是指指令中直接给出的操作数值。

需要注意的是,x86 指令编码格式非常复杂,因为它需要支持多种不同的操作数类型和寻址模式。

这样的设计使得 x86 架构非常灵活和功能强大,但也增加了指令解码和执
行的复杂性。

x86汇编 讲解

x86汇编 讲解

x86汇编讲解摘要:1.x86 汇编简介2.x86 汇编的基本语法3.x86 汇编的寄存器和内存4.x86 汇编的指令集5.x86 汇编的应用场景正文:【x86 汇编简介】x86 汇编是一种用于编写计算机程序的低级编程语言。

它是x86 架构处理器的指令集体系结构(ISA) 的助记符表示形式。

x86 汇编语言可以用于编写操作系统、驱动程序和嵌入式系统等底层应用程序。

由于其底层特性,x86 汇编语言能够直接访问计算机硬件,并实现高性能的计算。

【x86 汇编的基本语法】x86 汇编语言的基本语法包括以下几个部分:1.指令:x86 汇编指令是用于完成特定任务的命令。

每个指令都有一个操作码,它表示指令要执行的操作。

操作码后面通常跟有一些操作数,用于指定操作的对象。

2.寄存器:x86 汇编中的寄存器是一组高速存储单元,用于存储数据和地址。

常用的寄存器包括通用寄存器(EAX、EBX、ECX、EDX)、指针寄存器(ESP、EBP)和索引寄存器(ESI、EDI)等。

3.内存:x86 汇编中的内存是指计算机中的主存储器,用于存储程序和数据。

内存地址通常用基址(Base Address)加偏移量(Displacement)的方式表示。

4.常用指令:x86 汇编中有很多常用指令,包括数据传输指令(如MOV)、算术指令(如ADD、SUB)、逻辑指令(如AND、OR)、跳转指令(如JMP、JZ、JNZ)等。

【x86 汇编的寄存器和内存】x86 汇编中的寄存器和内存扮演着非常重要的角色。

它们可以存储程序中的数据和地址,并在程序运行过程中进行高速读写。

以下是一些常用的寄存器和内存操作指令:1.寄存器指令:MOV 寄存器,数值将数值移动到指定的寄存器中。

2.内存指令:MOV 内存地址,寄存器将寄存器的值移动到指定的内存地址。

3.加载/存储指令:LOAD/STORE 寄存器,内存地址在内存和寄存器之间传输数据。

【x86 汇编的指令集】x86 汇编指令集非常丰富,可以完成各种复杂的操作。

实模式与保护模式

实模式与保护模式

实模式与保护模式1. 实模式,⼜叫实地址模式,CPU完全按照8086的实际寻址⽅法访问从00000h--FFFFFh(1MB⼤⼩)的地址范围的内存,在这种模式下,CPU只能做单任务运⾏;寻址公式为:物理地址=左移4位的段地址+偏移地址,即:物理地址是由16位的段地址和16位的段内偏移地址组成的。

2.保护模式,⼜叫内存保护模式,寻址采⽤32位段和偏移量,最⼤寻址空间4GB,在这种模式下,系统运⾏于多任务,设计这种模式的原因和好处是:保护模式增加了寻址空间,增加了对多任务的⽀持,增加了段页式寻址机制的内存管理(分段机制使得段具有访问权限和特权级,各应⽤程序和操作系统的代码和核⼼是被保护的,这也是多任务⽀持的实现关键和保护这个名字的由来)。

寻址过程为:物理地址=由段地址查询全局描述符表中给出的段基址+偏移地址,即:物理地址由影像寄存器中的基址加上16位或者32位的偏移组成。

==============================================1:实模式是CPU启动的时候的模式这时候就相当于⼀个速度超快的8086不能使⽤多线程不能实现权限分级还不能访问20位以上地址线,也就是说只能访问1M内存()2:保护模式操作系统接管CPU后.会使CPU进⼊保护模式.这时候可以发挥80x86的所有威⼒..包括权限分级.内存分页.等等等等各种功能============================================1.虚拟8086模式是运⾏在保护模式中的实模式,为了在32位保护模式下执⾏纯16位程序。

它不是⼀个真正的CPU模式,还属于保护模式。

2.保护模式同实模式的根本区别是进程内存受保护与否。

可寻址空间的区别只是这⼀原因的果。

实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和⽤户程序没有区别对待,⽽且每⼀个指针都是指向"实在"的物理地址。

x86汇编 语法

x86汇编 语法

x86汇编语法
x86汇编语言是一种低级语言,用于编写在x86架构上运行的程序的机器代码。

它使用助记符表示指令,这些助记符通常与对应的机器代码指令相对应。

以下是一些x86汇编语言的语法要点:
1. 指令格式:x86汇编语言中的指令通常由操作码和操作数组成。

操作码指定要执行的操作,而操作数指定要操作的数据或寄存器。

例如,MOV指令将一个值从一个位置移动到另一个位置,其格式为“MOV destination, source”。

2. 寄存器:x86架构包含多个寄存器,用于存储数据和地址。

在汇编语言中,可以使用寄存器名来引用寄存器中的值。

例如,EAX寄存器可以表示为“EAX”。

3. 立即数:立即数是直接包含在指令中的数字值。

例如,MOV AX, 1000H指令将1000H(十进制为4096)移动到AX寄存器中。

4. 内存操作数:当需要从内存中读取或写入数据时,可以在指令中使用内存操作数。

内存操作数由一个基址和一个变址量组成,它们可以是寄存器或立即数。

例如,MOV AX, [BX+SI]指令将BX和SI寄存器的值相加,并将结果作为基址,从该基址处读取一个字(16位)到AX寄存器中。

5. 标志寄存器:x86架构包含一个标志寄存器,用于存储各种状态标志。

这些标志用于指示算术操作的结果、零标志、符号标志等。

在汇编语言中,可以使
用条件码指令来测试标志寄存器的值。

以上是x86汇编语言的一些基本语法要点。

学习x86汇编语言需要熟悉指令集、寄存器、内存操作数、标志寄存器等概念,并能够编写简单的程序来执行基本操作。

x86 汇编判断指令

x86 汇编判断指令

x86 汇编判断指令摘要:一、x86 汇编简介二、判断指令概述三、比较指令1.通用比较指令2.专用比较指令四、逻辑指令1.AND 指令2.OR 指令3.XOR 指令4.NOT 指令五、移位指令1.循环移位指令2.方向控制移位指令六、测试指令1.测试指令概述2.常见测试指令七、总结正文:x86 汇编是一种基于英特尔x86 架构的计算机编程语言。

在x86 汇编中,判断指令被广泛应用于条件跳转、条件执行等场景。

本文将详细介绍x86 汇编中的判断指令。

判断指令主要分为比较指令、逻辑指令、移位指令和测试指令四类。

首先,比较指令用于比较两个操作数的值。

通用比较指令有CMP(比较)、TEST(测试)等。

专用比较指令有CMPXCHG(比较交换)、MOVSX (移动到零扩展)等。

其次,逻辑指令用于对操作数执行逻辑运算。

常见的逻辑指令有AND (逻辑与)、OR(逻辑或)、XOR(逻辑异或)和NOT(逻辑非)。

再者,移位指令用于将操作数的二进制位进行移位操作。

循环移位指令有ROL(循环左移)、ROR(循环右移)等。

方向控制移位指令有SHL(逻辑左移)、SHR(逻辑右移)等。

最后,测试指令用于测试操作数的特定位是否为1。

常见的测试指令有JC(无符号大于)、JE(无符号等于)、JG(无符号大于等于)、JL(无符号小于)、JN(无符号不等于)等。

总之,x86 汇编中的判断指令在编程过程中起着关键作用,通过灵活运用各种判断指令,可以实现条件跳转、条件执行等多种功能。

汇编语言x86汇编指令集大全

汇编语言x86汇编指令集大全

汇编语言x86汇编指令集大全汇编语言是计算机体系结构学科中的重要内容之一,它可以直接操作计算机硬件,实现对机器指令的精确控制。

而x86汇编则是汇编语言中最常用的一种,它广泛应用于各类个人电脑和服务器等计算设备中。

x86汇编指令集是汇编语言中的核心,掌握其基本指令对于开发高效的汇编程序至关重要。

本文将介绍x86汇编指令集的各个方面,包括数据传输指令、算术运算指令、逻辑运算指令、分支控制指令以及其他常用指令等内容,以帮助读者全面理解和掌握x86汇编语言。

一、数据传输指令数据传输指令是汇编语言中最基本的指令之一,用于实现数据在寄存器、内存和I/O端口之间的传递。

常见的数据传输指令包括MOV、XCHG、PUSH和POP等。

MOV指令用于将数据从一个位置传送到另一个位置,可以将数据从内存中传送到寄存器,也可以将数据从寄存器传送到内存。

例如,MOV AX, BX表示将寄存器BX中的数据传送到寄存器AX中。

XCHG指令用于交换两个操作数的值,例如,XCHG AX, BX表示交换寄存器AX和BX中的数据。

PUSH指令将数据推入堆栈,POP指令从堆栈中弹出数据。

这两个指令常用于函数调用和局部变量的保存与恢复。

二、算术运算指令算术运算指令用于执行各种数值计算操作,包括加法、减法、乘法、除法以及取模等。

常见的算术运算指令包括ADD、SUB、MUL、DIV和IMUL等。

ADD指令用于进行加法运算,可以将两个操作数相加,并将结果保存在目标操作数中。

例如,ADD AX, BX表示将寄存器BX中的值加到寄存器AX中。

SUB指令用于进行减法运算,可以将目标操作数减去源操作数,并将结果保存在目标操作数中。

MUL指令用于进行无符号数的乘法运算,可以将一个操作数与寄存器中的值相乘,并将结果保存在一对寄存器中。

DIV指令用于进行无符号数的除法运算,可以将寄存器中的值除以一个操作数,并将商保存在一个寄存器中,余数保存在另一个寄存器中。

IMUL指令用于进行有符号数的乘法运算,功能与MUL指令类似,但结果为有符号数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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的内容为最后移入位的值。

相关文档
最新文档