彭茜珍,揭愛明
(1.湖北科技學(xué)院 學(xué)報(bào)編輯部,湖北 咸寧 437100;2.湖北新產(chǎn)業(yè)技師學(xué)院,湖北 咸寧 437100)
基于WINDOWS平臺(tái)下匯編語言程序上機(jī)中的問題探究
彭茜珍1,揭愛明2
(1.湖北科技學(xué)院 學(xué)報(bào)編輯部,湖北 咸寧 437100;2.湖北新產(chǎn)業(yè)技師學(xué)院,湖北 咸寧 437100)
在我國(guó)大學(xué)開設(shè)的匯編語言程序設(shè)計(jì)這門課的實(shí)踐環(huán)節(jié)中,大多都是在Windows平臺(tái)下,使用微軟的MASM宏匯編程序作為開發(fā)工具,但在上機(jī)實(shí)踐過程中或多或少會(huì)出現(xiàn)一些問題,給學(xué)生和老師帶來很大的麻煩,為了解決這些問題,文章研究了這些問題出現(xiàn)的原因和解決方法。
MASM匯編程序;INTEL處理器指令系統(tǒng);WINDOWS平臺(tái)
在Intel公司生產(chǎn)的CPU上,其指令系統(tǒng)從最初的80X86、MMX、SSE系列[1,2],發(fā)展到現(xiàn)在的VAX、VAX2和VAX512[3,4]以及一些特定指令系統(tǒng)[5],并且在計(jì)算機(jī)業(yè)界內(nèi)被廣泛使用。
現(xiàn)代Intel CPU的工作模式包括實(shí)模式、32位分段保護(hù)模式、32位分頁(yè)保護(hù)模式、虛擬8086模式、擴(kuò)展虛擬8086模式、IA-32e分頁(yè)模式,其體系結(jié)構(gòu)從開始的8位、16位、32位到現(xiàn)在的64位,能夠處理的整數(shù)有8位、16位、32位、64位、128位、256位和512位,能夠處理的實(shí)數(shù)包括單精度實(shí)型、雙精度實(shí)型和擴(kuò)展雙單精度實(shí)型,還可以處理各種打包的整數(shù)和實(shí)數(shù),功能非常強(qiáng)大。
微軟公司生產(chǎn)的宏匯編程序MASM已從5.0、6.0版發(fā)展到現(xiàn)在14.0版,其新版匯編的源程序可以在最新的Windows平臺(tái)下運(yùn)行。
Windows平臺(tái)已從Windows98、Windows2000、Windows XP、Windows7、Windows8到Windows10。結(jié)構(gòu)體系包括32位Windows和64位Windows。
在我國(guó)大學(xué)計(jì)算機(jī)專業(yè)開設(shè)的匯編語言程序設(shè)計(jì)這門課程中,不少學(xué)校以Intel CPU為背景進(jìn)行講授,內(nèi)容多半是在DOS系統(tǒng)下的80X86指令系統(tǒng)及程序設(shè)計(jì),CPU工作在實(shí)模式下,上機(jī)操作系統(tǒng)多半選用Windows XP,工作在32位下,開發(fā)工具多半采用MASM5.0或MASM6.0。在此條件下開發(fā)的匯編源程序不能充分利用現(xiàn)代環(huán)境下的硬件和OS的功能,而且其生成的可執(zhí)行文件在最新的Windows平臺(tái)上運(yùn)行時(shí)會(huì)出現(xiàn)問題,甚至不能運(yùn)行。例如下列匯編源程序:
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及之后的平臺(tái)下運(yùn)行就會(huì)出現(xiàn)問題,但使用新版的MASM 14.0對(duì)其進(jìn)行匯編又通不過。這就是上機(jī)實(shí)踐要解決問題之一。
當(dāng)前的WINDOWS平臺(tái)至少是32位,CPU至少是Pentium4,但廣泛使用的卻是WINDOWS 64位平臺(tái),CPU都是Core(TM)i3/i5/i7。對(duì)于WINDOWS 7之前的平臺(tái),它們只工作在32位保護(hù)模式,前述的源程序匯編后可以很好地運(yùn)行,這是因?yàn)?2位保護(hù)模式支持虛擬8086模式,OS提供模擬DOS系統(tǒng)功能調(diào)用的驅(qū)動(dòng)程序。但是,對(duì)于WINDOWS 7及其之后的平臺(tái),它們工作在64位的IA-32e分頁(yè)模式,此模式不支持虛擬8086模式,OS也不提供模擬DOS系統(tǒng)功能調(diào)用的驅(qū)動(dòng)程序,前述的源程序匯編后不能正常運(yùn)行。
前述源匯編程序無法用新版的MASM 14.0對(duì)其進(jìn)行匯編,原因是:(1)存儲(chǔ)模型不能使用DOS各種分段存儲(chǔ)模型,只能采用FLAT存儲(chǔ)模型;(2)在IA-32e分頁(yè)模式下,段基址是0000000000000000H,不可改變,程序中涉及改變段基址的指令通不過;(3)IA-32e分頁(yè)模式不支持DOS系統(tǒng)功能調(diào)用。
新版的MASM 14.0匯編程序有兩種:ML.EXE和ML64.EXE。它們不但具有匯編功能,而且可以通過設(shè)置參數(shù)使其具有鏈接功能。[6,7]
下面簡(jiǎn)述在現(xiàn)代WINDOWS 平臺(tái)下所提供的使用新版MASM 14.0進(jìn)行匯報(bào)語言程序設(shè)計(jì)的環(huán)境和要求:
(1)x64本機(jī)工具命令提示(x64 on x64)環(huán)境:Vcvarsall.bat 參數(shù),amd64;CPU架構(gòu),X86-64;WINDOWS平臺(tái),64位Windows;EXE文件格式,WIN64;運(yùn)行方式,64位本機(jī)進(jìn)程運(yùn)行。
(2)x64兼容工具命令提示(x64 on x86)環(huán)境:Vcvarsall.bat 參數(shù),x86_amd64;CPU架構(gòu),X86-32/X86-64;WINDOWS平臺(tái),32位Windows/64位Windows的WOW64下;EXE文件格式,WIN64;運(yùn)行方式,32位本機(jī)進(jìn)程運(yùn)行。
(3)x64兼容工具命令提示(x64 on x64)環(huán)境:Vcvarsall.bat 參數(shù),amd64_x86;CPU架構(gòu),X86-64;WINDOWS平臺(tái),64位Windows;EXE文件格式,WIN32;運(yùn)行方式,64位本機(jī)進(jìn)程運(yùn)行。
(4)x86本機(jī)工具命令提示(x86 on x86)環(huán)境:Vcvarsall.bat 參數(shù),X86;CPU架構(gòu),X86-32/ X86-64;WINDOWS平臺(tái),32位Windows/64位Windows的WOW64下;EXE文件格式,WIN32;運(yùn)行方式,32位本機(jī)進(jìn)程運(yùn)行。
(5)開發(fā)人員命令提示環(huán)境:等同于x86 本機(jī)工具命令提示環(huán)境。
通過在WINDOWS平臺(tái)下的純“命令提示符”窗口中運(yùn)行vcvarsall.bat,可設(shè)置環(huán)境變量以配置適用于32位或64位本機(jī)編譯的命令行,或適用于面向x86、x64處理器的交叉編譯的命令行。如果未提供任何參數(shù),vcvarsall.bat將配置環(huán)境變量以供使用面向x86的32位本機(jī)編譯器。
要適應(yīng)在現(xiàn)代最新CPU架構(gòu)下WINDOWS平臺(tái)上編寫匯編語言源程序并通過新版MASM的匯編,就不能再用舊的源程序格式,應(yīng)研究新的源程序格式。下面以前述匯編源程序的同樣內(nèi)容分32位WINDOWS平臺(tái)和64位WINDOWS平臺(tái)給出匯編源程序格式的研究結(jié)果。
(一)32位WINDOWS平臺(tái)下匯編源程序格式
.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
采用簡(jiǎn)化段定義,存儲(chǔ)模式為flat,如果CPU工作在傳統(tǒng)32位模式,可以使用DOS或WINDOWS系統(tǒng)調(diào)用,如果CPU工作在IA-32e兼容32位模式,只能使用WINDOWS系統(tǒng)調(diào)用。當(dāng)使用WINDOWS系統(tǒng)調(diào)用時(shí),應(yīng)采用stdcall調(diào)用規(guī)則,并且根據(jù)需要鏈接相應(yīng)API函數(shù)庫(kù)。匯編命令為:ml 匯編源程序文件名.asm /link /entry:Start /SUBSYSTEM:CONSOLE。
(二)64位WINDOWS平臺(tái)下匯編源程序格式
(1)使用C語言庫(kù)函數(shù):
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系統(tǒng)調(diào)用API函數(shù):
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
采用簡(jiǎn)化段定義,不支持處理器選擇偽指令,不支持存儲(chǔ)模式偽指令,使用PROTO關(guān)鍵字的偽指令不帶參數(shù)或改用PROC關(guān)鍵字,end偽指令不能指定程序入口點(diǎn)。由于在WINDOWS64下,CPU工作在IA-32e模式,只能使用WINDOWS系統(tǒng)調(diào)用API函數(shù)或C語言庫(kù)函數(shù)。使用WINDOWS系統(tǒng)調(diào)用API函數(shù)時(shí),應(yīng)符合Microsoft 64位調(diào)用規(guī)則。當(dāng)使用WINDOWS系統(tǒng)調(diào)用或C語言庫(kù)函數(shù)時(shí),應(yīng)根據(jù)需要鏈接相應(yīng)API函數(shù)庫(kù)或C語言函數(shù)庫(kù)。匯編命令為:ml64 匯編源程序文件名.asm /link /entry:Start /SUBSYSTEM:CONSOLE。
在Intel CPU為Core(TM)i3/i5/i7下,當(dāng)前廣泛安裝的是WINDOWS64平臺(tái),為使用最新版MASM開發(fā)匯編源程序,應(yīng)遵循本文給出的源程序格式,只要不使用特權(quán)指令,可盡情用最新的指令系統(tǒng)做開發(fā),都不會(huì)有問題。希望本文能給講授和學(xué)習(xí)匯編語言程序設(shè)計(jì)的老師和學(xué)生,提供拋磚引玉的幫助。
[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加密指令研究及其應(yīng)用[J]. 湖北科技學(xué)院學(xué)報(bào),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
胡 莉