第 六 章 32 位 指 令 及 其 编 程
1封面第 六 章 32 位 指 令 及 其 编 程
2第六章 32位指令及其编程第六章 32位指令及其编程概 述
6.1 32位指令运行环境
6.2 32位扩展指令
6.3 32位指令的程序设计
6.4 32位新增指令
6.5 用汇编语言编写
32位 WINDOWS应用程序第 六 章 32 位 指 令 及 其 编 程
3概述 1
概 述
32位指令系统以 80386 CPU 为基础,其指令集可分为 整数指令集 ( 16位整数指令集,32位整数指令集)和浮点指令集,16位整数指令集全兼容 8086 CPU。
1996年,Intel推出 MMX Pentium,首次增加了 MMX
(多媒体扩展)指令集,提高了 CPU对多媒体数据的处理能力。
1999年,Intel推出 Pentium Ⅲ,增加了 SSE指令集
(数据流 SIMD扩展指令,SIMD为 MMX指令集的关键技术,
意为,单指令流多数据流,)。
2000年,Intel推出 Pentium4,又增加 SSE2指令集,
增强了处理器对 3-D图象、视频编码解码、语音识别等数据的处理能力。
第 六 章 32 位 指 令 及 其 编 程
4概述 2
本章主要介绍 80386的 32位整数指令集,及其汇编语言程序设计,对 386以后推出的 CPU新增指令( 6.4.2、
6.4.3,6.4.4)简单介绍。
6.5 节简单介绍如何使用汇编语言编写 WINDOWS应用程序。
本章应重点掌握:
32位编程环境
32位寻址方式
32位指令编程方法回 第 6章第 六 章 32 位 指 令 及 其 编 程
56.1 32位指令运行环境
6.1 32位指令运行环境补充,386的工作方式 及 16位段和 32位段
6.1.1 寄存器组
6.1.2 寻址方式
6.1.3 机器代码格式回 第 6章第 六 章 32 位 指 令 及 其 编 程
6386的工作方式,实方式补充 386的工作方式实地址方式:
实方式( Real Mode)与 8086/80186的工作方式以及 80286的实地址方式具有相同的基本结构。
不使用 386的优先级分级制,所有程序( DOS和应用程序都工作在 0级(特权级)。
32位 x86 CPU只能寻址 1MB物理存储器空间,分段最大 64KB,采用 16位逻辑段。
32位 x86 CPU可以使用 32位寄存器和 32位操作数,
也可以采用 32位寻址方式。
相当于可以进行 32位处理的快速 8086。
第 六 章 32 位 指 令 及 其 编 程
7保护方式保护方式,支持多任务的工作方式
保护方式 ( Protected Mode) 提供段式存储管理功能和页式存储管理功能,可以更好地支持虚拟存储器,最大可达 64TB。
保护方式下,32位 x86CPU可以使用全部 32条地址线,
使微处理器可寻址的物理存储器达到 4GB,采用 32位逻辑段,其段地址和偏移量都是 32位。
在保护方式下,32位 x86 CPU可以发挥其全部功能,
可以充分利用其强大的存储管理和保护能力。例如 CPU
设置( 0~ 3) 4个优先级,不同的程序运行在不同的优先级上;指令也分成 3个级别:特权指令、敏感指令和普通指令等等安全保护措施。
第 六 章 32 位 指 令 及 其 编 程
8虚拟 86方式虚拟 8086方式,
是一种在保护方式下运行的类似实方式的工作环境,
实际上是保护方式和实方式的混合。
实方式特征,仍然采用 16位逻辑段:段寄存器的使用与实方式一样,左移 4位加 16位偏移量得到 20位地址。
保护方式特征,可同时运行多个 8086程序,每个
8086程序可以利用分页机制将各自的逻辑 1MB空间映射到不同的物理地址,从而实现共存于主存并行运行;
虚拟 8086方式的程序运行在最低优先级 —3级,操作系统运行在 0级,即特权级。
虚拟 86方式和保护方式之间可以直接切换。
第 六 章 32 位 指 令 及 其 编 程
916位段和 32位段
16位段和 32位段
16位段:段地址和偏移地址都是 16位段的最大长度为 64KB
32位段:段地址和偏移地址都是 32位段的最大长度为 4GB
实方式下只能使用 16位段;保护方式下默认
32位段,但也可使用 16位段。
回 6.1
第 六 章 32 位 指 令 及 其 编 程
106.1.1 寄存器组
6.1.1 寄存器组
1.通用寄存器和指令指针寄存器
8个 32位通用寄存器:
EAX AX AH AL EBX BX BH BL
ECX CX CH CL EDX DX DH DL
ESI SI EDI DI
EBP BP ESP SP
32位指令指针寄存器,EIP
在 16位段,EIP高 16位为 0,其它 32位寄存器如作为地址指针寄存器,高 16位也应为 0。
第 六 章 32 位 指 令 及 其 编 程
112.段寄存器
2.段寄存器
6个 16位段寄存器:
CS,SS,DS,ES,作用与 8086的相同
FS,GS,新增的数据段段寄存器
16位段:段寄存器 × 16+偏移地址=物理地址
32位段:段寄存器保存,段描述符选择字,(段选择器),由段描述符选择字从段描述符表获得一个段描述符,段描述符给出 32位的段基地址,32位偏移地址由各种寻址方式给出,二者相加,得到 32位寻址地址(不一定是物理地址)。
在 32位段中,所有段寄存器(段选择器)对编写应用程序的程序员都是不可见的。
第 六 章 32 位 指 令 及 其 编 程
123.标志寄存器
3.标志寄存器 EFLAGS( PSW)
在 8086标志寄存器基础上扩展为 32位寄存器。
8086CPU共有 9个标志,80286增加 2个,为 11个。
80386在 286基础上增加 2个,为 13个。
80486为 14个,奔腾为 17个 。
8086原有的 9个标志定义不变,增加的 8个标志涉及的是任务切换、安全保护等机制,通常不在应用程序中使用。
4.其他寄存器系统地址寄存器、控制寄存器、调试寄存器、测试寄存器用于保护方式的任务切换、分页管理等,通常不在应用程序中使用。 回 6.1
第 六 章 32 位 指 令 及 其 编 程
136.1.2 寻址方式
6.1.2 寻址方式
1.立即寻址:
立即数可以为 32位数
MOV EAX,44332211H
2.寄存器寻址:
除可使用原 8位,16位寄存器外,可使用 32位通用寄存器。
MOV EAX,EBX
第 六 章 32 位 指 令 及 其 编 程
143.存储器操作数寻址 1
3.存储器操作数寻址
16位寻址方式 ( 用于 16位段 ):
16位有效地址 =BX/BP+SI/DI+8/16位位移量
32位寻址方式 ( 用于 16位段和 32位段 ):
32位有效地址 =基址寄存器 +(变址寄存器 *比例 )+位移量
基址寄存器:任何 8个 32位通用寄存器
变址寄存器:除 ESP之外的 7个通用寄存器
比例:可以是 1/2/4/8
位移量,8位,16位或 32位第 六 章 32 位 指 令 及 其 编 程
15存储器操作数寻址 2
1)直接寻址
mov eax,[1234h]
2)寄存器间接寻址
mov eax,[ebx];指针寄存器可使用任何 32位通用寄存器
3)寄存器相对寻址
mov eax,[ebx+80h]
4)基址变址寻址
mov eax,[ebx+esi];变址寄存器可使用除 ESP
之外的 7个 32位通用寄存器
5)相对基址变址寻址
mov eax,[ebx+esi+80h]
第 六 章 32 位 指 令 及 其 编 程
16存储器操作数寻址 3
6)带比例因子的变址寻址( 没有基址寄存器 )
mov eax,[esi*2]
7)带比例的基址变址寻址
mov eax,[ebx+esi*4]
8)带比例的基址变址相对寻址
mov eax,[ebx+esi*8+80h]
注释,1.BP,EBP,ESP作为基址寄存器使用时,默认的段寄存器为 SS; EBP作为变址寄存器使用时,不影响默认的段寄存器的选择。
2.所有其他寻址方式默认的段寄存器都是 DS,包括没有基址寄存器的情况。
3.允许段跨越。
第 六 章 32 位 指 令 及 其 编 程
17存储器操作数寻址 4
4.32位 CPU采用 16位段时,既可采用原 16位寻址方式,也可采用 32位寻址方式。对 16位段 32位寻址方式,
MOV AX,[ECX]为一条合法指令,但计算出的物理地址仍然为 20位地址 。而 MOV AX,[CX]是一条非法指令,因为在 16位寻址方式中,CX是不能作地址指针寄存器的。
所以,,16位段可采用 32位寻址方式,,指得是指令的合法性,不可错误理解为扩大了寻址空间。
回 6.1
第 六 章 32 位 指 令 及 其 编 程
186.1.3 机器代码格式
6.1.3 机器代码格式与 16位指令相比,增加了两个字节的前缀和一个带比例因子的变址寻址方式字节。
进行汇编语言程序设计时,只要正确设置好伪指令
(选择 16位段或 32位段),汇编程序会自动加入需要的前缀;如使用了带比例因子的变址寻址方式,汇编程序会自动在机器代码中加入相应字节。
回 6.1
第 六 章 32 位 指 令 及 其 编 程
196.2 32位扩展指令
6.2 32位扩展指令概 述
6.2.1 数据传送类指令
6.2.2 算术运算类指令
6.2.3 位操作类指令
6.2.4 串操作类指令
6.2.5 控制转移类指令
6.2.6 处理器控制类指令
6.2.7 保护方式类指令(略 )
回 第 6章第 六 章 32 位 指 令 及 其 编 程
20概 述 /1
概 述
16位指令系统从两个方面向 32位扩展
⑴ 支持 32位操作数
⑵ 支持 32位寻址方式
mov ax,bx ;16位操作数
mov eax,ebx ;32位操作数
mov ax,[ebx] ;16位操作数,32位寻址方式
mov eax,[ebx] ;32位操作数,32位寻址方式第 六 章 32 位 指 令 及 其 编 程
21概 述 /2
本节介绍的指令基于 386以前的 CPU。
本节也介绍了一些 80386的新增指令。但本节介绍的新增指令属于 原有指令 扩大了工作范围,或在 原有功能 的基础之上有所增强。具有 新功能的指令 放在 6.4节
( 32位新增指令)介绍。
介绍指令时使用的符号:
新增,r32—8个 32位通用寄存器; m32—32位存储单元; i32—32位立即数; seg—加 FS和 GS。
回 6.2
第 六 章 32 位 指 令 及 其 编 程
226.2.1 数据传送类指令 1.通用传送
6.2.1 数据传送类指令
1.通用传送
⑴ MOV类,格式、功能与 16位 MOV指令相同,只是增加了对 32位操作数和 32位寻址方式的支持。
MOV DWORD PTR[DI],EAX; 16位寻址,32位操作数
MOV AL,[EBP+EBX]; 32位寻址,8(16)位操作数
MOV AH,FS,[5678H]
⑵ 交换指令 XCHG,同上
XCHG ESI,EDI/ XCHG [EBX],CX
⑶ 换码指令 XLAT,16位段,同 8086;
32位段,用 EBX存放基地址第 六 章 32 位 指 令 及 其 编 程
232.堆栈操作 /1
2.堆栈操作
PUSH r16/r32/m16/m32/seg
POP r16/r32/m16/m32/seg ;CS除外;对 32位操作数 (E)SP± 4
新增指令 (扩大范围或增强原有功能)
⑴ PUSH i8/i16/i32 ;把 16位或 32位立即数 i16/i32
压入堆栈。若是 8位立即数 i8,经符号扩展成 16位后再压入堆栈。
PUSH 1234H / PUSH 12345678H
⑵ PUSH FS/PUSH GS/POP FS/POP GS
第 六 章 32 位 指 令 及 其 编 程
24/2
⑶ PUSHA; 顺序将 AX/CX/DX/BX/SP/BP/SI/DI入栈
POPA;按反顺序出栈,但舍弃应进 SP的值,; 即应进入 SP的值被舍弃,并不进入 SP,; SP通过增加 16来恢复(调整)
⑷ PUSHAD; 顺序将 8个 32位寄存器入栈
POPAD;按反顺序出栈,但舍弃应进 ESP的值,; 即应进入 ESP的值被舍弃,并不进入 ESP,; ESP通过增加 32来恢复(调整)
第 六 章 32 位 指 令 及 其 编 程
253.标志传送
3.标志传送
LAHF/SAHF/PUSHF/POPF;同 8086指令
CLC/STC/CMC,CLD/STD,CLI/STI;标志位操作指令同 8086
新增指令:
PUSHFD;将 EFLAGS入栈
POPFD;弹出一个 32位数到 EFLAGS
第 六 章 32 位 指 令 及 其 编 程
264.地址传送
4.地址传送
LEA r16,mem;16位段同 8086指令; 32位段中,计算存储单元的 32位有效地址,取低 16位送 r16
LEA r32,mem;16位段中,计算存储单元的 16位有效地址,
经 0位扩展后送 r32; 32位段中,计算存储单元的 32位有效地址,送 r32
例如:
mov ebx,12345678h
lea dx,[ebx+4321h];取 12349999h的低 16位,不管是 16
位段还是 32位段,DX的值是相同的
lea esi,[ebx+1111h];32位段中 esi=12346789h;16位段中,esi=00006789h
第 六 章 32 位 指 令 及 其 编 程
27地址传送
lds r16,mem;同 8086指令
lds r32,mem;将存储单元内的段地址送 ds,偏移地址送 r32,
段地址为 2个字节,偏移地址为 4个字节,共 6字节 48位。
les r16/r32,mem;段寄存器用 es,其余同上。
新增指令:
LFS r16/r32,mem
LGS r16/r32,mem
LSS r16/r32,mem
mem
段址偏移地址第 六 章 32 位 指 令 及 其 编 程
285.I/O 传送
5.I/O 传送
IN AL/AX/EAX,i8
IN AL/AX/EAX,dx
OUT i8,AL/AX/EAX
OUT dx,AL/AX/EAX
可实现双字的输入输出操作。
回 6.2
第 六 章 32 位 指 令 及 其 编 程
296.2.2 算术运算类指令
6.2.2 算术运算类指令
1.加法减法运算
ADD/ADC/INC
SUB/SBB/DEC/NEG/CMP
操作数可使用 32位,mem可使用 32位寻址方式,其他均与 8086指令相同。
第 六 章 32 位 指 令 及 其 编 程
302.乘除法运算
2.乘除法运算
MUL r8/m8 ;MUL r16/m16;同 8086指令
MUL r32/m32; EDX.EAX←EAX*r32/m32
IMUL r8/m8 ;IMUL r16/m16;同 8086指令
IMUL r32/m32; EDX.EAX←EAX*r32/m32
(I)DIV r8/m8;(I)DIV r16/m16;同 8086
(I)DIV r32/m32;EAX←EDX.EAX ÷ r32/m32的商; EDX ← 余数第 六 章 32 位 指 令 及 其 编 程
312.乘除法运算新增指令乘法运算新增指令
IMUL r16,r16/m16/i8/i16(双操作数)
①可以指定 16位寄存器作为目的操作数
②目的操作数兼作被乘数
③目的操作数和源操作数长度相同
④如溢出,高位被丢弃,CF=OF=1
IMUL r32,r32/m32/i8/i32;同上
IMUL r16,r16/m16,i8/i16;(三操作数)
①可以另外指定 16位寄存器 作目的操作数
② 被乘数 只能是 r16/m16,乘数 是 i8/i16
③ 其余同上
IMUL r32,r32/m32,i8/i32; 32位数相乘,其余同上第 六 章 32 位 指 令 及 其 编 程
32新增有符号数乘法指令举例新增有符号数乘法指令举例:
IMUL EAX,10 IMUL EAX,EAX,10
IMUL EBX,EAX,10
IMUL EAX,dword ptr[EBX+ESI]
IMUL EAX,EAX,[EBX+ESI];非法乘数
imul ax,bx,-2
imul eax,dword ptr[esi+8],5
注释,两操作数乘法指令 的目的操作数和被乘数相同,三操作数乘法指令 的目的操作数和被乘数可以相同,也可以不同,故两操作数的乘法指令可认为是三操作数乘法指令的特例。(但两操作数乘法指令的乘数可以是 reg/mem/立即数,三操作数乘法指令的乘数只能是立即数。)
第 六 章 32 位 指 令 及 其 编 程
333.符号扩展
3.符号扩展
CBW /CWD ;同 8086
新增指令
CWDE ;将 AX符号扩展为 EAX
CDQ ;将 EAX符号扩展为 EDX.EAX
MOVSX r16,r8/m8;指定目的操作数的符号扩展;把 r8/m8符号扩展并传送至 r16
MOVSX r32,r8/m8/r16/m16;同上(双字扩展)
MOVZX r16,r8/m8;指定目的操作数的零位扩展
MOVZX r32,r8/m8/r16/m16;同上(双字扩展)
第 六 章 32 位 指 令 及 其 编 程
34符号扩展举例符号扩展与 0扩展举例
mov bl,92h
movsx ax,bl ;ax=ff92h
movsx esi,bl ;esi=ffffff92h
movzx edi,ax ;edi=0000ff92h
第 六 章 32 位 指 令 及 其 编 程
354.十进制调整
4.十进制调整
DAA/DAS
AAA/AAS/AAM/AAD
同 8086指令,没有增加对 32位数的处理。
回 6.2
第 六 章 32 位 指 令 及 其 编 程
366.2.3位操作类指令
6.2.3位操作类指令
1.逻辑运算
AND/OR/XOR/NOT/TEST;操作数扩展到 32位,其余同 8086指令
2.移位及循环移位
SAL reg/mem,1/cl/i8
① 移位对象扩展到 32位通用寄存器和 32位存储器数;
②移位次数可用 8位立即数指定,但低 5位有效,所以实际移位次数为 0—31。
SAR/SHL/SHR/ROL/ROR/RCL/RCR;同上第 六 章 32 位 指 令 及 其 编 程
37位操作类指令举例位操作类指令举例
shl al,4
sar eax,12
rcr word ptr[si],3
例 6.1:将 AX中的每一位依次重复一次,所得 32位结果保存到 EAX中。
mov ecx,16
mov bx,ax
next:shr ax,1 ;原位照搬
rcr edx,1
shr bx,1 ;重复 1次
rcr edx,1
loop next
mov eax,edx
0101010101010101
00110011001100110011001100110011
回 6.2
第 六 章 32 位 指 令 及 其 编 程
386.2.4 串操作 1.基本串操作
6.2.4 串操作类指令
MOVSB/LODSB/STOSB/CMPSB/SCASB
MOVSW/LODSW/STOSW/CMPSW/SCASW;同 8086
MOVSD/LODSD/STOSD/CMPSD/SCASD;执行双字操作; 16位段中,地址指针用
SI,DI,;如使用重复前缀,CX记数;
32位段中地址指针用 ESI,EDI,如使用重复前缀,ECX记数。
第 六 章 32 位 指 令 及 其 编 程
39串操作举例串操作举例例 6.2:在 16位段 中,使用双字传送指令把数据块从 DS,SI区传送到 ES,DI指定的区域,CX中为数据块的字节长度。
ror ecx,2 ;cx÷ 4,商为双字个数,余数为剩下的;字数或字节数
rep movsd ;双字传送,16位段,CX记数
rol ecx,1 ;取原始 CX中的 D1到 CX,为剩下的字数
rep movsw
rol ecx,1 ;取原始 CX中的 D0,为剩下的字节数
rep movsb
“ror cx,2”不能理解为 cx ÷ 4
XX 0000 0000 0000 0000ECX
CXD0D1
第 六 章 32 位 指 令 及 其 编 程
402.输入输出串操作
2.输入输出串操作(新增指令)
( 1)串输入
INS ; 存储单元 ES,[( E) DI]←I/O 端口 [DX]
( E) DI ← ( E) DI± 1/2/4
注释,1)常用指令格式为 INSB/INSW/INSD
2) 16位段偏移指针用 DI,记数用 CX; 32位段用 EDI,ECX
( 2)串输出
OUTS ; I/O端口 [DX] ← 存储单元 DS,[( E) SI]
( E) SI ← ( E) SI± 1/2/4
注释,1)常用指令格式为 OUTSB/OUTSW/OUTSD
2) 16位段偏移指针用 SI,记数用 CX; 32位段用 ESI,ECX
回 6.2
第 六 章 32 位 指 令 及 其 编 程
416.2.5控制转移类指令 1.2.
6.2.5 控制转移类指令
1.无条件转移指令
16位段,功能与 8086相同。虽然允许 32位操作数,
但无实际意义。
如,JMP EAX;指令合法,但同 JMP AX(段内间接)
32位段,段内直接(间接)转移,偏移量可为 32
位,段间转移为 48位指针。
2.条件转移指令
386以前的 CPU,偏移量为 字节 数据(同 8086)
386以后的 CPU(含 386),偏移量为 字 数据,即转移范围为 -32768--+32767字节(按,宏汇编大全,)。
第 六 章 32 位 指 令 及 其 编 程
423.循环
3.循环
loop/loope/loopne
16位段,同 8086
32位段,1)计数器用 ECX。
2) JCXZ改为 JECXZ。
3)偏移量仍为字节数据( -128--+127)
第 六 章 32 位 指 令 及 其 编 程
43例 6.3/1
例 6.3:采用冒泡法排序,将 ESI指定的缓冲区中的 ECX个 32位有符号数按从大到小排好。
1) esi作基地址,不变; edx作变址,edx*4指向各 32位数。
2)内循环控制:比较 edx和 ecx,edx初值为 0,
ecx初值为 (数据个数 -1),第一轮内循环作到
edx=ecx,然后,ecx-1…
3)外循环控制,ecx减到 0
第 六 章 32 位 指 令 及 其 编 程
44例 6.3/2
dec ecx
outlp:mov edx,0
inlp:cmp edx,ecx ;内循环控制
jae short botm
mov eax,[esi+edx*4+4] ;取后一个数据
cmp [esi+edx*4],eax ;比较前后两个数据的大小
jge short nswap ;前一个大,作 nswap
xchg [esi+edx*4],eax;后一个大,交换位置
mov [esi+edx*4+4],eax
nswap:inc edx ;指向下一个数据,兼内循环记数
jmp inlp
botm:loop outlp ;外循环控制第 六 章 32 位 指 令 及 其 编 程
454.过程调用和返回
4.过程调用和返回
16位段,同 8086
32位段,1)段内直接调用偏移量扩展为 32位。
2)段间直接调用,指针为 48位形式。
3)段间调用保护断点时 CS由 16位扩展成双字,断点的偏移也为双字,故入栈 8个字节。
4) RET指令作相应调整。
5.中断调用和返回
INT i8/INTO /IRET
实方式下:同 8086。
保护方式:操作系统提供的功能调用不再以软中断的方式提供,故应用程序通常不使用中断指令。
第 六 章 32 位 指 令 及 其 编 程
466.高级语言支持
6.高级语言支持 (80186引入)
1) ENTER/LEAVE:建立和释放堆栈祯。当主程序和子程序之间使用堆栈 传递参数时,可以使用这两条指令。
ENTER指令相当于,PUSH BP
MOV BP,SP
LEAVE指令相当于,MOV SP,BP
POP BP
由于奔腾以后的 CPU采用先进技术加快了简单指令的执行速度,使用这两条指令并不会提高程序的性能,
故一般已经不用。
第 六 章 32 位 指 令 及 其 编 程
47边界检测
2)边界检测
BOUND r16,m16&16
BOUND r32,m32&32
当对数组进行操作时,往往由于下标超界造成错误,
上面指令可以检测下标是否超界。
array db 100 dup(?);数组共 100个元素
stv dw 0 ;下边界为 0
dw 99 ;上边界为 99
……
bound si,dword ptr stv; si中为下标
mov al,array[si]……
0≤si≤99,则顺序执行,否则产生 5号中断使用两个字或两个双字回 6.2
第 六 章 32 位 指 令 及 其 编 程
486.2.6 6.2.7
6.2.6 处理器控制类指令同 8086。
6.2.7 保护方式类指令通常只有系统核心程序能够使用这些指令,
应用程序不用,也不能使用。
回 第 6章回 6.2
第 六 章 32 位 指 令 及 其 编 程
496.3 32位指令的程序设计
6.3 32位指令的程序设计与 16位指令程序设计基本相同,但需注意以下几点,1.指定汇编程序识别新指令
(或指定使用的微处理器)
缺省情况下,MASM只接受 8086指令集,如使用了以后 CPU的新增指令,必须使用指定微处理器伪指令,
如,386,.MMX 等(见表 6.2。另外要注意汇编程序的版本,如,586,.586P MASM6.11才支持)。
2.16位段和 32位段
1)编写 DOS环境(实方式和虚拟 86方式)下的可执行程序只能使用 16位段。保护方式才可使用 32位段。
第 六 章 32 位 指 令 及 其 编 程
5016位段和 32位段
2)在 DOS环境下,可以编辑和汇编 32位段程序,可以开发只能在 32位段运行的程序(不包括调试)。
3) 简化段定义中,采用 16位段还是 32位段,由指定处理器伪指令的位置决定:
处于,MODEL语句之后,为 16位段
处于,MODEL语句之前,为 32位段
4) 完整段定义中,采用 16位段还是 32位段,由段字属性 USE16和 USE32决定。但 386以下的处理器选择伪指令默认的段字属性为 16位段,386及以上的处理器选择伪指令默认的段字属性为 32位段。
第 六 章 32 位 指 令 及 其 编 程
513.指令在 16位段和 32位段的差别
3.注意有些指令在 16位段和 32位段的差别
①串操作指令使用的偏移地址和重复计数
②循环控制指令使用的循环计数
③ XLAT:基地址寄存器
④ LEA,JMP,CALL/RET等指令
⑤在 32位段中,变量经常使用的属性为 DWORD
第 六 章 32 位 指 令 及 其 编 程
52例 6.5(1)
例 6.5:将一个 64位数左移 8位。
.model small
.386 ;采用 32位指令 ;16位段
.stack
.data
qvar dq 1234567887654321h ;8字节数据定义
.code
.startup
mov eax,dword ptr qvar
mov edx,dword ptr qvar[4]
第 六 章 32 位 指 令 及 其 编 程
53例 6.5(2)
mov ecx,8
mov ecx,8
start1,shl eax,1 ; 先移低 32位
rcl edx,1
loop start1
mov dword ptr qvar,eax
mov dword ptr qvar[4],edx
.exit 0
end
第 六 章 32 位 指 令 及 其 编 程
54例 6.6( 1/11)
例 6.6 降序排序 10个 32
位有符号数,并将结果按十进制数形式显示。
分析,过程 1完成排序,过程 2完成二进制数转换成十进制数
( BCD码)的 ASCII码并显示。
主程序结构:
原序显示,逗号分割回车、换行排序排序后显示,逗号分割结束第 六 章 32 位 指 令 及 其 编 程
55例 6.6( 2/11)
.model small
.386;采用 32位指令,16位段
.stack
.data
count equ 10
darray dd 20,4500h,3f40h,-1,7f000080h
dd 81000000h,0fffffff1h
dd -45000011,12345678
dd 87654321
.code
.startup
第 六 章 32 位 指 令 及 其 编 程
56例 6.6( 3/11)
xor esi,esi
mov si,offset darray ;原序显示
mov ecx,count
start1,mov eax,[esi]
call EAXdisp ;显示一个数据
add esi,4
dec ecx
jz start2 ;原序显示结束,转显示回车换行
mov dl,’,’;原序显示未完,用逗号分隔数据
mov ah,2
int 21h
jmp start1 ;继续原序显示第 六 章 32 位 指 令 及 其 编 程
57例 6.6( 4/11)
start2,mov dl,0dh;回车和换行,原序显示结束
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
xor esi,esi
mov si,offset darray;排序。入口参数
mov ecx,count
call sorting
第 六 章 32 位 指 令 及 其 编 程
58例 6.6( 5/11)
xor esi,esi
mov si,offset darray ;降序显示
mov ecx,count
start3,mov eax,[esi];设置显示的入口参数
call EAXdisp ;每次显示一个数据
add esi,4
dec ecx
jz start4 ;显示完,结束,否则显示逗号
mov dl,’,’
mov ah,2
int 21h
jmp start3 ;显示逗号后继续显示
start4,.exit 0
第 六 章 32 位 指 令 及 其 编 程
59例 6.6( 6/11);32位有符号数据的排序子程序(降序);入口参数,DS:ESI=缓冲区首地址,ECX=个数
sorting proc
push eax
push edx
dec ecx ;外循环次数
outlp,mov edx,0 ;内循环次数控制
inlp,cmp edx,ecx;内循环,使最高地址存储单元具有最小数据
jae short botm
mov eax,[esi+edx*4+4]
cmp [esi+edx*4],eax;比较前后两个数据的大小第 六 章 32 位 指 令 及 其 编 程
60例 6.6( 7/11)
jge short nswap
xchg [esi+edx*4],eax
mov [esi+edx*4+4],eax
nswap,inc edx
jmp inlp
botm,loop outlp
pop edx
pop eax
ret
sorting endp
第 六 章 32 位 指 令 及 其 编 程
61例 6.6( 8/11);以十进制形式显示 32位有符号数据的子程序;入口参数,EAX=有符号数据
EAXdisp proc
push ebx
push edx
test eax,eax ;判断是零、正或负
jnz eaxdisp0 ;转判断正负
mov dl,’0’ ;为零,显示,0”
mov ah,2
int 21h
jmp eaxdisp4 ;返回主程序第 六 章 32 位 指 令 及 其 编 程
62例 6.6( 9/11)
eaxdisp0:jns eaxdisp1
neg eax ;为负数,求绝对值
mov ebx,eax ;空出 AX,显示负号
mov dl,’-’ ;则显示一个符号,-”
mov ah,2
int 21h
mov eax,ebx
eaxdisp1,mov ebx,10
push bx ;压入 10作为结束标志
eaxdisp2:cmp eax,0; EAX为除 10后的商
jz eaxdisp3;EAX=0(数据为 0),则退出第 六 章 32 位 指 令 及 其 编 程
63例 6.6( 10/11)
sub edx,edx ;edx=0
div ebx ;EDX.EAX÷ EBX( 10)
add dl,30h ;余数转换为 ASCII码
push dx;将除 10得到的各位数依次压入堆栈
jmp eaxdisp2
eaxdisp3:pop dx ;将各位数依次出栈
cmp dl,10
je eaxdisp4;是结束标志( 10),则退出第 六 章 32 位 指 令 及 其 编 程
64例 6.6( 11/11)
mov ah,2 ;显示
int 21h
jmp eaxdisp3 ;下一位数的 ASCII码出栈
eaxdisp4:pop edx
pop ebx
ret
EAXdisp endp
end
回 第 6章第 六 章 32 位 指 令 及 其 编 程
656.4 32位新增指令
6.4 32位新增指令
6.2节介绍的 32位指令以 80286为基础,虽然涉及了一些 80386增加的指令,但那些指令都是 16位指令的扩展,如 PUSHFD,POPFD,LFS,LGS,LSS,CWDE,CDQ、
MOVSX,MOVZX,INS,OUTS等,并没有增加新功能。本节介绍具有新功能的指令。
6.4.1 80386 新增指令
6.4.2 80486 新增指令
6.4.3 Pentium 新增指令
6.4.4 Pentium Pro 新增指令回 第 6章第 六 章 32 位 指 令 及 其 编 程
666.4.1 80386 新增指令 1.双精度移位指令
6.4.1 80386 新增指令
1.双精度移位指令
( 1)双精度左移 SHLD
SHLD r16/m16,r16,i8/CL; 将 r16的 i8/CL位左移进入; r16/m16,r16不变
SHLD AX,DX,4 ; AX左移 4位,DX高 4位移如 AX; DX保持不变
MOV CL,4
SHLD WORD PTR[BX],AX,CL
第 六 章 32 位 指 令 及 其 编 程
671.双精度移位指令
SHLD r32/m32,r32,i8/CL; 将 r32的 i8/CL位左移进入; r32/m32,r32不变
SHLD EDX,EAX,8
MOV CL,8
SHLD DWORD PTR[BX],EAX,CL
注释:
1) OP1和 OP2类型必须相同。
2) OP1可以是寄存器或存储器,OP2只能是寄存器。
3)相当于( OP1.OP2)左移,但 OP2不变。
4) i8的有效范围为 0—31。
第 六 章 32 位 指 令 及 其 编 程
68双精度右移 SHRD
( 2)双精度右移 SHRD
SHRD r16/m16,r16,i8/cl
SHRD r32/m32,r32,i8/cl
mov ax,2a80h
mov bx,9a78h
shld ax,bx,8 ;ax=809ah,bx不变,cf=0
shrd bx,ax,1 ;ax=809ah,bx=4d3ch,cf=0,of=1
注释:
1) OP1和 OP2类型必须相。
2) OP1可以是寄存器或存储器,OP2只能是寄存器。
3)相当于( OP2.OP1)右移,但 OP2不变。
4) i8的有效范围为 0—31。
第 六 章 32 位 指 令 及 其 编 程
692.位扫描指令
2.位扫描指令
( 1)向前扫描
BSF r16,r16/m16
BSF r32,r32/m32
对源操作数由低位到高位寻找第一个 ‘ 1’的位置
如找到,则将位数送入目的操作数,置 ZF=0
如源操作数全 0,则目的操作数不定,置 ZF=1
多用于处理图象数据
( 2)向后扫描
BSR r16,r16/m16
BSR r32,r32/m32
由高位向低位扫描,其余同上。
第 六 章 32 位 指 令 及 其 编 程
703.位测试指令
3.位测试指令
BT dest,src ;把目的操作数 dest中由源操作数 src指定的 位 送 CF标志
BTC dest,src ;把 dest中由 src指定的位送 CF标志,
然后对 那一位求反
BTR dest,src ;把 dest中由 src指定的位送 CF标志,
然后对 那一位复位(置 0)
BTS dest,src ;把 dest中由 src指定的位送 CF标志,
然后对 那一位置位(置 1)
第 六 章 32 位 指 令 及 其 编 程
71位测试指令举例位测试指令举例
mov eax,12345678h ;EAX=12345678h
bt eax,5 ;EAX=12345678h,CF←1=EAX 的 D5位
btc eax,10 ;EAX=12345278h,CF←1=EAX 的 D10位
btr eax,20 ;EAX=12245278h,CF←1=EAX 的 D20位
bts eax,34 ;34>31,故 34/32,余数为 2,测试 D2; EAX=1224527Ch,CF←0=EAX 的 D2位第 六 章 32 位 指 令 及 其 编 程
724.条件设置指令
4.条件设置指令
SETcc r8/m8;若条件 cc成立,则 r8/m8为 1;否则,为 0
可用来消除转移指令。 EAX≥32H,EBX=0C2H;
EAX< 32H,EBX=0C1H
cmp eax,32h
jge L00
mov ebx,0C1h
jmp L01
L00,mov ebx,0C2h
L01,..,
第 六 章 32 位 指 令 及 其 编 程
73条件设置指令
EAX≥32H,EBX=0C2H;
EAX< 32H,EBX=0C1H
xor ebx,ebx
cmp eax,32h ; 大于等于 小于
setge bl ; BL=1 BL=0
dec ebx ; EBX=0 EBX=0FFFFFFFF
and ebx,(0C1h-0C2h); EBX=0 EBX=0C1H-C2H
add ebx,0C2h ; EBX=0C2H EBX=0C1H
第 六 章 32 位 指 令 及 其 编 程
745.控制、调试和测试寄存器传送指令
5.控制、调试和测试寄存器传送指令这三种寄存器通常只有系统程序使用。
回 6.4
第 六 章 32 位 指 令 及 其 编 程
756.4.2 80486新增指令
6.4.2 80486新增指令
80486的指令系统是在 80386指令集的基础上增加了
6条新指令,新增的指令主要用于对多处理器系统和片上高速缓冲存储器的支持。
为了让汇编程序汇编这些指令,源程序中必须具有
.486或,486P伪指令。
MASM 6.0开始支持 80486指令系统。
第 六 章 32 位 指 令 及 其 编 程
761.字节交换指令
1.字节交换指令
BSWAP r32 ; 将 32位通用寄存器值的第 1和 4;字节、第 2和 3字节互换
mov eax,00112233h ;EAX=00112233h
bswap eax ;EAX=33221100h
第 六 章 32 位 指 令 及 其 编 程
772.交换加指令
2.交换加指令
XADD r8/m8,r8
XADD r16/m16,r16
XADD r32/m32,r32;reg/mem←→ reg,reg/mem← reg+reg/mem
mov bl,12h
mov dl,02h
xadd bl,dl;BL=14h,DL=12h,两个操作数都改变
(add bl,dl;bl=14h,dl=02h,只目的数改变 )
第 六 章 32 位 指 令 及 其 编 程
783.比较交换指令
3.比较交换指令
CMPXCHG reg/mem,reg; reg和 mem的长度必须相同,AL/AX/EAX- reg/mem;相等,ZF=1,reg/mem←reg;不等,ZF=0,AL/AX/EAX←reg/mem
mov al,12h
mov bl,12h
mov dl,02h
cmpxchg bl,dl ;AL=12h,BL←DL=02h,ZF=1
cmpxchg bl,dl ;AL←BL=02h,DL=02h,ZF=0
回 6.4
第 六 章 32 位 指 令 及 其 编 程
796.4.3Pentium新增指令
6.4.3 Pentium新增指令
源程序中必须具有,586或,586P伪指令
MASM 6.11开始支持 Pentium指令系统
Pentium新增了几条非常实用的特权指令介绍应用程序使用的指令:
1.8字节比较交换指令
CMPXCHG8B m64 ;比较,EDX.EAX- m64;相等,则 ZF=1,m64←ECX.EBX;不等,则 ZF=0,EDX.EAX←m64
第 六 章 32 位 指 令 及 其 编 程
802.处理器识别指令
2.处理器识别指令
CPUID
从奔腾 CPU开始,处理器设有识别标志,并支持
CPUID指令,从而可判断出 CPU的类型。识别奔腾以前的各型 CPU,也可通过判断标志寄存器的特定标志实现。
参考教材 P203例 6.10。
使用较低版本的汇编程序开发最新生产的微处理器程序以指令 CPUID为例,程序中,在使用该指令的位置书写,DB 0FH,0A2H。
前提:指令必须是 CPU支持的。
回 6.4
第 六 章 32 位 指 令 及 其 编 程
81Pentium Pro新增指令
6.4.4 Pentium Pro新增指令
程序中必须具有,686或,686P伪指令
MASM 6.12开始支持 Pentium Pro指令
Pentium Pro指令系统新增 3条指令,两条通常用于系统程序,一条可用于应用程序。
条件传送指令
CMOVcc r16,r16/m16
CMOVcc r32,r32/m32;若条件成立,则目的操作数 ← 源操作数;条件不成立,则不传送。
使用该指令可减少分支结构。
第 六 章 32 位 指 令 及 其 编 程
82条件传送指令使用条件传送指令使用
test ecx,ecx
jne next
mov eax,ebx
Next:
使用条件传送指令使用可优化为:
test ecx,ecx
CMOVeq eax,ebx
回 6.4
第 六 章 32 位 指 令 及 其 编 程
83
6.5 用汇编语言编写 32位 WINDOWS应用程序
6.5 用汇编语言编写 32位 WINDOWS应用程序编写 Windows应用程序,通常使用 VC,JAVA等可视化的编程环境。
但是采用汇编语言,调用 Windows的应用程序接口
( API),借助 MASM32开发环境,也可以编写 Windows下运行的应用程序,而且生成的可执行文件相对教小,执行效率也相对教高;可以从更深层次理解 Windows程序的运行机制及程序设计思想。
本节简单介绍使用汇编语言编写 WIN32应用程序的基本思想、框架结构和开发环境。
第 六 章 32 位 指 令 及 其 编 程
846.5 目录
6.5.1 32位 WIN应用程序的特点
6.5.2 WIN32ASM 程序结构
6.5.3 MASM32开发环境回 第 6章第 六 章 32 位 指 令 及 其 编 程
856.5.1 32位 WIN应用程序的特点 /1
6.5.1 32位 WIN应用程序的特点
16位 DOS操作系统工作于实地址方式
DOS是单任务系统,一个正在运行的程序独占了所有系统资源
DOS系统只有一个特权级别,任何程序和操作系统都是同级的
32位 Windows操作系统运行于保护工作方式
Windows是多任务操作系统,系统资源由多个程序共享
Windows系统存在两个特权级别,操作系统运行在最高级别 0级,应用程序都运行于最低级别 3级第 六 章 32 位 指 令 及 其 编 程
86/2
DOS平台下
只有 1MB物理存储空间
必须分成不大于 64KB的逻辑段
Windows平台下
直接使用 32位地址寻址一个不分段的、达 4GB的主存空间
Windows应用程序只有代码段和数据段
无须和段寄存器打交道第 六 章 32 位 指 令 及 其 编 程
87/3
DOS操作系统为程序员提供中断服务程序
以中断调用的方法进行系统功能调用( 100个左右)
DOS中断调用采用寄存器传递参数
Windows操作系统提供了动态链接库 DDL
利用应用程序接口 API调用动态链接库中的函数
16位和 32位 Windows的 API分别被称为 Win16和 Win32
Windows应用程序利用堆栈传递参数第 六 章 32 位 指 令 及 其 编 程
88/4
DOS下的程序以字符方式显示给用户
程序需要用户输入时,就停下来;用户不输入就不执行;而且,在输入一个数据时,用户不能输入另一个数据。(过程驱动方式)
Windows程序采用图形用户界面
它时刻等待用户的操作。用户的每个操作都会形成消息( Message)传递给程序,程序则给予响应
(事件驱动或消息驱动)
回 6.5
第 六 章 32 位 指 令 及 其 编 程
896.5.2 例题 /1
6.5.2 WIN32ASM 程序结构例题,运行时,弹出一个消息框,显示 ‘ 欢迎进入 32位
Windows世界! '
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
第 六 章 32 位 指 令 及 其 编 程
90/2
.data
szCaption db 'Win32示例 ',0
szText db '欢迎进入 32位 Windows世界! ',0
.code
start:
invoke MessageBox,NULL,addr szText,
addr szCaption,MB_OK
invoke ExitProcess,NULL
end start
运行 ltwin01.exe
第 六 章 32 位 指 令 及 其 编 程
91例题讲解 /1
例题讲解
1,处理器选择伪指令,386
编写 32位 Windows应用程序,必须使用 386及以后
CPU的指令系统。
在 6.3节例题 6.5中,.386位于,model之后,本例中,386为第一条,含义为保护方式,32位段。
2,存储模式伪指令,model flat,stdcall
平展型存储模式:程序使用连续的 4G主存空间,编写 32位 Windows应用程序,必须选用。
语言类型 stdcall,API使用堆栈传递参数,
堆栈框架中第一个参数(占用高地址)为调用语句的最右边的参数,子程序负责平衡堆栈,
与此相符的语言类型只有 stdcall。
第 六 章 32 位 指 令 及 其 编 程
92/2
3,选项伪指令 option:
可用 option伪指令定义的选项很多( 27项),如
Option casemap:none ;对标识符区分大小写
Option casemap:all ;对标识符不区分大小写由于 API区别大小写,故使用了语句:
option casemap:none
第 六 章 32 位 指 令 及 其 编 程
93/3
4,包含伪指令 INCLUDE:
必须了解的几个问题:
,DLL 文件:动态链接库是 Windows的可执行文件。一个 DLL文件由许多
API函数组成,应用程序使用一个 API函数时,由
Windows自动装入 DLL程序,并调用相应的函数。
WindowsAPI的核心由 3个 DLL程序提供:
KERNEL32.DLL,系统核心服务功能。包括内存管理、任务管理等。
GDI32.DLL,图形设备接口。提供图形方面的操作。
USER32.DLL:用户接口服务。建立窗口和传送消息等,主要控制用户界面。
第 六 章 32 位 指 令 及 其 编 程
94/4
INC文件(包含文件),对函数、变量、常量等的声明。常用的包含文件为:
Windows.inc,声明了所有的 WINDOWS数据结构和常量等。
如 NULL equ 0
MB_OK equ 0
KERNEL32.INC,对应 KERNEL32.DLL
GDI32.INC,对应 GDI32.DLL
USER32.INC,对应 USER32.DLL
第 六 章 32 位 指 令 及 其 编 程
95/5
库文件(,LIB),API函数的定位信息。一个
DLL文件对应一个库文件。
KERNEL32.LIB 对应 KERNEL32.DLL
GDI32.LIB 对应 GDI32.DLL
USER32.LIB 对应 USER32.DLL
INC 文件使用包含伪指令 INCLUDE 包含; 库文件使用包含伪指令 INCLUDELIB 包含。
第 六 章 32 位 指 令 及 其 编 程
96/6
include \masm32\include\windows.inc;几乎所有的 Windows应用程序都应包含此文件
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib;函数 ExitProcess在 kernel32.dll中,对应的包含文件为 kernel32.inc,对应的库文件为 kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib;函数 MessageBox在 user32.dll中,对应的包含文件为 user32.inc,对应的库文件为 user32.lib
第 六 章 32 位 指 令 及 其 编 程
97/7
5,数据段和代码段定义伪指令
Windows应用程序只有数据段和代码段。
数据段定义了函数 MessageBox需要的两个字符串。
因为 API中字符串用 0结尾,故每个字符串后面加 0。
所有程序代码放在代码段,,end start”表示源程序结束,并指明了程序开始执行的语句。
第 六 章 32 位 指 令 及 其 编 程
98/8
6,API调用
Windows提供的 API调用有数千个。
MessageBox在 Win32程序员 参考手册 中的定义 (函数原型 ):
int MessageBox(
HWND hWnd,// handle of owner window
LPCTSTR lpText,// address of text in message box
LPCTSTR lpCaption,// address of title of message box
UINT uType // style of message box
);
在 user32.inc的声明:
MessageBoxA PROTO,DWORD,:DWORD,:DWORD,:DWORD
MessageBox equ <MessageBoxA>
第 六 章 32 位 指 令 及 其 编 程
99/9
int MessageBox(
dword hWnd,
dword lpText,
dword lpCaption,
dword uType
);
使用汇编语言的格式:
MessageBox PROTO hWnd:dword,lpText:dword,
lpCaption:dword,uType:dword
第 六 章 32 位 指 令 及 其 编 程
100/10
关于,MessageBox equ <MessageBoxA>”的解释:
在 WIN32环境中,和字符串相关的 API共有两类,分别对应两个字符集,ANSI字符集和 Unicode字符集。前一类函数的尾部带 ‘ A’,后一类函数的尾部带 ‘ W’。在动态连接库 user32.dll中只有 MessageBoxA和 MessageBoxW,在
user32.inc文件中有,MessageBox equ <MessageBoxA>”
调用时就可以使用函数名,MessageBox”。
第 六 章 32 位 指 令 及 其 编 程
101/11
API ExitProcess
在 Win32程序员参考手册中的定义:
VOID ExitProcess(
UINT uExitCode// exit code for all threads
);
在 user32.inc的声明:
ExitProcess PROTO,DWORD
第 六 章 32 位 指 令 及 其 编 程
102/12
invoke MessageBox,NULL,addr szText,
addr szCaption,MB_OK; NULL:该消息框无父窗口; addr:将变量地址传递给被调函数,该操作符只能用在 invoke语句。
MB_OK:该消息框只有一个,OK”按钮。
invoke ExitProcess,NULL; NULL:函数返回代码为 0
回 6.5
第 六 章 32 位 指 令 及 其 编 程
1036.5.3 MASM32开发环境
6.5.3 MASM32开发环境对于开发汇编语言源程序,微软只提供了宏汇编程序( MASM.EXE,ML.EXE等)和个别的工具程序,而开发时用到的其他工具软件、包含文件以及导入库文件等并没有包括在 MASM软件包中,需要编程者到其他软件包中寻找。
Steve Hutchesson的免费软件包 ( MASM32V7)
http://www.movsd.com/
第 六 章 32 位 指 令 及 其 编 程
104MASM32V7介绍
MASM32V7介绍不同工具软件的集合:
汇编程序,ML.EXE( 6.14)
资源编译器:微软 Visual Studio中的 RC.EXE
链接器:微软 Visual Studio中的 LINK.EXE
导入库文件,Visual C++中的导入库包含文件(头文件):发布者自己整理。
教程及范例第 六 章 32 位 指 令 及 其 编 程
105MASM32V7安装
MASM32V7安装
下载后解压缩。
在 WINDOWS环境下运行 install.exe进行安装。
选择安装的目标盘。
安装结束,所选磁盘的根目录即有了 MASM32
文件夹及所有已安装好的程序。
如下载得到的是自解压文件,masm32v7.exe,
在 WINDOWS环境下双击即可安装。
第 六 章 32 位 指 令 及 其 编 程
106MASM32目录说明
MASM32目录说明:
\MASM32,IDE环境及内带的文本编辑程序等
\MASM32\BIN:可执行程序,ML.EXE,LINK等
\MASM32\INCLUDE:所有的包含文件和头文件
\MASM32\LIB:所有的导入库文件
\MASM32\help:帮助文件
\MASM32\m32lib:一些常用 C子程序的汇编实现源程序
其他目录,范例程序和一些小工具程序等第 六 章 32 位 指 令 及 其 编 程
107MASM32使用 /1
MASM32使用:
使用软件包自带的集成环境:
WINDOWS环境下,运行 qeditor.exe,即进入集成开发环境。在集成开发环境下可进行编辑、
汇编、连接等操作。
不使用集成开发环境:
集成开发环境中的编辑器过于简单,不支持语法的高亮度显示等功能,可另行选择编辑器,
编辑完成后,用命令行方式进行汇编和连接。
第 六 章 32 位 指 令 及 其 编 程
108MASM32使用 /2
ml /c /coff ltwin01.asm; /c:只汇编不连接; /coff:生成,coff”格式的 obj文件。
在 DOS和 WIN3.X时代,微软使用的 obj文件格式为,OMF”格式,WIN32时代,改为,COFF”格式。
MASM6.11开始支持,COFF”格式。
link /subsystem:windows /libpath:\masm32\lib ltwin01.obj; /subsystem:windows:指定程序的运行平台; /libpath:\masm32\lib:指定库文件路径回 6.5
第 六 章 32 位 指 令 及 其 编 程
109本章重点本章重点:
32位 CPU的三种工作方式
32位 CPU的寄存器组
32位寻址方式
32位扩展指令(特别是 80186/286/386引入的增强原有功能的指令,如有符号数乘法、双操作数的符号扩展、通用寄存器的入栈、出栈等指令)
80386新增指令
32位 WIN应用程序的特点
用汇编语言编写 32位 WINDOWS应用程序第 六 章 32 位 指 令 及 其 编 程
110习题分析 /1
习题分析
6.10 用一条指令实现 EAX← EBX+ESI*2+1234H
LEA EAX,[EBX+ESI*2+1234H]
保证运算正确的条件是在 32位段中。因为在 16位段中,计算存储单元的 16位有效地址,经 0位扩展后送 r32
6.11 顺序执行下列程序段后,说明 EAX,EBX,ECX、
EDX,ESP的值。
1)mov eax,12345678h
mov ebx,87654321h
mov ecx,1111h
mov edx,9999h
mov esp,2000h
第 六 章 32 位 指 令 及 其 编 程
111习题分析 /2
2)push eax
push ebx
push 3333h; 16位立即数入栈,注意 8位立即数
push ecx
push dx
3)pop edx
pop cx
pop bx
pop eax
第 六 章 32 位 指 令 及 其 编 程
112习题分析 /3
6.14 回答下列问题:
1.ADD ECX,AX ; 类型不匹配
2.INC [BX] ; 未指明类型
3.说明指令,IMUL BX,DX,100H”的操作三操作数乘法指令,BX←DX*100H
4.JECXZ指令的操作,ECX=0,转移
5.MOV AX,[EBX+ECX]指令正确吗?
正确。对 32位 CPU,16位段和 32位段都可用。
6.32位 X86 CPU的 Jcc指令的转移范围:
按,宏汇编大全,,偏移量为 字 数据,即转移范围为 -32768--+32767字节。
第 六 章 32 位 指 令 及 其 编 程
113习题分析 /4
7.如何让汇编程序识别 386指令使用,386或,386p伪指令
8.如何让汇编程序形成 16位段和 32位段?
简化段定义中,采用 16位段还是 32位段,由指定处理器伪指令的位置决定:
处于,MODEL语句之后,为 16位段
处于,MODEL语句之前,为 32位段完整段定义中,采用 16位段还是 32位段,由段字属性 USE16和 USE32决定。但 386以下的处理器选择伪指令默认的段字属性为 16位段,386及以上的处理器选择伪指令默认的段字属性为 32位段。
第 六 章 32 位 指 令 及 其 编 程
114习题分析 /5
6.15 程序段的功能:将数组 array的第 4,6,8个字相加。对存储器操作数的寻址方式为,带比例的基址变址,寻址。
6.16 完成下列程序段:
① EBX内容减 1,DEC EBX
② EAX+EBX+ECX,和存入 EDX:
ADD EAX,EBX/ADC EAX,ECX/MOV EDX,EAX
③ 写一个过程,求 EAX,EBX,ECX的和,若有进位将 1存入 EDX,否则 EDX存 0。(累加和)
第 六 章 32 位 指 令 及 其 编 程
115习题分析 /6
sum proc near
xor edx,edx;假定无进位
add eax,ebx
add eax,ecx
jnc done
add edx,1
done:ret
sum endp
第 六 章 32 位 指 令 及 其 编 程
116习题分析 /7
④ 用两种方法都只用一条指令实现 EAX乘以 8。
A.SHL EAX,3
B.IMUL EAX,8
⑤ AL是有符号数,用两种方法把 AL扩展到 EAX
A.CBW / CWDE
B.MOVSX EAX,AL
⑥ AL是无符号数,用两种方法把 AL扩展到 EAX
A.MOVZX EAX,AL
B.XOR AH,AH/MOVZX EAX,AX;方法很多第 六 章 32 位 指 令 及 其 编 程
117习题分析 /8
6.17 解释下列指令如何计算存储器操作数的地址。
① add [ebx+8*ecx],al
② mov data[eax+ebx],cx
③ sub eax,data ;data理解成变量
④ mov ecx,[ebx]
6.19 针对例 6.6的排序过程
① ECX能够大于 64K吗?为什麽?
不可大于 64K。 ∴ 采用的是 16位段。(一个程序中可以有多个数据段)
②按升序排序如何修改?
第 六 章 32 位 指 令 及 其 编 程
118习题分析 /9
降 序 升 序
mov eax,[esi+edx*4+4] mov eax,[esi+edx*4+4]
cmp [esi+edx*4],eax cmp [esi+edx*4],eax
jge short nswap jle short nswap
xchg [esi+edx*4],eax xchg [esi+edx*4],eax
mov [esi+edx*4+4],eax mov [esi+edx*4+4],eax
nswap:inc edx nswap:inc edx
③ 增加一个入口参数 BL,当 BL=0时按升序,BL=1
按降序。
.if bl==0,if bl==0
升序程序段 jle short nswap
.else,else
降序程序段 jge short nswap
.endif,endif