32位汇编程序设计.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4) 80386的所有32位通用寄存器都可以作 为基地址寄存器使用,除了ESP寄存器以 外都可以作为变址寄存器使用。
(5) 32位变址寄存器的值可以乘上一个比 例常数(如1,2,4,8),乘上比例常数 的变址方式对于访问数组等数据结构特 别有效。 例如: MOV EAX,[ESI*2] MOV EAX,[EBX+ESI*8] MOV EAX,[EBX+ESI*4+0400H]
80486新增指令
80486CPU不仅包括80386CPU的结构,还包括了 80387协处理器FPU的结构,且在此基础上增加了8KB 的Cache高速缓冲存储器,它的最高内部时钟频率达到 了100MHZ。采用了精简指令系统集计算机技术RISC 和指令流水线方式,使指令的执行速度及其他性能有 了更大的提高,且可以直接执行8087的所有浮点运算 指令。 80486的指令系统在80386指令系统的基础上增加了6 条指令,其中,INVLPG、INVD及WBINVD三条专用于 Cache管理,一般用户不需使用,另外三条XADD、 CMPXCHG和BSWAP指令是可供系统应用程序使用的指 令。
(3) 80386的所有32位通用寄存器都可以作为偏 移地址参加寻址,而在 8086/8088/80186/80286中的AX、DX、CX寄 存器不能用来存放存储器操作数的偏移地址。 例如: MOV AX,[ECX] ;正确 MOV BX,[EAX] ;正确 MOV BX,[AX] ;在16位下错误
Windows下32位汇编程序
若较好地掌握了Windows下的汇编程序开发, 可以让我们深刻地理解高级语言是怎么来的, 而且在学习反病毒技术、软件的加密解密方面 这是必须的。在高级语言的开发中涉及到程序 的调试,也要用到汇编语言。 Windows下汇编语言的开发使用软件Masm32 或Tasm32,本书使用的是Masm32。程序的调 试使用W32dasm、Soft-Ice等软件。
(1) 串输入
指令格式及功能: INSB/INSW/INSD ;ES:[DI/EDI] ←DX指定的输入端 口,DI/EDI←DI/EDI±1/2/4 指令说明:INS指令从由Βιβλιοθήκη BaiduX指定的输入端口中输入一 个字节(INSB)或一个字(INSW)或一个双字INSD) 数据到由ES:[DI/EDI]指定的存储单元中,且能使 DI/EDI自动±1或±2或±4;DX内容保持不变。ES段寄 存器不能被段超越。
32位的寻址方式
Intel 80x86系列的微处理器32位CPU相对于16 位CPU寻址方式的主要区别有: (1) 32位寻址方式的操作数可以是8位、16位或 32位,包括32位的立即数。 例如: MOV EAX,12345678H ;源操作数为32位立即数 MOV EAX,EBX ;两个寄存器均为32位 MOV EAX,[2000H]
Pentium pro新增指令
Pentium Pro CPU的地址总线为36位,可以寻 址的主存空间可达64GB。Pentium Pro CPU内 含一级Cache 为16 KB,二级Cache 为 256/512KB;扩展了超标量技术,具有三个整 数处理单元和一个浮点处理单元,能同时执行 三条指令,并对32位指令进行了优化处理。 Pentium Pro CPU在Pentium指令系统的基础上 新增了3条实用的指令CMOV、RDPMC、UD2。
2. 算术运算指令的扩展 (1) 乘除法指令
IMUL IMUL IMUL IMUL r16,r16/m16/i8/i16 ;r16← r16*r16/m16/i8/i16 r16,r16/m16,i8/i16 ;r16← r16/m16*i8/i16 r32,r32/m32/i8/i32 ;r32← r32*r32/m32/i8/i16 r32,r32/m32,i8/i32 ;r16← r32/m32*i8/i16
80386新增指令
80386CPU中通用寄存器由32位寄存器组成, 因此所有16位指令都有其相应的32位指令形式, 以支持32位数据类型的操作。操作数可为8位、 16位或32位,并且可以使用32位寻址方式。 80386的执行单元中新增了一个“桶型”移位 器,所以可以实现快速移位操作,新增的指令 主要是有关位操作的。另外,80386还增加了 条件设置指令,以及对控制、调试和测试寄存 器的传送指令。
Windows汇编语言特点
DOS下的汇编程序是“指令+中断”,而 Windows下32位汇编程序是“指令+API+消 息”。
API函数:API是“Application Programming Interface”的英文缩写,很象DOS下的中断。中 断是系统提供的功能,在操作系统运行后就被 装载在内存中,而API函数是通过将函数所在 的动态连接库装载到内存后调用函数的。
;因为EAX为32位,从DS:[2000H]处取4字节
(2) 在使用寄存器间接寻址、寄存器相对寻址或 相对的基址变址寻址时,既可以用16位的寄存 器,又可以使用32位的寄存器。 例如: MOV AX,[BX] MOV DX,[EBX] MOV EAX,[EBX+80H] MOV EAX,[EBX+ESI+0400H]
指令说明:新增的这些指令要求目的操作数和源 操作数的长度要相同。对于8位立即数i8要进行符 号扩展,扩展后为16/32位。
(2) 符号扩展指令 80386 新扩展的指令有: CWDE ;将AX符号扩展为EAX CDQ ;将EAX符号扩展为EDX.EAX MOVSX r16,r8/m8 ;r16←将r8/m8符号扩展 MOVZX r16,r8/m8 ;r16←将r8/m8零位扩展 MOVSX r32,r8/m8/r16/m16 ;r32←将r8/m8/r16/m16符号扩展 MOVZX r32,r8/m8/r16/m16 ;r32←将r8/m8/r16/m16零位扩展
Pentium新增指令
Pentium CPU仍为32位结构,地址总线为32位, 但外部数据线为64位,内部时钟频率为 60MHZ~200MHZ。Pentium CPU对浮点处理 单元进行了重大改进,增加了专用的加法、乘 法和除法单元;采用具有两条流水线的超标量 技术;对常用的简单指令用硬件实现等,进一 步提高了Pentium CPU的整体性能。 Pentium CPU指令系统中新增加了一条8字节比 较交换指令CMPXCHG8B,一条处理器识别指 令CPUID,4条系统专用指令RDTSC、RDMSR、 WRMSR、RSM。
(3) 地址传送 地址传送指令增加了三条: LFS r16/r32, mem ;FS:r16/r32←存 储单元的32/48位远指针 LGS r16/r32, mem ;GS:r16/r32← 存储单元的32/48位远指针 LSS r16/r32, mem ;SS:r16/r32←存 储单元的32/48位远指针
.MODEL SMALL .386 ;采用32位指令,16位段模式 .STACK .DATA QVAR DQ 1234567887654321H .CODE .STARTUP MOV EAX,DWORD PTR QVAR MOV EDX DWORD PTR QVAR [4] MOV ECX,4 NEXT: SHL EAX,1 RCL EDX,1 LOOP NEXT MOV DWORD PTR QVAR,EAX MOV DWORD PTR QVAR[4],EDX .EXIT 0 END
第5章 32位汇编程序设计
80186以后CPU在8086基础上增加的常用指令。 在DOS下和Windows下如何使用32位指令设计程序。 区别于DOS下的Debug,如何用W32Dasm调试 Windows程序。
5.1 32位指令系统
Intel公司于1985年正式公布了32位微处理器80386。 80386采用32位指令系统的结构,被Intel公司称为英 特尔结构,简称IA(1ntel Architecture)结构,并明确宣 布作为后续80x86微处理器的标准。在此基础上,Intel 公司又相继推出了80486、Pentium、MMX Pentium 、 Pentium Pro、Pentium II、Pentium III、Pentium Ⅳ 等微处理器,它们都继承了80386的32位指令系统, 同时又新增了若干条专用指令;另外还在32位整数指 令系统的基础上加入了浮点指令、整数多媒体MMX指 令和浮点多媒体SSE指令,极大地丰富了Intel 80x86微 处理器的指令系统,有效地增强了Intel 80x86微处理 器的功能。
c. 32位通用寄存器进栈指令PUSHAD和出栈指令 POPAD. 这两条指令是32位CPU新扩展的指令: PUSHAD ;顺序将 EAX/ECX/EDX/EBX/ESPEBP/ESI/EDI 的内容压入堆栈,SP←SP-32 POPAD ;功能和PUSHAD指令功能相反,SP←SP+32
(2) 标志传送 标志传送指令增加了两条: PUSHFD ;将EFLAGS的内容压入堆栈, 堆栈中D16D17两位被清0 POPFD ;将堆栈内容弹出到EFLAGS, 堆栈中D20D19两位被清0,D16保持不 变
在Windows下设计应用程序不使用API是 不可能的,有些高级语言看似没有使用 API,只不过它们提供的模块对API进了 封装。 API是Windows的基础,API包含在众多 扩展名为dll的动态连接库中,三个关键 的动态连接库文件是:
(2) 串输出 指令格式及功能: OUTSB/OUTSW/OUTSD ;DX指定的输出端口←DS: [SI/ESI],SI/ESI←SI/ESI±1/2/4
指令说明:该指令实现从由DS:[SI/ESI]指定的内 存单元中的一个字节(OUTSB)或一个字(OUTSW) 或一个双字(OUTSD)数据到由DX指定输出端口中, 且能使SI/ESI自动±1或±2或±4;DX内容保持不变。 DS段寄存器可以被段超越。
32位扩展指令
1.数据传送指令的扩展 (1) 堆栈操作 a. 进栈指令PUSH和出栈指令POP
b.16位通用寄存器进栈指令PUSHA和出栈指令POPA 从80186开始引入了如下指令: PUSHA ;顺序将AX/CX/DX/BX/SP/BP/SI/DI的内容 压入堆栈,SP←SP-16 POPA ;功能和PUSHA指令功能相反,SP←SP+16
DOS下32位汇编程序
32位程序编写规范 32位指令的程序设计方法和我们在前面 讲过的16位指令的程序设计方法基本相 同。但在编写完整的汇编程序时,需注 意以下问题:
指定汇编程序识别新指令 处理16位段和32位段 注意有些指令在16位段和32位段的差 别
DOS 32位程序举例
例1:将一个64位数据算术左移4位 分析:本例采用EDX.EAX保存64位数据,用4次循环实现移位。
3. 位操作指令扩展 移位指令从80186开始支持一个立即数做 移位次数,其指令格式为: SHL/SHR/SAL/SAR/ROL/ROR/RCL/RCR reg/mem,1/cl/i8
4. 串操作指令扩展 从80186开始支持端口的串操作,配合 重复前缀指令就能够实现用一条指令连 续进行输入或输出操作,大大提高了CPU 的I/O操作能力。
由此可见,16位存储器操作数的寻址方式的组成公式为: 16位有效地址=基址寄存器(BX/BP)+变址寄存器(SI/DI) +8/16位的偏移量 其中基址寄存器只能是BX或BP,变址寄存器只能是SI或DI。
而32位存储器操作数的寻址方式的组成公式为: 32位有效地址=基址寄存器+(变址寄存器*比例)+8/32位的 偏移量 其中基址寄存器为任何8个32位通用寄存器之一,变址寄存 器为除ESP之外的任何32位通用寄存器之一,比例可以是1、 2、4或8,代表操作数的长度是1、2、4或8字节,位移量 可以是8或32位的值。