最近在学习中用到汇编的部分知识,于是在笔记本(Win10)上搭建一个可以编写执行汇编代码的环境,踩了一些坑,在此记录一下简单版的配置过程
一、下载文件
这里需要的文件是DOSBox+MASM(包含部分可执行程序)文件夹,下面是二者的下载链接
链接:https://pan.baidu.com/s/1gXPKTT-xKb6BpjOJdhmudA 密码:khqs
链接:https://pan.baidu.com/s/177arSA34plWqV-iyffWpEw 密码:3akd
其中MASM需包含四个最基本的文件:debug.exe、edit,exe、link.exe、masm.exe
masm.exe:汇编程序,用于汇编源程序(.asm),得到目标程序(.obj);
link.exe:连接程序,用于连接目标程序,得到可执行程序(.exe);
debug.exe:调试程序,用于调试可执行程序。
二、安装软件+DOSBox环境搭建
DOSBox的安装直接下一步就ok
将masm放置在任意文件夹下:我的位置:E:masm
为了避免每次都要挂载路径,可以将挂载命令写入 dosbox-0.74.conf 文件中,路径会显示在DOSBox较大窗口上
挂载命令:
mount D E:masm # D为DOSBox的路径,E:masm 为windows中放置masm文件的路径 set path=$path$;E:masm #配置环境变量
目前报错内容:
(看网上其余经验贴,均可以正常执行)
(目前我配置的环境变量有问题,在执行 masm 命令时显示 )
在配置完挂载内容后,每次打开就会自动将windows中的masm文件挂载到DOSBox中的D盘上了
测试DOSBox
1、 在挂载路径(E:masm)新建文件夹或文件
2、 打开DOSbox
3、 输入D:进入DOSbox的D盘
4、 输入dir查看是否有自己新建的文件夹或文件
5、 3、4步若是成功则说明挂载成功,否则不成功
6、 运行环境搭建完毕
三、执行代码
在E:masm 文件夹(此时已经包含masm.exe等共四个可执行文件)新建一个hello.asm文件(使用记事本添加即可,保存为.asm格式文件)
具体内容为
DATA SEGMENT BUFFER DB "hello world", 0DH, 0AH DB "hello", 0DH, 0AH DB "hi", 0DH, 0AH, '$' DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV DX, OFFSET BUFFER ;打印菜单 MOV AH, 09H INT 21H MOV AH,4CH ;退出程序 INT 21H CODE ENDS END START
执行代码过程:
0. 在窗口中输入D: 进入DOSBox的D文件夹
1. 在进入D文件夹后输入命令 masm 后输入 hello(文件名),注意 截图中的红色框为输入内容,绿色框为 回车键
2. 在上述执行过程后会生成hello.obj文件,此时输入命令 link 后输入 hello (文件名),操作方式同步骤1
由于在上述代码中未定义堆栈段,故在链接时会提示:LINK : warning L4021: no stack segment,因不会影响执行文件的生成,故暂时忽略
3. 在执行上述过程后会生成 hello.exe 可执行文件,此时直接输入 hello.exe 变得到打印结果,一套简单的汇编代码执行过程就结束了。
四、汇编代码高亮设置
为了观感舒适,避免使用文本文档直接编辑带来的语法错误,这里采用 UltraEdit 进行汇编代码的书写
高亮过程如下
1.新建一个文本文档(copy完以下内容后命名为 masm.uew)
/L19"Assembly for MASM" Nocase Line Comment = ; File Extensions = ASM COD INB INC MAC
/Delimiters = ~!%&^*()-+=|/{}[]:;"'<> ,
/Function String = "%[a-zA-Z0-9_@?$]+[ ^t]+proc+[ ^t^p]"
/C1"Instruction"
.break .breakif .continue .else .elseif .endif .exit .if .repeat .startup
.until .untilcxz .while
aaa aad aam aas adc add and arpl
bound bsf bsr bswap bt btc btr bts
call cbw cdq clc cld cli clts cmc cmov cmp cmps cmpsb cmpsd cmpsw cmpxchg
cmpxchg8b cpuid cwd cwde
daa das dec div
enter esc
hlt
idiv imul in inc ins insb insd insw int into invd invlpg invoke iret iretd
ja jae jb jbe jc jcxz je jecxz jg jge jl jle jmp jna jnae jnb jnbe jnc jne
jng jnge jnl jnle jno jnp jns jnz jo jp jpe jpo js jz
lahf lar lds lea leave les lfs lgdt lgs lidt lldt lmsw lock lods lodsb
lodsd lodsw loop loope loopne loopnz loopz lsl lss ltr
mov movs movsb movsd movsw movsx movzx mul
neg nop not
oio or out outs outsb outsd outsw
pop popa popad popf popfd push pusha pushad pushf pushfd pushw
rcl rcr rdmsr rdtsc rep repe repne repnz repz ret retf retn rol ror rsdc
rsldt rsm rsts
sahf sal sar sbb scas scasb scasd scasw seta setae setb setbe setc sete
setg setge setl setle setna setnae setnb setnc setne setng setnge setnl
setnle setno setnp setns setnz seto setp setpe setpo sets setz sgdt shl
shld shr shrd sidt sldt smsw stc std sti stos stosb stosd stosw str sub
svdc svldt svts
test
verr verw
wait wbinvd wrmsr
xadd xchg xlat xlatb xor
/C2"Preprocessor"
%cond %out
.186 .286 .286c .286p .287 .386 .386p .387 .486 .486c .486p .586 .586p .686
.686p .8086 .8087 .alpha .dosseg .code .const .cref .data .data? .err .err1
.err2 .errb .errdef .errdif .erre .fardata .fardata? .k3d .lall .lfcond
.list .mmx .model .msfloat .nolist .nolistmacro .radix .sall .seq .sfcond
.stack .type .xall .xcref .xlist
@catstr @code @codesize @cpu @curseg @data @data? @datasize @date @environ
@fardata @fardata? @filename @instr @interface @model @sizestr @stack
@startup @substr @time @version @wordsize
addr align and arg assume at
basic byte
c casemap catstr codeptr codeseg comm comment common compact
dataptr db dd df dosseg dup dq dt dw dword
echo else elseif elseifdef elseifidn elseifidni end endif endm endp ends
epilogue epiloguedef eq equ even exitm export expr32 extern externdef extrn
far far16 far32 farstack flat for forc fortran fword
ge global goto group gt
high highword huge
ideal if if1 if2 ifb ifdef ifdif ifdifi ifidn ifidni ife ifnb ifndef
include includelib instr integer irp irpc
jumps
label large le length lengthof listing local locals lroffset low lowword lt
macro mask masm masm51 medium memory mm2word mmword model multerrs
name near near32 nle nokeyword nolist nolocals noljmp nolocals nomasm51
none nonunique noscoped nosmart not nothing
offset opattr option or org
page para pascal popcontext private proc prologue prologuedef proto ptr
public publicdll purge pushcontext pword
quirks qword
readonly real4 real8 real10 record rept req
sbyte sdword seg segment shl short size sizeof shr small smart stack
stdcall struc struct substr subtitle subttl sword symtype
tbyte textequ this tiny title tword type typedef
use16 use32 uses union
vararg
width word
xor
/C3"Coprocessor"
f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmov fcom fcomp fcompp fcos
fdecstp fdiv fdivp fdivr fdivrp ffree fiadd ficom ficomp fidiv fidivr fild
fimul fincstp finit fist fistp fisub fisubr fld fld1 fldcw fldenv fldl2e
fldl2t fldlg2 fldln2 fldpi fldz fly2x fly2xp1 fmul fmulp fnclex fninit fnop
fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan fqrt frndint frstor
fsave fscale fsin fsincos fst fstcw fstenv fstp fstsw fsub fsubp fsubr
fsubrb ftst fucom fucomp fucompp fwait fxam fxch fxtract
/C4
!
%
&
*
+
,
-
// /
>
=
<
|
/C5"Register"
$
?
@@ @b @f
ah al ax
bh bl bp bx
carry? ch cl cr0 cr2 cr3 cr4 cs cx
dh di dl dr0 dr1 dr2 dr3 dr4 dr5 dr6 dr7 ds dx
eax ebx ebp ecx edi edx es esi esp ext0 ext1 ext2 ext3 ext4 ext5 ext6 ext7
extb0 extb1 extb2 extb3
fs
gs
mm mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7
overflow?
parity?
si sign? sp ss
tr3 tr4 tr5 tr6 tr7
xmm xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7
zero?
/C6 MMX 3DNow SIMD
addps addss andnps andps
cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps
cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpps cmpss cmpunordps
cmpunordss comiss cvtpi2ps cvtps2pi cvtsi2ss cvttps2pi cvttss2si cvtss2si
divps divss
emms
femms fxrstor fxsave
ldmxcsr
maskmovq maxps maxss minps minss movaps movd movdf movdt movhps movhlps
movlhps movlps movmskps movntps movntq movq movss movups mulps mulss
orps
packssdw packsswb packuswb paddb paddd paddsb paddsw paddusb paddusw paddw
pand pandn pavgb pavgusb pavgw pcmpeqb pcmpeqd pcmpeqd pcmpeqw pcmpgtb
pcmpgtd pcmpgtw pextrw pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax
pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfsqit1 pfrsqrt pfsub pfsubr pi2fd
pinsrw pmaddwd pmaxsw pmaxub pminsw pminub pmovmskb pmulhrw pmulhuw pmulhw
pmullw por prefetch prefetchw prefetchnta prefetcht0 prefetcht1 prefetcht2
psadbw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb
psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw
punpckldq punpcklwd pxor pshufw
rcpps rcpss rdpmc rsqrtps rsqrtss
sfence shufps sqrtps sqrtss stmxcsr subps subss syscall sysret
ucomiss unpckhps unpckps unpcklps
xmmword xorps
2. 通过 %appdata%IDMCompUltraEditWordfiles 查找 .uew文件保存位置
3. 确定位置后,将步骤1保存的文档移动到步骤2的位置,重启UE
五、参考文献
[1] 汇编语言编译环境搭建
[2] 《在Win10下使用DOSBox+MASM32工具包搭建汇编环境》
再次感谢 博文[3] 中免费提供的下载链接