第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院教学重点在 16位 8086指令系统基础上,我们扩展到 32位 80x86
指令系统 。 了解:
32位编程环境
32位寻址方式
32位指令编程方法
Windows应用程序编程第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
IA-32结构的指令系统
整数指令集
16位整数指令集
32位整数指令集
浮点指令集
MMX指令集
SSE指令集
SSE2指令集
SSE3指令集主要指令集在
16
指令基础上形成的
32
位整数指令集第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.1 32位指令的运行环境实地址方式保护方式虚拟 8086方式
16位逻辑段,段地址和偏移地址都是 16位
—— 段地址左移 4位加偏移地址形成 20位物理地址
32位逻辑段,段地址和偏移地址都是 32位
—— 段地址加偏移地址形成 32位线性地址第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.1.1 寄存器组
8个 32位通用寄存器:
EAX EBX ECX EDX
ESI EDI EBP ESP
6个 16位段寄存器:
CS SS DS ES FS GS
32位指令指针寄存器,EIP
32位标志寄存器,EFLAGS
其他的 32位系统用寄存器在原有
16
位寄存器基础上扩展成为
32
位第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.1.2 寻址方式
32位有效地址=
基址寄存器 + ( 变址寄存器 × 比例 ) + 位移量
基址寄存器 —— 任何 8个 32位通用寄存器之一
变址寄存器 —— 除 ESP之外的任何 32
位通用寄存器之一
比例 —— 可以是 1/ 2 / 4 / 8
位移量 —— 可以是 8/ 32位值第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
32位寻址方式
⑴ mov eax,44332211h
⑵ mov eax,ebx
⑶ mov eax,[1234h]
⑷ mov eax,[ebx]
⑸ mov eax,[ebx+80h]
⑹ mov eax,[ebx+esi]
⑺ mov eax,[ebx+esi+80h]
⑻ mov eax,[esi*2]
⑼ mov eax,[ebx+esi*4]
⑽ mov eax,[ebx+esi*8+80h]
第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.2 32位扩展指令
16位指令系统从两个方面向 32位扩展
⑴ 支持 32位操作数
⑵ 支持 32位寻址方式
mov ax,bx ;16位操作数
mov eax,ebx ;32位操作数
mov ax,[ebx] ;16位操作数,32位寻址方式
mov eax,[ebx] ;32位操作数,32位寻址方式
有些指令扩大了工作范围,或指令功能实现了向 32位的自然增强第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.3 32位指令的程序设计
指定汇编程序识别新指令
处理 16位段和 32位段
注意有些指令在 16位逻辑段和 32位逻辑段的差别
DOS环境 ( 实地址方式和虚拟 8086方式 ),
只能使用 16位段
Windows 32位保护方式,可以使用 32位段例 6.5- 1/2
.model small
.386 ;采用 32位指令
.stack
.data
qvar dq 1234567887654321h ;数据定义
.code
.startup
mov eax,dword ptr qvar
mov edx,dword ptr qvar[4]
例 6.5- 2/2
mov ecx,8
start1,shl eax,1
rcl edx,1
loop start1
mov dword ptr qvar,eax
mov dword ptr qvar[4],edx
.exit 0
end
第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.5 用汇编语言编写 32位 Windows应用程序
采用汇编语言可以编写 32位 Windows应用程序
调用 Windows的应用程序接口 API
借助 MASM32开发环境
可以利用 Windows的高级特性,生成的可执行文件相对较小,性能更高
从更深层次理解 Windows运行机制及程序设计思想
介绍汇编语言编写 Win32程序的基本思想,
框架结构和开发环境第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
16位 DOS与 32位 Windows- 1
16位 DOS操作系统工作于实地址方式
DOS是单任务操作系统,一个正在运行的程序独占了所有系统资源
DOS系统只有一个特权级别,任何程序和操作系统都是同级的
32位 Windows操作系统运行于保护工作方式
Windows是多任务操作系统,系统资源由多个程序共享
Windows系统存在两个特权级别,操作系统运行在最高级别 0级,应用程序都运行于最低级别 3级第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
16位 DOS与 32位 Windows- 2
DOS平台下
只有 1MB物理存储空间
必须分成不大于 64KB的逻辑段
Windows平台下
直接使用 32位地址寻址一个不分段的,达 4GB
的主存空间
Windows应用程序只有代码段和数据段
无须和段寄存器打交道第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
16位 DOS与 32位 Windows- 3
对程序员来说,操作系统由其提供的系统功能调用定义
DOS操作系统为程序员提供中断服务程序
以中断调用的方法进行系统功能调用
DOS中断调用采用寄存器传递参数
Windows操作系统提供了动态链接库 DDL
利用应用程序接口 API调用动态链接库中的函数
Windows的 API也曾被称为软件开发包 SDK,16位和
32位 Windows的 API分别被称为 Win16和 Win32
Windows应用程序利用堆栈传递参数第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
16位 DOS与 32位 Windows- 4
DOS下的程序以字符方式显示给用户
程序需要用户输入时,就停下来;用户不输入就不再执行;而且,需要输入一个数据,用户不能输入另一个数据 。
Windows程序采用图形用户界面
它时刻等待用户的操作 。 用户的每个操作都会形成消息 ( Message) 传递给程序,程序则给予响应第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.5.2 32位 Windows控制台程序
Windows应用程序开始运行
创建控制台 ( Console) 窗口
或创建图形界面窗口
32位 Windows控制台程序
像增强版的 MS-DOS程序
使用 标准控制台,输入设备 ( 键盘 ) 和 输出设备 ( 显示器 )
32位控制台程序运行在保护方式
通过 API使用 Windows的动态链接库函数
.386
.model flat,stdcall
option casemap:none
Includelib kernel32.lib
ExitProcess proto,:DWORD
GetStdHandle proto,:DWORD
WriteConsoleA
proto,:DWORD,:DWORD,:DWORD,:DWO
RD,:DWORD
WriteConsole equ <WriteConsoleA>
ReadConsoleA
proto,:DWORD,:DWORD,:DWORD,:DWO
RD,:DWORD
ReadConsole equ <ReadConsoleA>
STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
例 6.11- 1/4
.data
outhandle dd?
outbuffer db 'Welcome to the Win32
Console !',0dh,0ah
db 'Please enter your
name:',0dh,0ah
outbufsize = $-outbuffer
outsize dd?
inhandle dd?
inbufsize = 80
inbuffer db inbufsize dup(?),0,0
insize dd?
例 6.11- 2/4
.code
start:;获得输出句柄
invoke
GetStdHandle,STD_OUTPUT_HANDLE
mov outhandle,eax;显示信息
invoke
WriteConsole,outhandle,
addr outbuffer,outbufsize,
addr outsize,0
例 6.11- 3/4;获得输入句柄
invoke
GetStdHandle,STD_INPUT_HANDLE
mov inhandle,eax;等待用户输入
invoke
ReadConsole,inhandle,
addr inbuffer,inbufsize,addr insize,0;退出
invoke ExitProcess,0
end start
例 6.11- 4/4
第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院汇编和连接
MASM汇编的命令:
ML /c /coff /Fl /Zi lt611.asm
参数,/coff”表示生成 COFF格式的 OBJ模块文件
需要 32位增量式链接器文件,更名为 LINK32.EXE,
连接命令:
LINK32 /subsystem:console /debug lt611.obj
参数,/subsystem:console”生成控制台程序
本程序使用了 kernel32.lib库文件,该文件也应该复制到 MASM目录第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.5.3 MASM32开发环境
Steve Hutchesson的 免费软件包
( http://www.movsd.com/)
编辑器 geditor.exe
MASM 6.14汇编程序和链接程序
相当完整的 Win32的包含文件,库文件以及教程和示例等
一个最简单的 Win32汇编语言程序
显示标准 Windows消息窗口的程序
6.5.4 创建消息窗口例 6.12- 1/2.386
.model flat,stdcall
option casemap:none
Include include\windows.inc
Include include\kernel32.inc
Include include\user32.inc
Includelib lib\kernel32.lib
Includelib lib\user32.lib
第 6 章
.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
例 6.12- 2/2
对比 C++程序第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.5.5 创建窗口应用程序
用汇编语言创建 32位 Windows应用程序
与用 C++采用 API开发没有太大区别
程序框架,用到的函数基本上一样
例 6.13程序
创建一个标准的 Windows窗口程序
包括标题栏及客户区
能够进行标准的窗口操作
例 6.14程序
点击鼠标左键
弹出消息框
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院第 6章 教学要求
1,了解 32位 80x86CPU的 3种工作方式和 32
位寄存器组,熟悉 32位寻址方式
2,了解在 DOS环境 32位指令编程方法
3,了解开发 32位 Windows控制台和窗口应用程序的方法
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院教学重点在 16位 8086指令系统基础上,我们扩展到 32位 80x86
指令系统 。 了解:
32位编程环境
32位寻址方式
32位指令编程方法
Windows应用程序编程第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
IA-32结构的指令系统
整数指令集
16位整数指令集
32位整数指令集
浮点指令集
MMX指令集
SSE指令集
SSE2指令集
SSE3指令集主要指令集在
16
指令基础上形成的
32
位整数指令集第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.1 32位指令的运行环境实地址方式保护方式虚拟 8086方式
16位逻辑段,段地址和偏移地址都是 16位
—— 段地址左移 4位加偏移地址形成 20位物理地址
32位逻辑段,段地址和偏移地址都是 32位
—— 段地址加偏移地址形成 32位线性地址第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.1.1 寄存器组
8个 32位通用寄存器:
EAX EBX ECX EDX
ESI EDI EBP ESP
6个 16位段寄存器:
CS SS DS ES FS GS
32位指令指针寄存器,EIP
32位标志寄存器,EFLAGS
其他的 32位系统用寄存器在原有
16
位寄存器基础上扩展成为
32
位第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.1.2 寻址方式
32位有效地址=
基址寄存器 + ( 变址寄存器 × 比例 ) + 位移量
基址寄存器 —— 任何 8个 32位通用寄存器之一
变址寄存器 —— 除 ESP之外的任何 32
位通用寄存器之一
比例 —— 可以是 1/ 2 / 4 / 8
位移量 —— 可以是 8/ 32位值第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
32位寻址方式
⑴ mov eax,44332211h
⑵ mov eax,ebx
⑶ mov eax,[1234h]
⑷ mov eax,[ebx]
⑸ mov eax,[ebx+80h]
⑹ mov eax,[ebx+esi]
⑺ mov eax,[ebx+esi+80h]
⑻ mov eax,[esi*2]
⑼ mov eax,[ebx+esi*4]
⑽ mov eax,[ebx+esi*8+80h]
第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.2 32位扩展指令
16位指令系统从两个方面向 32位扩展
⑴ 支持 32位操作数
⑵ 支持 32位寻址方式
mov ax,bx ;16位操作数
mov eax,ebx ;32位操作数
mov ax,[ebx] ;16位操作数,32位寻址方式
mov eax,[ebx] ;32位操作数,32位寻址方式
有些指令扩大了工作范围,或指令功能实现了向 32位的自然增强第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.3 32位指令的程序设计
指定汇编程序识别新指令
处理 16位段和 32位段
注意有些指令在 16位逻辑段和 32位逻辑段的差别
DOS环境 ( 实地址方式和虚拟 8086方式 ),
只能使用 16位段
Windows 32位保护方式,可以使用 32位段例 6.5- 1/2
.model small
.386 ;采用 32位指令
.stack
.data
qvar dq 1234567887654321h ;数据定义
.code
.startup
mov eax,dword ptr qvar
mov edx,dword ptr qvar[4]
例 6.5- 2/2
mov ecx,8
start1,shl eax,1
rcl edx,1
loop start1
mov dword ptr qvar,eax
mov dword ptr qvar[4],edx
.exit 0
end
第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.5 用汇编语言编写 32位 Windows应用程序
采用汇编语言可以编写 32位 Windows应用程序
调用 Windows的应用程序接口 API
借助 MASM32开发环境
可以利用 Windows的高级特性,生成的可执行文件相对较小,性能更高
从更深层次理解 Windows运行机制及程序设计思想
介绍汇编语言编写 Win32程序的基本思想,
框架结构和开发环境第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
16位 DOS与 32位 Windows- 1
16位 DOS操作系统工作于实地址方式
DOS是单任务操作系统,一个正在运行的程序独占了所有系统资源
DOS系统只有一个特权级别,任何程序和操作系统都是同级的
32位 Windows操作系统运行于保护工作方式
Windows是多任务操作系统,系统资源由多个程序共享
Windows系统存在两个特权级别,操作系统运行在最高级别 0级,应用程序都运行于最低级别 3级第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
16位 DOS与 32位 Windows- 2
DOS平台下
只有 1MB物理存储空间
必须分成不大于 64KB的逻辑段
Windows平台下
直接使用 32位地址寻址一个不分段的,达 4GB
的主存空间
Windows应用程序只有代码段和数据段
无须和段寄存器打交道第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
16位 DOS与 32位 Windows- 3
对程序员来说,操作系统由其提供的系统功能调用定义
DOS操作系统为程序员提供中断服务程序
以中断调用的方法进行系统功能调用
DOS中断调用采用寄存器传递参数
Windows操作系统提供了动态链接库 DDL
利用应用程序接口 API调用动态链接库中的函数
Windows的 API也曾被称为软件开发包 SDK,16位和
32位 Windows的 API分别被称为 Win16和 Win32
Windows应用程序利用堆栈传递参数第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
16位 DOS与 32位 Windows- 4
DOS下的程序以字符方式显示给用户
程序需要用户输入时,就停下来;用户不输入就不再执行;而且,需要输入一个数据,用户不能输入另一个数据 。
Windows程序采用图形用户界面
它时刻等待用户的操作 。 用户的每个操作都会形成消息 ( Message) 传递给程序,程序则给予响应第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.5.2 32位 Windows控制台程序
Windows应用程序开始运行
创建控制台 ( Console) 窗口
或创建图形界面窗口
32位 Windows控制台程序
像增强版的 MS-DOS程序
使用 标准控制台,输入设备 ( 键盘 ) 和 输出设备 ( 显示器 )
32位控制台程序运行在保护方式
通过 API使用 Windows的动态链接库函数
.386
.model flat,stdcall
option casemap:none
Includelib kernel32.lib
ExitProcess proto,:DWORD
GetStdHandle proto,:DWORD
WriteConsoleA
proto,:DWORD,:DWORD,:DWORD,:DWO
RD,:DWORD
WriteConsole equ <WriteConsoleA>
ReadConsoleA
proto,:DWORD,:DWORD,:DWORD,:DWO
RD,:DWORD
ReadConsole equ <ReadConsoleA>
STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
例 6.11- 1/4
.data
outhandle dd?
outbuffer db 'Welcome to the Win32
Console !',0dh,0ah
db 'Please enter your
name:',0dh,0ah
outbufsize = $-outbuffer
outsize dd?
inhandle dd?
inbufsize = 80
inbuffer db inbufsize dup(?),0,0
insize dd?
例 6.11- 2/4
.code
start:;获得输出句柄
invoke
GetStdHandle,STD_OUTPUT_HANDLE
mov outhandle,eax;显示信息
invoke
WriteConsole,outhandle,
addr outbuffer,outbufsize,
addr outsize,0
例 6.11- 3/4;获得输入句柄
invoke
GetStdHandle,STD_INPUT_HANDLE
mov inhandle,eax;等待用户输入
invoke
ReadConsole,inhandle,
addr inbuffer,inbufsize,addr insize,0;退出
invoke ExitProcess,0
end start
例 6.11- 4/4
第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院汇编和连接
MASM汇编的命令:
ML /c /coff /Fl /Zi lt611.asm
参数,/coff”表示生成 COFF格式的 OBJ模块文件
需要 32位增量式链接器文件,更名为 LINK32.EXE,
连接命令:
LINK32 /subsystem:console /debug lt611.obj
参数,/subsystem:console”生成控制台程序
本程序使用了 kernel32.lib库文件,该文件也应该复制到 MASM目录第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.5.3 MASM32开发环境
Steve Hutchesson的 免费软件包
( http://www.movsd.com/)
编辑器 geditor.exe
MASM 6.14汇编程序和链接程序
相当完整的 Win32的包含文件,库文件以及教程和示例等
一个最简单的 Win32汇编语言程序
显示标准 Windows消息窗口的程序
6.5.4 创建消息窗口例 6.12- 1/2.386
.model flat,stdcall
option casemap:none
Include include\windows.inc
Include include\kernel32.inc
Include include\user32.inc
Includelib lib\kernel32.lib
Includelib lib\user32.lib
第 6 章
.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
例 6.12- 2/2
对比 C++程序第 6 章
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院
6.5.5 创建窗口应用程序
用汇编语言创建 32位 Windows应用程序
与用 C++采用 API开发没有太大区别
程序框架,用到的函数基本上一样
例 6.13程序
创建一个标准的 Windows窗口程序
包括标题栏及客户区
能够进行标准的窗口操作
例 6.14程序
点击鼠标左键
弹出消息框
HTTP://DLS.ZZU.EDU.CN 郑州大学远程教育学院第 6章 教学要求
1,了解 32位 80x86CPU的 3种工作方式和 32
位寄存器组,熟悉 32位寻址方式
2,了解在 DOS环境 32位指令编程方法
3,了解开发 32位 Windows控制台和窗口应用程序的方法