实验一 RedASM编译器的使用
实验1-汇编器的使用及调试
用编辑软件一个简单的例子程序如下,存为test.asm (为方便将文件存 入汇编器目录下)
• • •
• • • • • • • • • • • • • • • • • • •
DATA SEGMENT var dw 1234h DATA ENDS
CODE SEGMENT ASSUME CS:CODE, DS:DATA .386 MAIN: MOV AX, DATA MOV DS, AX ;将数据段DATA段首址赋值给DS MOV AX, 2345h MOV BX, 3456h MOV CX, 4567h AND AX, 0FF0h AND BX, 0Fh AND CX, 0F000h OR AX, BX OR AX, CX MOV var, AX mov ax, 4c00h INT 21H CODE ENDS END MAIN
CODE
mov ax, 4c00h INT 21H ENDS
• 7)在调试程序中输入单步执行命令 t
• 8)多次输入单步执行命令 t,执行到最后,再输入”d 0”,
查看内存地址为0的开始的若干内存的值,如下:
• 9)输入退出命令 q, 退出调试程序。
• 用汇编程序MASM汇编上述的汇编语言源程序 1)运行cmd,打开命令行界面,如下:
2)键入”cd masm615” 命令,将当前目录调整到汇编器所在 的目录,如下:
3)键入”masm test.asm” 汇编命令,汇编源文件test.asm, 汇编完成后,在masm615目录下就出现了一个test.obj文件
• 4)键入”link test.obj” 链接命令,将目标文件test.obj链接 成一个可执行程序test.exe
其中会要求你输入文件名,直接回车,生成默认文件 输入其他文件名
RedASM编译器的使用简介1
RedASM编译器的使用简介1.编译器的设置本次实验采用汇编语言进行设计。
使用RedASM进行汇编程序的编译与调试。
具体设置如下:单击“新建工程”菜单选择“Dos App”,单击“下一步”单击“下一步”单击“下一步”按照上面的复选框钟的选择,单击“完成”双击右边黄色区域的文件,即可在灰色区域进行程序的输入了。
而程序的编译、连接、构建和调试等全部在“构建(W)”菜单里。
2.DOS中断调用程序的调试在编辑区输入下面的源程序,然后利用构建菜单里的“构建并运行”可以看到结果!;****************************;;* 简单汇编语句的使用*;;* 红色斜字体部分不要改动*;;****************************;data segmentx db 1000 dup(0)data endssseg segment stackdata1 db 100 dup(?)sseg endscode segment 'code'assume cs:code,ds:data,ss:ssegstart:;下面是汇编语句编辑部分MOV AX,1234HMOV SI,100HMOV [SI],AXexit: mov ah,4chint 21hcode endsend start3.调试状态下参数的说明在程序顺利通过构建后,才可以进行源程序的调试及分析,否则要依照提示修改错误!!!!选择菜单“在调试器中运行”,如下图所示:(1)寄存器状态选择“windows->Register”,可以看到如下窗口:ZR-零标志位 OV-溢出标志位 CY-进位标志位 AC-辅助进位标志位NG-符号位 PE-奇偶校验标志位(2)单步执行鼠标点击屏幕上的“ <Step>”,注意观察右边寄存器的值的变化!当运行到“MOV AH,4C”语句时一定要停止单步执行,如下图所示:(3)观察存储器的值选择“windows->Memory 1”,可以看到如下窗口:再选择“windows->Maximize”,可以看到如下窗口:可以清楚得看到在“0A73H:0100H”逻辑地址处放入了“1234H”这个数据!!!。
汇编教程7:RadAsm使用教程
汇编教程7:RadAsm使⽤教程最近深圳的天⽓真的⾮常热,对我个⼈来说、我从没有感觉过深圳有那么热。
现在已经到35°了,⾮常热。
⽽且我在深圳这边的租房条件差,诶空⽓流通不好、弄的我现在连家都不敢回。
即使回家也谈不上学习了、太热了。
这⾥同时再发发牢骚,深圳这边的消费实在是太⾼了,在关内租房⼀个不⾜20平⽅⽶的地⽅就2000⼀个⽉,消费⾼也就算了,这⼏年消费⾼了,⼯资⼀直都没有跟着增加、实在是有点不想在这待了,听说现在浙江那边还可以,不知道是不是真的。
好了,吹⽜就到这吧。
下⾯看看我们今天的话题Radasm使⽤教程。
本来我不想写这个教程的,因为jhkdiy ⼤哥已经写了⼀篇了,名字叫本来我不应该瞎掺合的,可是我发现jhkdiy ⼤哥写的是win32的,并没有提及16位汇编程序的开发(实际上我觉得都差不多),但是为了照顾⼤家的感觉,我还是写⼏篇吧。
⾸先我要说明下,我是不会全部教你怎么弄了,不难,好好参考下jhkdiy ⼤哥写的教程,他已经写的⾮常详细了。
⼤家⼀听说汇编,⽼是以为这是很难,或者是很古⽼的东西,其实正如jhkdiy ⼤哥所说的,汇编也有集成化的IDE开发环境,我个⼈只⽤过Radasm、其他的我觉得不怎么样,特别是现在cao_cong已经发布了打包好的开发环境,让你写汇编程序⾮常省⼼,可以说cao_cong已经为我们做完了⼏乎全部的⼯作,我个⼈对此是⾮常满意的,只是觉得这个汇编IDE还有个⼩bug、在Courier New字体下宋体会显⽰成英⽂,就这点让我⾮常不满意,希望下⼀个版本改进下。
既然是介绍Radasm那么我先告诉⼤家在哪下载,发布的最新版本,是2.2.1.1。
⾥⾯已经有了我们所需要的⼀切东西,甚⾄⾥⾯还带了好⼏篇汇编教程。
界⾯如下:下载安装我就不说了,jhkdiy ⼤哥已经说的⾮常明⽩,我主要和⼤家说说怎么建⽴dos程序、运⾏程序,点击[⽂件]-[新建⼯程] 注意了这⾥要选择Dos App,然后给个⼯程⽂件名,[下⼀步],这⾥选择[标准Dos程序.tpl],就这样,⼀个标准的dos程序就已经给你写好了,然后点击[构建]菜单下的编译和连接,最后点击运⾏,如果看到以下的提⽰表⽰你就安装完成了,就可以继续学习写程序⽽不⽤管怎么编译怎么运⾏了。
教你用RadASM编译《Intel汇编语言程序设计的代码》
话说在控制台上编译汇编程序已经有阵子了,从一开始的兴奋到现在的麻烦。
很想摆脱控制台上的编译,无可奈何的是没人教,没搜索到,因此只能凑合着用。
但在今晚,我解决了,我能摆脱了。
独乐乐不如众乐乐。
所以我写出方法来。
我的这个方法是在我上一篇文章《教你编译Intel汇编语言程序设计》的基础上的。
其实如果看完这两篇文章后,完全可以不用按照我说着的做。
所以你不必觉得麻烦。
第一篇文章的链接在最下面。
1:打开RadASM,选择菜单栏的“选项”,接着点击“路径设置”,然后就是设置路径。
设置路径图如下:“C:\Masm615\nm”是上篇文章中头文件、库、编译器、链接器的存放处。
(我承认我这样做是为了偷懒)2:然后创建个“控制台工程”,如下图:3:接着是一直按下一步,直到创建工程完毕(别按的太快哦,-_- 嘿嘿)。
4:打开窗口,把课本上的代码敲上去。
但我现在提供给你。
include irvine32.incincludelib irvine32.libincludelib kernel32.lib.codemain PROCmov eax, 10000hadd eax, 40000hsub eax, 20000hcall DumpRegsmain ENDPEND main ;希望大家自己把代码敲进去,我不敢保证我输入的符号对5:最后保存,然后按“构建并运行”。
当然,你也可以先按“编译”,“链接”,然后再按“运行”。
最后输出看下图:天啊!啥我就运行不了呢!为什么链接时会出现一个蓝色进度条呢!而且等了半天进度条还没完。
嘿嘿。
千万别在心里说上面句话。
你以为完了吗?其实是完了,只不过我故意不讲,因为我要让你们加深印象。
在第三步创建工程时,我已经很奸诈的笑了。
如果你看第一遍时就边看边做的话,那么我很遗憾的告诉你,你要重新来。
嘿嘿,没办法,只为了加深印象。
创建工程时,不停的按下一步,直到看到下图时就不要再按了。
看到上图的红色框框吗?刚才为什么在链接的时候蓝色进度条一直不停,就是因为LINK.EXE的原因。
使用MASM运行第一个汇编程序全过程
初次使用MASM编译器编写汇编程序的完整过程1.运行 cmd 命令2.输入edit3.进入汇编源码编辑框4.在源码输入框中输入汇编源码并将源程序保存,并拷贝到MASM和LINKER所在的盘符或文件夹下5.在 Dos 环境下进入到 MASM 5.0 汇编编译器所在的目录6.然后运行 masm.exe可以从上面的截图中看到 [. ASM] 的标记,这个标记代表的是需要在这里输入要编译的源程序文件名,这里有一点特别的是,由于默认的文件扩展名为 .asm ,所以在编译 .asm 的汇编源程序时可以不用指定源程序所在文件的扩展名。
7.我们将一开始编辑好的汇编源程序所在的文件输入以进行编译(1)此时可以看到编译器提示需要输入要编译出的目标文件的名称,由于在一开始已经指定了 js.asm,所以编译器自动指定了目标文件的名称为 js. obj 的名称,如果在这里不做修改的话,则编译器会以默认目标文件名称 js. obj 进行输出,在这里我并不改变名称,所以直接按 Enter 键即可;(2)提示需要输入列表文件的名称,其实是完全可以不要让编译器生成这个 LST 文件的,所以也不需要进行输入,直接按 Enter 键即可;(3)提示需要输入交叉引用文件的名称,这里也完全可以不要让编译器生成这个 CRF 文件,所以也不需要进行输入,直接按 Enter 键即可。
至此,汇编源程序编译成功编译得到的结果就是在我的 D:\ 目录下生成了一个 JS.obj 文件8.下面就是要实现对目标文件的连接经过编译操作后,我们得到了一个 .obj 的目标文件,但很显然,这还并不是一个可执行文件,下面就需要对目标文件进行连接,从而得到一个可执行文件。
一般来说,需要准备一个连接器,这里我使用的是微软提供的 Linker 连接器,即LINK.EXE。
9.进入 LINK.EXE 文件所在目录,直接运行 LINK.EXE此时提示需要输入被连接的目标文件的名称,这里也就是JS.obj ,由于我的 JS.obj 和 Link.exe 在同一目录下,所以不需要指定路径,直接给出.obj的名称即可,按Enter 键。
教你用RadASM编译《Intel汇编语言程序设计的代码》
话说在控制台上编译汇编程序已经有阵子了,从一开始的兴奋到现在的麻烦。
很想摆脱控制台上的编译,无可奈何的是没人教,没搜索到,因此只能凑合着用。
但在今晚,我解决了,我能摆脱了。
独乐乐不如众乐乐。
所以我写出方法来。
我的这个方法是在我上一篇文章《教你编译Intel汇编语言程序设计》的基础上的。
其实如果看完这两篇文章后,完全可以不用按照我说着的做。
所以你不必觉得麻烦。
第一篇文章的链接在最下面。
1:打开RadASM,选择菜单栏的“选项”,接着点击“路径设置”,然后就是设置路径。
设置路径图如下:“C:\Masm615\nm”是上篇文章中头文件、库、编译器、链接器的存放处。
(我承认我这样做是为了偷懒)2:然后创建个“控制台工程”,如下图:3:接着是一直按下一步,直到创建工程完毕(别按的太快哦,-_- 嘿嘿)。
4:打开窗口,把课本上的代码敲上去。
但我现在提供给你。
include irvine32.incincludelib irvine32.libincludelib kernel32.lib.codemain PROCmov eax, 10000hadd eax, 40000hsub eax, 20000hcall DumpRegsmain ENDPEND main ;希望大家自己把代码敲进去,我不敢保证我输入的符号对5:最后保存,然后按“构建并运行”。
当然,你也可以先按“编译”,“链接”,然后再按“运行”。
最后输出看下图:天啊!啥我就运行不了呢!为什么链接时会出现一个蓝色进度条呢!而且等了半天进度条还没完。
嘿嘿。
千万别在心里说上面句话。
你以为完了吗?其实是完了,只不过我故意不讲,因为我要让你们加深印象。
在第三步创建工程时,我已经很奸诈的笑了。
如果你看第一遍时就边看边做的话,那么我很遗憾的告诉你,你要重新来。
嘿嘿,没办法,只为了加深印象。
创建工程时,不停的按下一步,直到看到下图时就不要再按了。
看到上图的红色框框吗?刚才为什么在链接的时候蓝色进度条一直不停,就是因为LINK.EXE的原因。
汇编编译器的使用及程序调试 实验报告
将“隐藏已知文件类型的扩展名”选项前的 去掉;
将文件名“firPro.txt”重命名为“firPro.asm”即可。
(1)在“运行”窗口键入“cmd”,回车,打开字符界面,进入masm文件夹下,如图1-3所示;
图1-3进入masm文件夹
(2)键入masm firPro.asm,并回车,如图1-4所示。
(3)汇编语言的调试相对也比较麻烦,需要用到Debug或Deb2000命令,希望掌握常用的Debug或Deb2000选项,能够看懂反汇编的结果。
四、实验软硬件环境:奔腾系列机器,操作系统为Dos或者Windows系列,相关的汇编语言编译工具(MASM、LINK和DEBUG)以及集成编译器。
五、实验步骤和方法:
希望大家在熟悉了最基本的masm、link以及Debug的基础之上再去使用所提供的集成试验环境!
图1-6 link命令的执行
图1-7编译之后出现的可执行文件
图1-8可执行文件的执行结果
图1-9反汇编之后的结果
图1-10反汇编命令U的结果
图1-11推出反汇编的命令
四、实验预习要求:认真阅读实验指导书附录部分的内容,了解最基本的汇编语言的知识,包括8088/8086的体系结构和指令系统,在以后的实验中将会不断的用到相关的指令,在实验课中给出的课件中的相关内容也请大家仔细研读。根据实验过程和实验结果完成实验报告,并按时上交
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,msg ;此处输入代码据段代码
mov ah,9
INT 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
ASM宏汇编使用指导手册
ASM-51宏汇编使用手册ASM-51宏汇編主要川來开发Inter8051系列单片机.它具有宏处理.数据处理•列液处理和条件处理等多种功能。
源程序的编写完全采用Inte「标准助记符和行恪式。
在編写程用过程中.吋借助于文本编辑(Windows的记泉本)或文字处理软件Word等編休经ASM-51汇編后生成列表输出文件(丄ST)和目标代码文件(・HEX)。
此目标代码文件(.HEX)町H接用CZS ・51或MedWin. Keil、Debug8051进行模拟/调试,或宜接用于硬件仿真器上运行•当然.这也是要烧写到单片机ROM中的代码。
1、宏汇編语肓的基本i吾法1、1宏汇編的特点ASM-51宏汇編完全支持Inte「助记符的汇編语育•它含有宏语句.英文人小写字母・变册名.标号等不受限!有二十.十六进制和弗参数类型.有汇編控制播令和多层条件语句.程用逻轲分段.还冇模块化程序设汁的连接功能.汇編速度抉等特点。
r2汇编处理过程(1)用行编辑EDLIN或文字处理软件WS或全屏毎編辑软件PE等.編辑宏江編语言谏程序.它的文件扩展名为。
ASM.(2)用ASM-51宏M褊程序对上述漁程序文件进行汇編.产生扩展名为丄ST的列表输出文件和扩展划为.HEX的目标代码文件(.HEX).列茨输出文件包含淞程序语句所汇編成的代码•以及有关的地址.语句和符号表等.目标代码文件包含源祝序语句所汇编成的代码.不包含任何符号信恩或助记符。
进行模拟/调试.或宜接用于硕件仿真器上运行。
1、3语句汇編语肓可分为两类语句:捋令性语句和描示性语句.(1)描令性语句这一类语句是抬在汇编过程中能生成揣令代码的语句(如MOV • DEC等).其恪式为:[标号:][摇令助记符][操作数][•注释]其中方括号[]中为选择项.卜同。
(2)抬示性语句这一类语句即通帘所说的伪折令•它揣示汇編程序后面的播示性语句如何产生代码.ASM-51宏汇編完全支持Inte「助记符的汇編语乳因此汇編程序的格式.抬令完全号8051订编语肓一样.这屮不再介绍它们的揣令系统。
ASM编程环境的构建和MASM32宏(Macro)的使用
sym db y,0
ENDIF
CONST ends
EXITM <OFFSET sym>
ENDM
这样你就可以用inoke LoadLibrary,CTEXT("KERNEL32.dll")方便地使用了,尤其是代码比较长的时候不用翻来翻去
,定义数据,然后再offset ****了...呵呵.
其他的下面的宏功能基本是一致的.
dsText MACRO name,Text:VARARG
.data
name db Text,0
.code
ENDM
下面这个宏用于在代码段里面定义数据,在链接的时候注意假如/SECTION:.text,EWR否则读写这
类数据会产生非法操作.
szText MACRO name,Text:VARARG
不过这还不是最终的答案我们还可以根据返回的参数进一步优化一下,这是我的优化版本.
return MACRO arg:=<0>
IFIDNI <&arg>,<0>
sub eax,eax
ELSEIFIDNI <&arg>,<1>
xor eax,eax
inc eax
ELSE
mov eax,arg
Part II:MASM32宏(Macro)的使用
如果你已经使用了MASM,那么让我们来看一下masm是什么,masm是MACRO assembler的简称,
你喜欢用Macro吗?用MAcro可以缩短源代码,简化程序的编写,便于理解,而masm的宏还是比较强大
的,虽然有些地方不够贴心和简洁,下面结合我的头文件简单介绍一下几个常用的宏...
实验一 RedASM编译器的使用
实验一 RedASM编译器的使用
一、实验目的
1.熟练掌握RedASM软件的使用方法。
2. 熟练掌握RedASM调试汇编程序的方法。
3. 掌握简单汇编程序的设计方法。
二、实验原理
参考《RedASM编译器的使用简介》。
三、实验设备与器件
PC机一台以及RedASM软件。
四、实验内容
1.按照《RedASM编译器的使用简介》,完成简介材料中的所有内容。
2.参照《RedASM编译器的使用简介》,编写程序计算X+Y,X-Y的值,并将结果放置
在Z变量中,记录运行后内存结果以及符号标志位的值。
(X,Y,Z均为变量)
3.参照《RedASM编译器的使用简介》,编写程序计算X/Y的值,并将商放置在变量
Y1中,余数放在变量Y2中。
规定X,Y均是8位二进制带符号数形式的变量,记录运行后内存结果。
(注意:实验结果不能直接显示在屏幕上,必须通过参看内存状态才能看到结果。
)
五、实验总结(实验报告要求)
1、给出实验中所有调试通过的汇编源程序,并给出实验结果。
2、对实验结果及实验中碰到的问题进行分析、讨论。
3、本次实验的心得体会。
4、必须用实验报告纸书写实验报告。
RadASM中工具ResEd的使用
RadASM中工具ResEd的使用ResEd工具是用来编辑资源的,如:对话框、菜单、工具栏等,那编辑的资源如何在RadASM中调用呢。
下面我来说明一下它的使用。
一、在ResEd内编辑资源1、打开ResEd如图,新建一个工程。
2、在工程里选择“添加对话框”,来添加一个对话框。
3、制作一个对话框资源,保存后备用,保存文件为mynew.rc。
4、制作在RadASM中能用的资源文件。
点击“工程”菜单,选择“另存为RadASM dlg文件,保存dlg文件为mynew.dlg。
二、RadASM工程中使用ResEd编辑的资源文件5、在RadASM新建工程文件为:DialogAsMain.tpl文件格式,要不程序会出现问题,这跟对话框的模式有关。
6、把做好的mynew.rc和mynew.dlg两个文件拷贝到RadASM工程文件夹内。
在工程内导入资源文件mynew.dlg文件。
7、在WM_COMMAND中增加自己的调用函数Id为IDC_MYOK:elseif eax==WM_COMMANDmov eax,wParamand eax,0FFFFh.if eax==IDM_FILE_EXITinvoke SendMessage,hWin,WM_CLOSE,0,0.elseif eax==IDM_HELP_ABOUTinvoke ShellAbout,hWin,addr AppName,addr AboutMsg,NULL .elseif eax==IDC_MYOKinvoke CreateDialogParam,hInstance,IDD_DLG1,hWin,addr myDlgProc,FALSE8、增加一个自定义过程myDlgProc。
myDlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM LOCAL hCtl:DWORDmov eax,uMsg.if eax==WM_INITDIALOGmov eax,hWin.elseif eax==WM_COMMANDmov eax,wParammov edx,eaxshr edx,16and eax,0FFFFh.if eax==IDC_BTN1invoke SendMessage,hWin,WM_CLOSE,NULL,NULL.endif.elseif eax==WM_CLOSEinvoke EndDialog,hWin,NULL.elsemov eax,FALSEret.endifmov eax,TRUEretmyDlgProc endp9、在Inc文件里添加过程声明myDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD添加对话框按钮资源IDIDD_DIALOG equ 1000 ;主对话框IDD_DLG1 equ 2000 ;ResEd编辑的资源对话框IDC_MYOK equ 1001 ;主对话框内定义的按钮IDC_BTN1 equ 1002 ;ResEd编辑的资源对话框内定义的按钮。
实验一 汇编系统软件的使用
汇编语言实验报告(一)班级:01540802班姓名:南征学号: 20080705信息与电子学院实验一汇编系统软件的使用一、实验目的熟悉将汇编源程序,通过编辑、汇编、连接生成可执行程序的全过程,并利用调试程序对可执行程序进行单步和断点调试,并理解汇编指令运作过程。
二、实验步骤及结果1.编辑源程序利用编辑程序EDIT建立和修改源程序。
EDIT是PC DOS向用户提供的一个系统程序,在EDIT全屏幕编辑状态下,可以利用好鼠标直接点击来选取相应命令;如果没有鼠标,主菜单的选择是用ALT+主菜单选项的第一个字母;子菜单可通过 选取,或直接选取相应的反白字母。
(1)键入EDIT EXAM.ASM(其中EXAM为主文件名)即可进入EDIT全屏幕白年纪状态,输入下列源程序:(不输入列号)DATA SEGMENTBUF1 DB 0,1,2,3,4,5,6,7,8,9,0AH,0BH,0CH,0DH,0EH,0FHTAB DB '0123456789ABCDEF'BUF2 DB 20 DUP(?)DATA ENDSSTACK SEGMENTDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV SI, OFFSET BUF1MOV DI, OFFSET BUF2MOV CX,10HAGAIN: MOV AL,[SI]MOV [DI],ALINC SIINC DIDEC CXJNZ AGAINMOV AH,4CHINT 21HRETMAIN ENDPCODE ENDSEND MAIN(2)利用鼠标点击FILE,再点击SAVE即可存盘。
如果没有鼠标,可利用ALT+F选择菜单的FILE,可弹出下拉式菜单,移动光标到SAVE并回车,即可将文件存入当前路径。
如何配置RadASM来支持你的编译器
如何配置RadASM来支持你的编译器如何配置RadASM来支持你的编译器cao_cong这两天打算配置一下RadASM来支持一下 LCC-Win32 和 Turbo C++ 3.0,虽然以前给 RadASM 配置过支持VC6的Cpp文件,但当时做完就没管了,我这人又比较懒,不愿写东西,导致现在再配置时很多东西都忘了。
这次只好又重新研究了一番,费时费力。
配置完LCC后真有点筋疲力尽,不管别的了,先把配置的过程写下来,一是以后要用时可以看看,二也希望写出来让大家看了也能对配置编译器的过程清楚一点,可以自己动手来配置RadASM支持自己喜欢的编译器。
Turbo C++ 3.0 的配置我已经不太想继续干了,谁有兴趣配置好了的话别忘了给我发一份。
在配置一个编译器之前,首先你要了解你所用的编译器编译、连接、资源编译程序的命令行选项,这样你配置时才能有的放矢。
要知道相关程序的命令行选项的话你只需在命令提示符中输入相关程序就可得到。
我一般喜欢在后面加一个/? 参数。
如这样:lcc.exe /? 。
在控制台窗口中右击鼠标,把显示的命令行选项全选后复制到新建的一个文本文件,以便参考。
我这次就以我配置的LCC编译器支持文件来作为模板,对各个部分进行讲解,可能比较罗嗦,主要还是想说清楚一点,让大家少走弯路。
有什么说得不对的地方还请大家指正。
另外我在配置时RadASM中提到的菜单及选项等都是基于我自己汉化的RadASM来谈的,如果给你造成了什么歧义的话,还请多多原谅。
不浪费大家时间了,下面进入正题:在开始之前,我把LCC-Win32 的命令行选项列出来(我都翻译过了),以便大家对照:-------------------------------------------------------------------------lcc.exe(编译程序) 命令行:选项含义-A 激活所有警告.-ansic 禁用lcc-win32的语言扩展.-D D后面跟随定义的符号. 例如:-DNODEBUG 定义NODEBUG 符号. 注意: 在D和符号间没有空格-check 检查给定源文件的错误. 不生成目标文件.-E 生成一个中间文件及预处理程序输出.输出文件名将根据输入文件名来生成, 如,编辑 foo.c 你将得到foo.i.-E+ 类似于 -E 选项, 还会生成一个#行号 xxx 指令,预处理程序生成一个 # xxx 指令.-EP 类似 -E 选项,但不生成 #行号指令.-errout= 附加警告/错误信息到指定的文件.如-errout=Myexe.err.将把所有警告和错误信息附加到 Myexe.err 中。
32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式
32位汇编第三讲,RadAsm,IDE的配置和使⽤,以及汇编代码注⼊⽅式 32位汇编第三讲,RadAsm,IDE的配置和使⽤,以及汇编代码注⼊⽅式⼀⼂RadAsm的配置和使⽤简介:2020.4.29 添加更正内容更正内容: 如果只想看RadAsm配置以及使⽤,可以查看新版配置当前博客讲解的是旧版的设置.下⾯内容介绍了⼀个注⼊.注⼊可以学习⼀下.使⽤RadAsm编写正⽂:⽤了怎么长时间的命令⾏⽅式,我们发现了⼏个问题1.没有代码提醒功能2.编写代码很慢,记不住各种声明那么现在有⼤神,已经帮我们做了⼀个IDE环境,就是RadAsm,⾸先简单介绍⼀下界⾯(对于这个IDE(最新版是3.0)我已经打包好了,有中⽂版本,和英⽂版本)我们需要配置⼀下环境1.配置编译环境,配置lib⽂件库,配置Debug调试器打开后会弹出1.1 配置调试器路径⾸先这⾥我们注意下⾯的⼏个选项1.编译选项 Assemble : 这个是默认的即可,如果你是编译32位程序,那么我们就⽤ /c /coff 即可,后⾯⼏个默认2.连接选项 link: ⼀般是默认的,他是默认⽣成windows的程序,如果我们有控制台的程序,那么我们可以⼿⼯去编译,也可以通过它的项⽬,新建项⽬的时候选择指定的3.扩展的调试器External debugger: 这个则配置我们od所在的路径即可,3.0版本已经可以⽀持选择调试器了,以前的版本则是你指定⽂件夹,默认的调试器是Ollydbg.exe,所以我们名字还要改为这个才可以4.library: 库的路径,有时候你编写汇编程序,会使⽤lib库,也会使⽤inc⽂件,那么可以把我们昨天的MASM32的库路径放到这⾥,也可以⽤⾼版本的,⽐如vc++6.0的,或者vs系列的都是可以的注意: 上⾯配置的编译选项,以及连接选项,我们都是安装的MASM32的,也就是昨天提供的⼯具,我们把它的路径设置为环境变量,这样就可以⽤编译的指令了,例如 /c /coff ....,如果你没有安装,或者没有配置环境变量,那么计算机就会找不到编译器,进⽽你的/c /coff就是错误的,所以我们还需要设置环境变量1.2 RadAsm 3.0版本设置环境变量 上⾯我们已经设置了调试器.下⾯我们设置环境变量点击 Option -> Environment弹出界⾯可以看到有三个路径:path include lib分别加上我们的MASM ⽬录即可.例如Path你的Masm路径\bininclude 路径lib 路径同上建议使⽤Radasm 3.0 虽然是英⽂版.都是单词都很简单. 以前的我⽤了下有Bug. 例如程序运⾏之后不关闭.2.RadAsm的字体设置,以及中⽂乱码问题解决关于RadAsm的字体,以及中⽂乱码,⽹上有很多解决⽅法,这⾥我只对当前最新版本的RadAsm3.0做⼀个讲解选择代码编辑从上往下看1.第⼀个红框,选择的是Masm的背景颜⾊,以及主题,这个可以⾃由设置不多做讲解2.第⼆个红框,Tab Size 4,这⾥是编写汇编代码的时候Tab制表符,的距离,我们可以设置为2个3.第三个红框,分别有个Code(代码按钮),和Line Number(⾏号的按钮)这⾥则是设置代码字体的⼤⼩,还有⾏号显⽰的⼤⼩⾸先中⽂乱码问题,打开code(代码编辑)在这⾥设置代码字体的时候,⼀定注意要把下⾯的语⾔换成 ""中⽂ GB2312 " ⽽不是默西欧语⾔选择了即可解决中⽂乱码的问题三⼂建⽴RadAsm⼯程,以及编译编译连接,和调试1.打开 Project(项⽬) - > new Project(新建项⽬)2.选择项⽬编译的语⾔,(这⾥我使⽤masm),选择项⽬⽣成的路径默认即可编写我们的第⼀段代码,并且调试输出1,编译连接⼀起执⾏,快捷键是Ctrl + F5 编译运⾏1.编译快捷键是 F5 会⽣成obj中间⽂件3.链接快捷键是 Ctrl + Alt + F5 将obj⽂件⽣成exe4. 编译并连接 shift + alt + f5 直接将编译连接在⼀起了.4.调试快捷键是 Ctrl + D 它会默认打开我们的OD调试器,并且附加我们的程序,我们试⼀下打开了我们的OD调试器,并且开始调试了打开了我们的OD调试器,并且开始调试了其余功能,⾃⼰尝试,如果不会配置,也可以在下⽅评论,那么我看到则会帮你解决,然后如果有好⼼⼈看到也会帮你⼀把⼆⼂汇编程序的注⼊代码,注⼊32位计算机,并且弹出个信息框⼀⼂远程线程注⼊的讲解在讲解汇编程序注⼊代码的时候,我们需要先明⽩,远程线程注⼊的原理,我会写⼀个远程线程开发的例⼦,这样有助于我们理解汇编注⼊我们总共需要⼏步/*1.查找窗⼝,获取窗⼝句柄*//*2.根据窗⼝句柄,获得进程的PID*//*3.根据进程的PID,获得进程的句柄*//*4.根据进程的句柄,给进程申请额外内存空间*//*5.调⽤WriteProcessMemory,给进程写⼊DLL的路径*//*6.创建远程线程,执⾏我们的代码*//*7.调⽤退出代码,释放远程线程的dll*/每⼀步单独讲解我们新建⼀个MFC 对话框程序,添加⼀个按钮,这个按钮专门响应注⼊的实现第⼀步: 查找窗⼝,获得窗⼝句柄(采⽤WindowsAPI FindWindow,传⼊窗⼝名称,然后找到则返回对应的窗⼝句柄)HWND hWnd = FindWindow("","计算器");if(NULL == hWnd){return; //失败则返回}第⼆步: 根据窗⼝句柄,查找进程PID (调⽤ GetWindowThreadProcessId API,传⼊窗⼝句柄,然后通过第⼆个参数把进程的PID给我们的参数) /*2.根据窗⼝句柄,获得进程的PID*/DWORD DwPid = 0;GetWindowThreadProcessId(hWnd,&DwPid); //这个函数会返回线程的ID,但是我们不关⼼,所以没有加返回值第三步: 根据进程PID,返回进程的句柄(OpenProcess,参数⼀,权限参数⼆,句柄是否继承,参数三,进程的pid)/*3.根据进程的PID,获得进程的句柄*/HANDLE hProHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,DwPid); //参数⼀,选择所有权限,参数⼆,不继承给false,参数三,给我们上⾯获得的pid的值if(NULL == hProHandle){return;}第四步: 给远程进程申请空间,并且返回空间的⾸地址(调⽤的API 是VirtualAllocEx)/*4.根据进程的句柄,给进程申请额外内存空间*/LPVOID lpAddr = VirtualAllocEx(hProHandle,NULL,0x1000,MEM_COMMIT,PAGE_EXECUTE_READWRITE);if(NULL == lpAddr){return ;}VirtualAllocEx说明:第⼀个参数: 进程的句柄第⼆个参数: 指定位置分配内存,给NULL为默认帮我们找块地⽅申请内存(不过这个地址会返回,所以不关⼼)第三个参数: 内存分配多⼤,我们给了4096个字节⼤⼩,也就是⼀个分页(1000H)第四个参数: 是否⽴即申请,还是保留这块内存,只能给我们⽤,但是还没申请,我们选择⽴即申请第五个参数: 权限,你申请的这块内存是什么内存,只能读,还是只能写,还是只能执⾏,我们选择全部,可读可写可执⾏第五步:调⽤WriteProcessMemory将我们的Dll路径,写⼊到远程进程中/*5.调⽤WriteProcessMemory,给进程写⼊DLL的路径*/char szBuf[MAX_PATH] = {NULL};GetCurrentDirectory(sizeof(szBuf),szBuf); //这三⾏代码主要是拼接我们的DLL,DLL是我们⾃⼰写的strcat(szBuf,"StaticDll.dll"); //DLL这⾥就不写了,⽤我的吧,我会发上去的BOOL bRet = WriteProcessMemory(hProHandle,lpAddr,szBuf,strlen(szBuf)+1,NULL);if(!bRet){return;}WriteProcessMemory讲解:第⼀个参数: 进程的句柄,可以⽤我们上⾯的OpenProcess返回的第⼆个参数: 你要写⼊的地址,地址使我们VirtualAllocEx申请之后返回的(就是你要往哪个地址写内容)第三个参数: 你写⼊的内容是什么,写⼊的内容使我们的Dll路径,上⾯已经拼接好了第四个参数: 你写⼊的内容的⼤⼩是多⼤,这⾥我们⽤strlen求出来了第五个参数: 实际写⼊的个数,我们不关⼼,如果你想知道,则定义⼀个变量,然后取地址传⼊即可,因为是个指针第六步: 远程进程开辟线程,调⽤LoadLibrary,加载我们的dll,⽽你们知道,当dll被加载的时候,会有信息所以我们在我们的dll⾥⾯写⼊我们⾃⼰的代码,⽐如这个dll被加载的时候,我们执⾏我们的代码,这⾥我的代码就是找到计算器,然后给它加个菜单,并且响应消息 HANDLE hThreadHandle = CreateRemoteThread(hProHandle,NULL,0,(LPTHREAD_START_ROUTINE)LoadLibrary,lpAddr,0,NULL);核⼼代码就在这⾥,我们必须要知道,我们现在加载我们的DLL,⽽我们的DLL被加载的时候,就要执⾏⾃⼰的代码所以这个时候就可以执⾏代码了CreateRemoteThread讲解:第⼀个参数: 进程的句柄(你要往哪个进程开辟线程)第⼆个参数: 安全属性,句柄可否继承,不需要给NULL第三个参数: 栈的⼤⼩,给0则默认第四个参数: 函数执⾏,我们要开辟线程,开辟的线程叫做loadLibrary第五个参数: 开辟线程传⼊的参数,我们知道,线程只有⼀个参数,⽽现在正好load也是⼀个参数,所以加载的参数就是我们的写⼊远程进程内存的dll路径,⽽dll路径⼀旦启动,则会执⾏⾃⼰的代码(核⼼,⼀定掌握)第六个参数: 创建的标志,默认给0第七个参数: 线程的ID,不需要知道,给NULL我们尝试⼀下是否可以成功注⼊计算器,并且加⼊菜单已经成功注⼊了.对于完整的代码,我会放到课堂资料中,但是这⼏步,⼀定要亲⾃⼿动弄明⽩(备注: 我是使⽤VC++6.0编写代码,是MFC程序,当然你也可以⽤⾼版本,参考我这个,是⼀样的对于DLL,我也会发,你们可以⾃⼰去写⾃⼰的DLL,⽐如⼀个空DLL会有DLL main,也就是dll的⼊⼝点当第⼀次加载的时候会来信息什么的,所以可以在⾥⾯写代码.dll靠⾃⼰,这⾥只提供思路)⼆⼂汇编代码的注⼊注意,别看博客每天内容很少,其实你想真正掌握,没有2-3个⼩时就不算掌握,当你真正明⽩这个知识点了,那才叫掌握,⽽不是看⼀遍就⾛的,⾃以为已经会了,千万不要眼⾼⼿低⽐如上⾯的远程线程注⼊,原理是什么,虽然我代码给你了,当你知道原理了,那么代码⾃⼰就会写了原理: 原理就是找到进程,利⽤VirtualAllocEX给他开辟个空间,利⽤他的返回值,会返回这个空间的地址然后再利⽤WriteProcessMemory给这块空间写⼊DLL的路径,最后利⽤远程线程(CreateRemoteThread)把loadlibrary当做线程回调执⾏,传⼊的参数就是远程进程空间我们写⼊的DLL路径,这样相当于当另⼀个进程调⽤了LoadLibray,并且加载我们的DLL,⽽利⽤DLL被加载会执⾏的机制,然后在我们的DLL中写⼊被加载时候的代码即可.(对于为什么我们确定loadlibary在远程进程中,其实这个是系统的特性,重要你软件⼀启动,就必然要有dll的⽀持⽽我们调⽤的loadlibary就在这些dll中)废话补多少,会的⼈请看今天重要的知识,汇编代码注⼊⾸先,前边介绍了RadAsm的IDE环境,那么我们利⽤他建⽴⼀个Dlg汇编程序1.⾸先,新建⼯程,创建⼀个窗⼝程序(因为对于RadAsm3.0不太熟悉,所以这⾥不⽤3.0了,还是⽤2.2.2.0)选择win32 app选择 dialog app⽣成的时候注意ID和窗⼝名,对于ID,和IDname,我们需要⾃⼰去定义宏然后在窗⼝过程函数相应我们的消息注意,对于资源,我们必须单独编译,快捷键是 shift + F5 Ctrl + F5 编译运⾏现在已经可以正常执⾏了我们OD看⼀下,Ctrl + D下断点之后,消息来了,我们知道了WM_COMMAND消息是0x111,所以就直接调⽤MessageBox函数了开始远程线程汇编代码的编写(因时间问题,今天只会讲解⼀个思路,具体的实现代码回去⾃⼰去写⼀下)明天公布答案,以及坑看汇编代码,我们会执⾏上⾯的那⼏个步骤先把变量定义出来LOCAL @hWnd:HWND ;查找窗⼝返回窗⼝句柄LOCAL @hProcessHandle:HANDLE:;进程句柄LOCAL @dwPid:DWORD ;进程的PIDLOCAL @lpBuf:PVOID ;远程进程开辟空间的⾸地址LOCAL @hThread:HANDLE ;线程的句柄LOCAL @dwExitCode:DWORD ;退出代码,获取的是远程load的返回值 ;这些变量都是定义在窗⼝过程函数中第⼀步,判断按钮ID,并且查找窗⼝句柄;1.解析低位,获得按钮消息,并且查找窗⼝句柄invoke FindWindow,NULL, offset g_szWindowNamemov @hWnd,eax ;把返回值给@hWnd.if eax == NULLret.endif第⼆步:获得进程的PIDinvoke GetWindowThreadProcessId, @hWnd, addr @dwPID第三步: 获得进程句柄invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE, @dwPID mov @hProcess, eax .if eax == NULL ret .endif第四步:申请内存空间invoke VirtualAllocEx,@hProcess, NULL, 1000h, MEM_COMMIT, PAGE_EXECUTE_READWRITEmov @lpBuff, eax.if eax == NULLinvoke ShowLastErrorret.endif第五步: 直接写⼊代码,写⼊(按照以前,是往内存写⼊DLL路径,这⾥我们把代码写进去)invoke WriteProcessMemory,@hProcess,@lpBuff,INJECT_CODE, ;代码的标号start - INJECT_CODE, ;起始位置-标号等于实际⼤⼩NULL标号是写在代码区的上⾯的⼀会OD调试⼀下看看⾄于为什么写⼊的代码要ret 4,也就是start上⾯的那句话,是因为下⾯我们调⽤CreateRemoteThread的时候,其中⼀个参数是@lpbuf,我们是当做函数调⽤的,所以压⼊⼀个返回地址第六步: 创建远程线程invoke CreateRemoteThread,@hProcess, NULL, 0, @lpBuf, NULL, 0, NULLmov @hThread, eax.if eax == NULLret.endifinvoke WaitForSingleObject,@hThread, INFINITE 等待结束invoke GetExitCodeThread, @hThread, addr @dwExitCode 获取loadlibrary的返回值他的返回值其实是dll在内存中的实例句柄,所以我们需要释放掉.(释放⾃⼰可以搜⼀下,暂时先把主要的讲了)OD分析明天讲解,今天先熟悉⼀下代码,内容⽐较多,消化⼀下课堂资料: 链接:密码:5kcu。
实验一 MASM和DEBUG使用
实验程序(first.asm)
DATA SEGMENT X DW 2 Y DW 3 Z DW ? DATA ENDS CODE SEGMENT 'CODE' ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,X MOV DX,Y ADD AX,DX MOV Z,AX INT 3 MOV AH,4CH INT 21H CODE ENDS END START
汇编集成环境(1)
这是程序正常汇编的情况。
汇编集成环境(1)
这是程序中存在语法错误时的情况。指令MOV AXX中 AX和X之间缺少逗号,用鼠标双击某个错误信息可定位错 误位置。
汇编集成环境(1)
选择编译→连接→调试,出现下面的窗口。
汇编集成环境(1)
选择“View”→”Watches”增加观察变量。
汇编集成环境(1)
选择“File”→“Quit”退出调试,返回汇 编集成环境。
汇编集成环境(2)
在桌面上找到 图标,启动之。
汇编集成环境(2)
选择“File”→”New”建立新文件。
汇编集成环境(2)
编辑和保存文件。(选择“File” →”Save”) 注意扩展名为.asm
汇编集成序中无输出语句,看不到结果,按任意键返回。
汇编集成环境(2)
选择“Run”→“Debug”进入DEBUG(调试)环境。
汇编集成环境(2)
调试窗口界面
汇编集成环境(2)
选择“View”→“Register”看寄存器中的内容。
汇编集成环境(2)
窗口右侧显示的是寄存器
汇编集成环境(2)
按图所示菜单可将寄存器在16/32位之间切换
Radasm使用说明
Radasm使用说明下面是我特意做的一次实验,并记录其过程,如下,同学们可以放心的在XP下使用。
别的windows系列软件我不太清楚,还有待你们自己慢慢慢慢摸索。
下面的程序清单中添加的一部分红色代码是我随意从树上找的,周荷琴吴秀清编著的《微机原理与接口技术》一书中的第四章的第一个例子,详见P124.1、安装文件,后打开文件,如图所示2、选择文件,新建工程,如图,编译器选择masm,工程类型为Dos App3、新建工程名称,此处选择test1为例,工程文件建为文件存放目录,此处我默认,可以自行设置,如图4、点击下一步,如图,选择dosExe.tpl,选择这个可以使我们省去一些程序的输入,程序如程序清单1,5、点击下一步6、点击下一步如图点击完成,可见程序如程序清单1程序清单1; Template for DOS .exe fileassume cs:cseg, ds:dseg, ss:sseg; codecseg segmentstart:; ... put your code here ...; exit to DOSmov ax, 4C00hint 21hcseg ends; datadseg segment byte; ...dseg ends; stacksseg segment stackdb 100h dup(?)sseg endsend start7、我们只需要在程序清单中添加自己的一部分代码就可以了运行了,当然也可以直接运行如程序清单2程序清单2; Template for DOS .exe fileassume cs:cseg, ds:dseg, ss:sseg; codecseg segmentstart:; ... put your code here ...mov ax,ssegmov ss,axpush dsmov ax,0push axmov ax,dsegmov ds,axmov ah,9mov dx,offset da1int 21hret; exit to DOSmov ax, 4C00hint 21hcseg ends; datadseg segment byte; ...da1 db 'this is a sample program.'db 0dh,0ah,'$'dseg ends; stacksseg segment stackdb 100h dup(?)sseg endsend start8、程序输入完之后我们可以选择下面的四个按钮,其中第一个是编译,第二个是构建,第三个是运行,第四个是构建并运行当程序输入玩之后我们可以选择编译,使用编译检查是否有错误,如上例子中我们可以在状态输出框中看到如下一段文字C:\RadASM\Masm32\Bin\ML.EXE /DMASM /DDOS /Zm /c /nologo /I"C:\RadASM\Masm32\Include" "test1.asm"Assembling: test1.asm构建完成.总共编译时间187 毫秒9、当看到如上一句话是说明我们已经输入了一段可以运行的程序,然后选择构建并运行,可以看到如下窗口己慢慢摸索,。
汇编语言ASM编程
汇编语言ASM编程汇编语言(Assembly Language)是一种低级语言,用于编写与特定计算机硬件体系结构直接交互的程序。
它是机器语言的助记符表示法,通过将每个机器指令与相应的助记符关联,使程序开发者能够更加方便地编写和理解程序。
在汇编语言中,每个指令都对应着计算机的一条机器指令。
汇编语言的特点是直观、灵活和高效。
它直接操作计算机的寄存器和内存,可以精确地控制硬件资源,对于一些对性能要求较高的操作,如图形处理、物理模拟等任务,使用汇编语言可以有效提升程序的执行效率。
汇编语言的学习对于程序开发者来说是很有价值的。
它不仅可以帮助理解计算机硬件的工作原理,还可以为高级语言的学习提供基础。
在某些特定的场景下,仍然有必要使用汇编语言开发程序,例如编写嵌入式系统、驱动程序和性能优化等。
因此,掌握汇编语言编程技巧是程序开发者的一项重要能力。
在ASM编程中,我们会使用汇编语言的指令集来编写程序。
汇编语言的指令集因计算机硬件的不同而有所差异,常见的指令集有x86、ARM、MIPS等。
例如,在x86架构的计算机上进行ASM编程,我们会使用 x86 指令集的语法格式进行编程。
在开始ASM编程之前,我们需要安装一些开发工具和编译器。
常用的工具有汇编器(assembler)和链接器(linker),它们可以将汇编语言代码转换为可执行的机器代码。
一般来说,我们还需要一个调试器(debugger)来帮助我们调试程序。
以下是一个简单的ASM编程示例,展示了如何将两个数相加并将结果存储在寄存器中:```asmsection .datanum1 db 10num2 db 20result db 0section .textglobal _start_start:mov al, num1add al, num2mov result, al; 将结果显示在屏幕上mov ah, 0x0emov al, resultadd al, '0'int 0x10; 程序退出mov ah, 0x4cint 0x21```在上面的示例中,`.data` 段用于声明数据区域。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一 RedASM编译器的使用
一、实验目的
1.熟练掌握RedASM软件的使用方法。
2. 熟练掌握RedASM调试汇编程序的方法。
3. 掌握简单汇编程序的设计方法。
二、实验原理
参考《RedASM编译器的使用简介》。
三、实验设备与器件
PC机一台以及RedASM软件。
四、实验内容
1.按照《RedASM编译器的使用简介》,完成简介材料中的所有内容。
2.参照《RedASM编译器的使用简介》,编写程序计算X+Y,X-Y的值,并将结果放置
在Z变量中,记录运行后内存结果以及符号标志位的值。
(X,Y,Z均为变量)
3.参照《RedASM编译器的使用简介》,编写程序计算X/Y的值,并将商放置在变量
Y1中,余数放在变量Y2中。
规定X,Y均是8位二进制带符号数形式的变量,记录运行后内存结果。
(注意:实验结果不能直接显示在屏幕上,必须通过参看内存状态才能看到结果。
)
五、实验总结(实验报告要求)
1、给出实验中所有调试通过的汇编源程序,并给出实验结果。
2、对实验结果及实验中碰到的问题进行分析、讨论。
3、本次实验的心得体会。
4、必须用实验报告纸书写实验报告。