基于WINDOWS平台下汇编语言程序上机中的问题探究
2017-02-24彭茜珍揭爱明
彭茜珍,揭爱明
(1.湖北科技学院 学报编辑部,湖北 咸宁 437100;2.湖北新产业技师学院,湖北 咸宁 437100)
基于WINDOWS平台下汇编语言程序上机中的问题探究
彭茜珍1,揭爱明2
(1.湖北科技学院 学报编辑部,湖北 咸宁 437100;2.湖北新产业技师学院,湖北 咸宁 437100)
在我国大学开设的汇编语言程序设计这门课的实践环节中,大多都是在Windows平台下,使用微软的MASM宏汇编程序作为开发工具,但在上机实践过程中或多或少会出现一些问题,给学生和老师带来很大的麻烦,为了解决这些问题,文章研究了这些问题出现的原因和解决方法。
MASM汇编程序;INTEL处理器指令系统;WINDOWS平台
在Intel公司生产的CPU上,其指令系统从最初的80X86、MMX、SSE系列[1,2],发展到现在的VAX、VAX2和VAX512[3,4]以及一些特定指令系统[5],并且在计算机业界内被广泛使用。
现代Intel CPU的工作模式包括实模式、32位分段保护模式、32位分页保护模式、虚拟8086模式、扩展虚拟8086模式、IA-32e分页模式,其体系结构从开始的8位、16位、32位到现在的64位,能够处理的整数有8位、16位、32位、64位、128位、256位和512位,能够处理的实数包括单精度实型、双精度实型和扩展双单精度实型,还可以处理各种打包的整数和实数,功能非常强大。
微软公司生产的宏汇编程序MASM已从5.0、6.0版发展到现在14.0版,其新版汇编的源程序可以在最新的Windows平台下运行。
Windows平台已从Windows98、Windows2000、Windows XP、Windows7、Windows8到Windows10。结构体系包括32位Windows和64位Windows。
在我国大学计算机专业开设的汇编语言程序设计这门课程中,不少学校以Intel CPU为背景进行讲授,内容多半是在DOS系统下的80X86指令系统及程序设计,CPU工作在实模式下,上机操作系统多半选用Windows XP,工作在32位下,开发工具多半采用MASM5.0或MASM6.0。在此条件下开发的汇编源程序不能充分利用现代环境下的硬件和OS的功能,而且其生成的可执行文件在最新的Windows平台上运行时会出现问题,甚至不能运行。例如下列汇编源程序:
DATA SEGMENT
CR EQU 0DH ;回车
LF EQU 0AH ;换行
szMES DB “HOW DO YOU DO?”,CR,LF,“HOW ARE YOU?”,“$”
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET szMES
MOV AH, 9
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END MAIN
把它用MASM 5.0/6.0汇编之后,在WINDOWS7及之后的平台下运行就会出现问题,但使用新版的MASM 14.0对其进行汇编又通不过。这就是上机实践要解决问题之一。
一、WINDOWS平台下汇编源程序开发环境探讨
当前的WINDOWS平台至少是32位,CPU至少是Pentium4,但广泛使用的却是WINDOWS 64位平台,CPU都是Core(TM)i3/i5/i7。对于WINDOWS 7之前的平台,它们只工作在32位保护模式,前述的源程序汇编后可以很好地运行,这是因为32位保护模式支持虚拟8086模式,OS提供模拟DOS系统功能调用的驱动程序。但是,对于WINDOWS 7及其之后的平台,它们工作在64位的IA-32e分页模式,此模式不支持虚拟8086模式,OS也不提供模拟DOS系统功能调用的驱动程序,前述的源程序汇编后不能正常运行。
前述源汇编程序无法用新版的MASM 14.0对其进行汇编,原因是:(1)存储模型不能使用DOS各种分段存储模型,只能采用FLAT存储模型;(2)在IA-32e分页模式下,段基址是0000000000000000H,不可改变,程序中涉及改变段基址的指令通不过;(3)IA-32e分页模式不支持DOS系统功能调用。
新版的MASM 14.0汇编程序有两种:ML.EXE和ML64.EXE。它们不但具有汇编功能,而且可以通过设置参数使其具有链接功能。[6,7]
下面简述在现代WINDOWS 平台下所提供的使用新版MASM 14.0进行汇报语言程序设计的环境和要求:
(1)x64本机工具命令提示(x64 on x64)环境:Vcvarsall.bat 参数,amd64;CPU架构,X86-64;WINDOWS平台,64位Windows;EXE文件格式,WIN64;运行方式,64位本机进程运行。
(2)x64兼容工具命令提示(x64 on x86)环境:Vcvarsall.bat 参数,x86_amd64;CPU架构,X86-32/X86-64;WINDOWS平台,32位Windows/64位Windows的WOW64下;EXE文件格式,WIN64;运行方式,32位本机进程运行。
(3)x64兼容工具命令提示(x64 on x64)环境:Vcvarsall.bat 参数,amd64_x86;CPU架构,X86-64;WINDOWS平台,64位Windows;EXE文件格式,WIN32;运行方式,64位本机进程运行。
(4)x86本机工具命令提示(x86 on x86)环境:Vcvarsall.bat 参数,X86;CPU架构,X86-32/ X86-64;WINDOWS平台,32位Windows/64位Windows的WOW64下;EXE文件格式,WIN32;运行方式,32位本机进程运行。
(5)开发人员命令提示环境:等同于x86 本机工具命令提示环境。
通过在WINDOWS平台下的纯“命令提示符”窗口中运行vcvarsall.bat,可设置环境变量以配置适用于32位或64位本机编译的命令行,或适用于面向x86、x64处理器的交叉编译的命令行。如果未提供任何参数,vcvarsall.bat将配置环境变量以供使用面向x86的32位本机编译器。
二、现代汇编语言源程序格式研究
要适应在现代最新CPU架构下WINDOWS平台上编写汇编语言源程序并通过新版MASM的汇编,就不能再用旧的源程序格式,应研究新的源程序格式。下面以前述汇编源程序的同样内容分32位WINDOWS平台和64位WINDOWS平台给出汇编源程序格式的研究结果。
(一)32位WINDOWS平台下汇编源程序格式
.386
.model flat ,stdcall
NULL equ 0
MB_OK equ 0
ExitProcess PROTO :DWORD
MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
includelib kernel32.lib
includelib user32.lib
.data
szMES db “HOW DO YOU DO?”,CR,LF,“HOW ARE YOU?”,0
szCaption db “Win32汇编源程序”,0
.code
Start:
push MB_OK
lea eax,szCaption
push eax
lea eax, szMES
push eax
push NULL
call MessageBoxA
xor eax,eax
push eax
call ExitProcess
end Start
采用简化段定义,存储模式为flat,如果CPU工作在传统32位模式,可以使用DOS或WINDOWS系统调用,如果CPU工作在IA-32e兼容32位模式,只能使用WINDOWS系统调用。当使用WINDOWS系统调用时,应采用stdcall调用规则,并且根据需要链接相应API函数库。汇编命令为:ml 汇编源程序文件名.asm /link /entry:Start /SUBSYSTEM:CONSOLE。
(二)64位WINDOWS平台下汇编源程序格式
(1)使用C语言库函数:
includelib msvcrt.lib
extern printf: PROC
.data
szMES db “HOW DO YOU DO?”,CR,LF,“HOW ARE YOU?”,0Ah
.code
Start proc
sub rsp,28h ;
lea rcx, szMES;
mov rax, offset szMES
call printf
add rsp, 28h
ret
Start endp
end
(2)使用WINDOWS系统调用API函数:
includelib kernel32.lib
includelib user32.lib
extrn ExitProcess: PROC
extrn MessageBoxA: PROC
.data
caption db “Win64汇编源程序”, 0
szMES db “HOW DO YOU DO?”,CR,LF,“HOW ARE YOU?”, 0
.code
Start proc
sub rsp,28h
mov rcx, 0
lea rdx, szMES
lea r8, caption
mov r9d, 0
call MessageBoxA
mov ecx, eax
call ExitProcess
Start endp
end
采用简化段定义,不支持处理器选择伪指令,不支持存储模式伪指令,使用PROTO关键字的伪指令不带参数或改用PROC关键字,end伪指令不能指定程序入口点。由于在WINDOWS64下,CPU工作在IA-32e模式,只能使用WINDOWS系统调用API函数或C语言库函数。使用WINDOWS系统调用API函数时,应符合Microsoft 64位调用规则。当使用WINDOWS系统调用或C语言库函数时,应根据需要链接相应API函数库或C语言函数库。汇编命令为:ml64 汇编源程序文件名.asm /link /entry:Start /SUBSYSTEM:CONSOLE。
三、结语
在Intel CPU为Core(TM)i3/i5/i7下,当前广泛安装的是WINDOWS64平台,为使用最新版MASM开发汇编源程序,应遵循本文给出的源程序格式,只要不使用特权指令,可尽情用最新的指令系统做开发,都不会有问题。希望本文能给讲授和学习汇编语言程序设计的老师和学生,提供抛砖引玉的帮助。
[1] Intel Corporation: Intel 64 and IA-32 Architecture Software Developer's Manual Volume 1: Basic Architecture[M/CD]. Http://WWW.INTEL.COM Order Number,2016.253665~059US.
[2] Intel Corporation: Intel 64 and IA-32 Architecture Software Developer's Manual Volume 2: Instruction Set Reference,A-Z[M/CD]. Http://WWW.INTEL.COM Order Number,2016,253666~059US .
[3] Intel Corporation: Intel Advanced Vector Extensions Programming Reference [M/CD]. Http://WWW.INTEL.COM Order Number,2011.319433~011.
[4] Intel Corporation: Intel Architecture Instruction Set Extensions Programming Reference512 [M/CD]. Http://WWW.INTEL.COM Order Number,2016.319433~025.
[5] 彭茜珍.Intel加密指令研究及其应用[J]. 湖北科技学院学报,2016,36(12):68~70.
[6] Microsoft Corporation: Microsoft Macro Assembler reference [M/CD]. https://technet.microsoft.com/zh-cn/library.
[7] Chris Lomont, Introduction to x64 Assembly. https://www.lomont.org 2009.
2095-4654(2017)06-0143-03
2017-06-18
TP313
A
胡 莉