APP下载

基于WINDOWS平台下汇编语言程序上机中的问题探究

2017-02-24彭茜珍揭爱明

湖北科技学院学报 2017年6期
关键词:汇编语言调用湖北

彭茜珍,揭爱明

(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

胡 莉

猜你喜欢

汇编语言调用湖北
The rise of China-Chic
高等学校计算机专业课程教学改革实践——以汇编语言与接口技术课程为例
驰援湖北
核电项目物项调用管理的应用研究
湖北武汉卷
汇编语言与C语言的混合程序设计技术研究
湖北現“最牛釘子戶” 車道4變2給樓讓路
提高《汇编语言程序设计》教学效率的思考与实践
基于系统调用的恶意软件检测技术研究
利用RFC技术实现SAP系统接口通信