汇编教程.docx
《汇编教程.docx》由会员分享,可在线阅读,更多相关《汇编教程.docx(25页珍藏版)》请在冰豆网上搜索。
汇编教程
单击菜单文件à新建文件或按快捷键Ctrl+N,在代码编辑窗口中键入如下的代码:
(注意大小写敏感)
完成后我把代码保存为F:
\backupDoc\test.asm,然后再单击菜单构建。
如果大家还记得的话,就知道这是编译、连接、运行一次搞定的选项,当编译
路径没有配置错误,程序即会进行编译、连接和运行。
至于汇编代码我就不解析了,也不是本教程的范围。
如果编译期间发生了错误,则可以在输出窗口中查看错误提示,一般第一次的错误都是没有设置好Masm32的路径。
如果没错的话RadAsm会显示整个编译和连接的过程,如上面的程序就输出如下信息:
F:
\Asm\masm32\Bin\ML.EXE/c/coff/Cp/nologo/I"F:
\Asm\masm32\Include""F:
\backupDoc\test.asm"
Assembling:
F:
\backupDoc\test.asm
F:
\Asm\masm32\Bin\LINK.EXE/SUBSYSTEM:
WINDOWS/RELEASE/VERSION:
4.0/LIBPATH:
"F:
\Asm\masm32\Lib""F:
\backupDoc\test.obj"
Microsoft(R)IncrementalLinkerVersion5.12.8078
Copyright(C)MicrosoftCorp1992-1998.Allrightsreserved.
Executing:
"F:
\backupDoc\test.exe"
Makefinished.
Totalcompiletime1693ms
好了,我们现在打开RadAsm,单击菜单文件——新建工程,在弹出的对话框中设置好工程名和工程的类型,如下图所示:
由于工程类型的选择影响到整个程序的编译和连接,所以大家在选择时不可以随便选一个类型就完事了。
下面列出几个常用的工程类型:
1:
如果要开发一个带有资源的标准窗口程序,则选择Win32App类型,
假如程序要用到对话框、图标、菜单、快捷键等的话就应该选择这个类型。
2:
如果要开发一个没有资源的标准窗口程序,则选择Win32App(NoResource)类型,一般不用资源的情况很少,但本节用来测试的例子就是一个没有资源的标准窗口程序。
3:
如果要开发一个Windows下的控制台程序,则应选择ConsoleAPP。
4:
如果只开发一个Dll,则应选择Dllproject类型。
设置好后单击“下一步”按钮;现在程序问你是否使用模板,这要看具体做什么程序了,如建立标准窗口程序可以使用“WIN32EXE.tpl”模板,对话框程序可以使用“DialogApp.tpl”模板。
当然可以不使用模板,我们现在就这么做,在模板选项中单击“None”选项,然后单击“下一步”按钮。
来到这里我们可以设置需要那些类型的文件和文件夹,当然,“ASM”文件是必选的,其它有用的选项我们在讲解对话框程序时再述。
再次单击“下一步”按钮,设置如上图所示。
好了,大家都可以看到工程向导到这里就完成了,单击“完成”按钮吧。
现在工程就建立完成了,是不是很容易?
嗯!
现在看看开发窗口右边的工程管理器窗口,我们刚才建立的工程生成了一个“Test.Asm”文件,该文件就是主代码文件了,我们可以双击它来打开代码编辑窗口:
现在把代码粘贴过来,如果格式不好自己再整理一下;考虑到有些朋友手头上暂时没有该例子的代码,没有的朋友可以直接复制下面的文本到RadAsm的代码编辑窗口中:
.const
IDD_DLG_MAINequ1000
IDC_EDT_OUTPUTequ1003
IDC_EDT_FIRSTequ1001
IDC_EDT_SECONDequ1002
IDC_BTN_OUTPUTequ1007
IDC_BTN_EXITAPPequ1008
.data
szExitAppdb"你真的要退出程序吗?
",0
szTitledb"对话框程序",0
;将两个字符串合并为一个的格式化字符串。
szFormatdb"%s%s",0
hInstancedd?
;程序实例句柄
.code
DlgProcprocusesebxesiedihwnd,uMsg,wParam,lParam
;定义了三个局部数组,类型均为字节型
LOCAL@szBuffer1[256]:
byte
LOCAL@szBuffer2[256]:
byte
LOCAL@szOutputBuf[512]:
byte
moveax,uMsg
.ifeax==WM_INITDIALOG
;这里编写窗口初始化的代码,下面是将三个局部数组清零
invokeRtlZeroMemory,addr@szBuffer1,sizeof@szBuffer1
invokeRtlZeroMemory,addr@szBuffer2,sizeof@szBuffer2
invokeRtlZeroMemory,addr@szOutputBuf,sizeof@szOutputBuf
.elseifeax==WM_COMMAND
moveax,wParam
.ifax==IDC_EDT_FIRST
;这里编写处理第一个文本框的代码
.elseifax==IDC_EDT_SECOND
;这里编写处理第二个文本框的代码
.elseifax==IDC_BTN_OUTPUT
;先获取两个文本框的文本,分别保存在@szBuffer1和@szBuffer2中
;然后通过格式化函数wsprintf将两个文本合并,最后输出到第三个文本框中。
invokeGetDlgItemText,hwnd,IDC_EDT_FIRST,addr@szBuffer1,sizeof@szBuffer1
invokeGetDlgItemText,hwnd,IDC_EDT_SECOND,addr@szBuffer2,sizeof@szBuffer2
invokewsprintf,addr@szOutputBuf,addrszFormat,addr@szBuffer1,addr@szBuffer2
invokeSetDlgItemText,hwnd,IDC_EDT_OUTPUT,addr@szOutputBuf
.elseifax==IDC_BTN_EXITAPP
invokeSendMessage,hwnd,WM_CLOSE,0,0
.endif
.elseifeax==WM_CLOSE
;这里处理程序退出代码
invokeMessageBox,hwnd,addrszExitApp,addrszTitle,MB_ICONQUESTIONorMB_YESNO
.ifal==IDYES
invokeEndDialog,hwnd,NULL
.endif
.else
moveax,FALSE
ret
.endif
moveax,TRUE
ret
DlgProcendp
;程序入口点
start:
;获取实例句柄
;invokeGetModuleHandle,NULL
movhInstance,eax
;调用对话框函数来显示对话框。
invokeDialogBoxParam,hInstance,IDD_DLG_MAIN,NULL,offsetDlgProc,NULL
invokeExitProcess,NULL
endstart
现在右键单击“Test.Rc”,在弹出的菜单中选择“新建”——“对话框”菜单,如下图所示:
紧跟着会弹出一个要求保存对话框资源文件的对话框,双击“Res”文件夹,我们把对话框资源文件保存在里,在文件名中填上“Test”作为资源文件名。
之后程序会自动切换到资源编辑界面,这里就是RadAsm自带的资源编辑界面了,好了,相信大家对这个环境还是比较熟眼的,下面就是添加和修改各控件的属性了,先修改对话框本身吧,设置如下的属性:
对话框属性名
设置值
Name
IDD_DLG_MAIN
Caption
对话框程序
MaxButton
False
Font
Tahoma
StartupPos
CenterScreen
其它的属性默认即可。
接着我们添加三个文本框、三个标签、两个按钮,分别设置如下属性:
文本框1属性名
设置值
Name
IDC_EDT_FIRST
AutoScroll
Horizontal
-------------------------
文本框2属性名
设置值
Name
IDC_EDT_SECOND
AutoScroll
Horizontal
-------------------------
文本框3属性名
设置值
Name
IDC_EDT_OUTPUT
AutoScroll
Both
MultiLine
True
-------------------------
标签1属性名
设置值
ID
-1
Caption
第一个字符串:
-------------------------
标签2属性名
设置值
ID
-1
Caption
第二个字符串:
-------------------------
标签3属性名
设置值
ID
-1
Caption
输出字符串:
-------------------------
按钮1属性名
设置值
Name
IDC_BTN_OUTPUT
Caption
输出(&O)
-------------------------
按钮2属性名
设置值
Name
IDC_BTN_EXITAPP
Caption
退出(&E)
整个对话框最后设计成下图所示:
如果想预览一下对话框的运行效果可以单击工具栏上的按钮来进行。
整个界面设计好后别忘了保存,直接按“Ctrl+S”就可以。
好了,现在就等着你按下“Alt+F5”了,如果一切顺利的话立即可以看到程序运行,如下图所示:
程序的功能是先获取两个文本框的文本,然后通过单击“输出”按钮来一并输出到第三个文本框中
RadASM使用说明[原创]
RadASM使用说明[原创]
操作方面:
一、书签:
SHIFT+F8为所在行下书签或删除书签,可通过编辑\书签\开关书签。
(CRTL+F8为下一书签,F8为上一书签)
二、列选择:
拉框时用到,CRTL+B为切换行&列拉框。
三、展开&关闭模块&显示行号:
CRTL+E为展开和关闭模块,在左下脚2&3小按钮是展开全部和关闭全部的方式,1是显示行号。
四、显示API的函数原型
当光标碰到一个函数名称时,可显示一个函数的原型,用视图\信息工具打开即可。
五、输出窗口
可通过视图\输出窗口或点击标题栏上的图标即可。
六、全屏显示:
通过CRTL+W切换。
七、锁定文件:
在文件树中,可鼠标右键锁定&解锁文件。
八、新建项目:
当创建一个项目时,可通过向导的倒数第2步会出现“导入”按钮,来导入已有的文件(如图标等),然后在文件组中,右键\导入\文件即可,可通过工程组(右键文件树)对文件进行分类。
九:
设置工程的保存位置&文件关联
设置工程的保存位置:
通过选项\设置路径Projects,文件关联:
在文件夹选项\文件类型选项卡里设置(关联.asm和.rap)
十:
断点设置:
(程序运行时才会起作用CRTL+SHIFT+F5)
A:
在工程选项中把“发行”改成“调试”
B:
在文件定义的最后加上includeE:
\RadASM\Masm\Inc\RADbg.inc
C:
ALT+F8为设置&清除断点,通过编辑\断点可全部清除断点
D:
当断点没有反映时可能是LINK时依赖的资源文件不存在造成的(通过工程选项中可设置LINK)
工程\工程选项:
(只推荐几个常用的)
Compile(编译资源文件):
4,O,$B/RC.EXE/v/I"$I",1(4代表最终输出的RES文件名)
Assembly(汇编asm为机器码):
3,O,$B\ML.EXE/c/coff/Cp/Zi/nologo/I"$I",2(3代表最终输出的OBJ文件名)
Link(连接文件并生成PE文件):
5,O,$B\LINK.EXE/SUBSYSTEM:
WINDOWS/DEBUG/VERSION:
4.0/LIBPATH:
"$L"/OUT:
"$5",3,4(/OUT:
"$5"PE文件名)
Run(运行文件):
0,0,,5(5代表运行的文件名)
Runw/debug(调试运行):
0,0,"$E\OllyDbg",5(5代表调试运行的文件名)
生成PE文件的顺序:
1:
Compile(编译资源文件)SHIFT+F5
2:
Assembly(汇编asm为机器码)F5
3:
Link(连接文件并生成PE文件)SHIFT+ALT+F5
4:
Run(运行文件)SHIFT+CRTL+F5
5:
Runw/debug(调试运行)CRTL+D
OTHER:
1。
选项\设置路径:
可设置相应的路径。
2。
OllyDbg中可设置OD相关路径:
选项\界面选项\目录选项卡。
如何配置RadASM来支持你的编译器
cao_cong
这两天打算配置一下RadASM来支持一下LCC-Win32和TurboC++3.0,虽然以前给RadASM配置过支持VC6的Cpp文件,但当时做完就没管了,我这人又比较懒,不愿写东西,导致现在再配置时很多东西都忘了。
这次只好又重新研究了一番,费时费力。
配置完LCC后真有点筋疲力尽,不管别的了,先把配置的过程写下来,一是以后要用时可以看看,二也希望写出来让大家看了也能对配置编译器的过程清楚一点,可以自己动手来配置RadASM支持自己喜欢的编译器。
TurboC++3.0的配置我已经不太想继续干了,谁有兴趣配置好了的话别忘了给我发一份。
在配置一个编译器之前,首先你要了解你所用的编译器编译、连接、资源编译程序的命令行选项,这样你配置时才能有的放矢。
要知道相关程序的命令行选项的话你只需在命令提示符中输入相关程序就可得到。
我一般喜欢在后面加一个/?
参数。
如这样:
lcc.exe/?
。
在控制台窗口中右击鼠标,把显示的命令行选项全选后复制到新建的一个文本文件,以便参考。
我这次就以我配置的LCC编译器支持文件来作为模板,对各个部分进行讲解,可能比较罗嗦,主要还是想说清楚一点,让大家少走弯路。
有什么说得不对的地方还请大家指正。
另外我在配置时RadASM中提到的菜单及选项等都是基于我自己汉化的RadASM来谈的,如果给你造成了什么歧义的话,还请多多原谅。
不浪费大家时间了,下面进入正题:
在开始之前,我把LCC-Win32的命令行选项列出来(我都翻译过了),以便大家对照:
-------------------------------------------------------------------------
lcc.exe(编译程序)命令行:
选项含义
-A激活所有警告.
-ansic禁用lcc-win32的语言扩展.
-DD后面跟随定义的符号.例如:
-DNODEBUG定义
NODEBUG符号.注意:
在D和符号间没有空格
-check检查给定源文件的错误.不生成目标文件.
-E生成一个中间文件及预处理程序输出.输出文件名将根据输入文件名来生成,如,编辑foo.c你将得到foo.i.
-E+类似于-E选项,还会生成一个#行号xxx指令,预处理程序生成一个#xxx指令.
-EP类似-E选项,但不生成#行号指令.
-errout=附加警告/错误信息到指定的文件.如-errout=Myexe.err.将把所有警告和错误信息附加到Myexe.err中。
-eN设置最大错误数N.例如:
-e25.
-fno-inline忽略内联指令.
-Fo<文件名>强制输出文件名.
-g2生成调试信息.
-g3支持函数堆栈跟踪.如果遇到一个中断,将显示函数堆栈.
-g4支持函数堆栈及行号跟踪.
-g5支持函数堆栈,行号及返回调用堆栈崩溃跟踪.
-I把一个路径添加到包含的路径,如编译器查找头文件的路径.例:
-Ic:
\project\headers.注意在I和后面跟随的路径之间没有空格.
-libcdll使用用于lcclibc.dll的声明.用此选项编译的文件要在连接器lcclnk中使用-dynamic选项.
-M在标准输出中显示当处理给定的输入文件时预处理程序打开的所有文件.不生成目标文件.
-M1在标准输出中递归显示每个include文件,指出其调用自何处,何时关闭.
-nw不显示警告.错误仍将显示.
-O优化输出.这将启动peephole优化器.
-o<文件>用于给定输出文件的名称.与上面的Fo参数相同.
-overflowcheck
生成代码测试所有加,减,乘的溢出.
-p6启用PentiumIII指令
-profile注入代码到已生成的程序中来测试执行时间.此选项不兼容调试级别高于2的程序.
-S生成一个汇编文件.输出文件名依赖于输入文件.如:
编辑foo.c你将得到foo.asm.
-sn设置转换密度为n,值必须在0.0和1.0之间.如:
-s0.1
-shadows当一个本地变量覆盖了一个全局变量时警告.
-stackinitn
函数入口值为"n"时初始化未初始化的堆栈.
-U未定义符号跟随在U后面.
-unused警告未使用的分配并禁止垃圾代码.
-v显示编译器版本和编辑日期
-z生成一个LCC中间语言的文件.生成的文件以.lil为扩展名.
-Zp[1,2,4,8,16]设置结构的默认队列为一,二,四,等.
如果你设为一,实际上等于无队列.
-------------------------------------------------------------------------
命令行选择区分大小写.使用"-"或"/"在
命令行中引入选项.
-------------------------------------------------------------------------
lcclnk.exe(连接程序)命令行:
Lcclnk命令行选项.使用"-"或"/"在命令行中引入选项.
-o<文件名>
设置输出文件名称.请在o和文件名间插入一个空格.
-errout<文件名>
把所有警告/错误信息写入到指定名称的文件.
-subsystem
指出输出文件类型.Console或windows程序
-stack-commit<数字>
选择此选项,你可以提交多于一个的页面(4096字节).
-stack-reserve<数字>
默认堆栈大小为1MB.用此选项改变限制.
-dynamic
使用lcclibc.dll作为默认库并动态链接到程序,用以代替连接到libc.lib.
-dll
此选项告诉连接程序这是一个.dll文件而不是一个.exe文件.
-map<文件名>
指定map文件名.此选项不兼容-s选项.
-nolibc
不包括标准C程序库.
-s
从程序中去除所有符号和调试信息.
-versionnn.nn
为程序添加版本号.
-errout=<文件名>
写入所有警告或错误到给定名称的文件.注意在文件名和等号间没有空格.
-nounderscores
例如创建一个用于VisualBasic的DLL时,最好DLL的输出函数名没有下划线.
-entry
设置DLL的入口点函数
-version
输出版本名称
-------------------------------------------------------------------------
lcclib.exe(编译库(Lib)的工具)命令行:
格式:
lcclib<目标文件>
选项:
/out:
输出文件
/extract:
目标
/remove:
目标
/verbose:
显示输出过程
默认同名的目标文件将被替换
-------------------------------------------------------------------------
lrc.exe(编译资源脚本的程序)命令行:
用法:
lrc[选项].RC输入文件
选项:
/r:
生成.RES文件.这是预设好的...
/v:
显示细节(Verbose)
/z:
生成一个.map文件.名称依赖于输入文件
/d:
定义符号
/o:
输出到指定文件.
'o'和文件名间没有空格
/fo:
输出到指定文件.
'o'和文件名间没有空格
/l:
默认语言号
后面应立即跟随十进制的语言号.'l'和语言号之间没有空格
/i:
添加一个include路径.
'i'和路径间没有空格
/a:
写打包文件(图标,位图,等等)
选项不区分大小写
-------------------------------------------------------------------------
配置一个让RadASM支持的编译器只需写一个INI文件,把各个段配置好。
配置好后放在RadASM目录,直接在RadASM的菜单选项->编程语言中把你的配置文件添加进去就可以了。
我这里把配置的文件命名为Lcc.ini,我把每个段都列出来(列主要我们要配置的部分),各个段的含义我在每个列出的段后用“//”开头的注释说明。
[Description]
1=LccWin32
//这个段是对你配置的编译器描述,你可以随便写。
[Enviroment]
1=path,C:
\Lcc\Bin;
//这相当于环境变量,RadASM会到path后面指定的路径查找相关程序。
[CharTab]
2=0251222522222236;20-2F
3=1111111111222221;30-3F
//字符表定义,0到127的默认字符表,与我们没多少关系,随便在RadASM中找一个配置好的编译器支持文件复制过来就行了。
[Open]
0="C++文件(*.c;*.cpp;*.h),*.c;*.cpp;*.h"
1="资源文件(*.rc),*.rc"
2="文本文件(*.txt),*.