您的位置首页生活百科

在Visual Studio2019中使用汇编语言编写程序

在Visual Studio2019中使用汇编语言编写程序

的有关信息介绍如下:

在Visual Studio2019中使用汇编语言编写程序

最近在学习x86汇编语言,记录一下这个艰辛过程。希望能帮到也和我一样在变秃的道路上越走越远的小伙伴们,给你们的发际线减少点危险性^-^

下载并安装Visual Studio2019。

因为社区版,个人开发是免费使用的,无论你开发免费的,或是付费的应用都可以,所以我下载安装的是社区中文版的。

在安装的时候,会让你选择工作负载,

"使用C++的桌面开发"和"使用C++的游戏开发",这两个任意选择一个就行。这里我选择的是"使用C++的游戏开发",因为除了汇编,

我还在学习Direct2D一些相关的东西(我的发际线啊)。

打开Visual Studio,点击"创建新项目",进入下一步。点击第一个"空项目",然后点击"下一步",进入配置新项目。输入"项目名称",选择项目保存"位置",

"将解决方案和项目放在同一目录中"这个选框可以勾选,也可以不勾选,看个人喜好。最后点击"创建",项目就创建成功了。

进入项目后,不要急着创建文件,我们先生成汇编语言所需要的依赖。找到右侧"解决方案资源管理器",在项目名称上单击鼠标右键,在弹出的菜单中依次选择"生成依赖项"->"生成自定义",在弹出的窗口中选择第4项

"masm(.targets, .props)",点击"确定"按钮。

创建asm源文件。右侧"解决方案资源管理器"中,在"源文件"上单击鼠标右键,在弹出的菜单中依次选择"添加"->"新建项",弹出添加新项窗口。

选择"C++文件(.cpp)",在下方"名称"中输入文件名,

注意文件扩展名改成".asm",比如"test.asm"。

点击"添加"按钮,文件创建成功。

源文件创建成功,就该开始写代码了。但是,这时候写代码,代码是没有任何高亮显示的,代码写出来都是同一个颜色,而且在写的时候,也没有任何代码提示,所以我们来装一个支持汇编语言的插件,名字叫"AsmDude"。

我们依次单击顶部菜单栏中的"扩展"->"管理扩展",弹出管理扩展窗口。

单击左侧"联机",在右侧"搜索"框中输入"asm",稍等一下,包含"asm"关键字的插件就显示出来了,我们选择第一个"AsmDude"进行安装。"AsmDude"下载完成后,我们需要关闭Visual Studio,这时"AsmDude"会开始进行安装,当"AsmDude"提示安装完成后,我们再打开"Visual Studio",代码就可以高亮显示了。

开始写代码。这里,我们就使用Irvine库提供的过程来实现一些小功能。首先,改变控制台窗口的背景色与前景色,接着每隔一秒,在控制台窗口打印一个随机的英文小写字母,最后弹出一个windows消息弹框。代码就不解释了,每步写的都有注释,代码如下:

include Irvine32.inc ; 注意,这个文件放的是一些Irvine.lib库文件会用到的(我们也有可能会用到的)预定义宏(或者说是常量,但"="定义出来的严格来说不能叫常量,因为是可以改变的),这个文件在我电脑上位置是E:\Irvine\Irvine32.inc

.data

BlueTextOnGray = blue + (lightGray * 16) ; 背景色为浅灰色,前景色为蓝色

caption BYTE "提示信息", 0 ; windows消息弹出框的标题

content BYTE "程序成功执行", 0 ; windows消息弹出框的内容

.code

main PROC

; 改变控制台窗口背景色与前景色

mov eax, BlueTextOnGray

call SetTextColor

call Clrscr

call randShowChar ; 每隔1秒在控制台窗口打印一个随机的小写英文字母

; 弹出一个windows消息框

mov ebx, OFFSET caption

mov edx, OFFSET content

call MsgBox

exit ; 结束程序

main ENDP

randShowChar PROC USES eax ecx

mov ecx, 10 ; 指定循环次数,即打印的字母个数

L1: mov eax, 26

call Randomize ; 初始化随机种子

call RandomRange ; 生成一个0到26的随机整数

add eax, 97 ; 生成随机数加97(a-z的ASCII为97-122)

call WriteChar ; 打印字母

mov eax, 1000

call Delay ; 暂停1秒

loop L1

ret

randShowChar ENDP

END main

由于我们代码依赖Irvine库,所以我们必须有这个库,而且要告诉Visual Studio这个库在哪里(存放位置)。至于这个Irvine库,大家要么自己网上找,要么就直接找我要吧,因为有链接会审核不通过,所以没办法发网址链接之类的

我把下载的Irvine库放在了我的E:\Irvine目录下,大家可以随意。下面我们告诉Visual Studio我们的Irvine库放在了哪里,这样Visual Studio链接器,会将库代码插入到已编译的源文件当中。

在Visual Studio顶部菜单中依次点击"项目"->"属性",弹出项目属性窗口。在左侧选择"Microsoft Macro Assembler",

右侧"Include Paths"输入"E:\Irvine;"(注意,有个半角英文的分号,因为是可以输入多个路径的,多个路径是以分号分隔的)。

接着左侧选择"链接器",右侧"附加库目录"输入"E:\Irvine;"(同样注意有分号)。

将"链接器"选项展开,在展开项中选择"输入",右侧"附加依赖项"输入框最前面添加"Irvine.lib;"(同样注意有分号)。

然后,最上方"配置"选择"所有配置","平台"选择"所有平台"。

最后,点击最下方"应用"按钮,再点击"确定"按钮,关闭窗口。

哦呼。。。到了这里,我们的代码终于可以运行了。

点击Visual Studio顶部的" 本地Windows调试器",看一下代码的运行效果吧!

如果运行地顺利,我们可以看到一个浅灰色的窗口和一个windows消息弹框。

我们来对上一步稍微作点补充。如果代码没有成功运行,我们在右侧"解决方案资源管理器"中的源文件名(test.asm)上单击鼠标右键,在弹出的菜单中选择

"属性",弹出文件属性窗口。左侧选择"常规",右侧"项类型"选择

"Microsoft Macro Assembler",点击"应用"按钮,再点击"确定"按钮,关闭窗口。

这时,再点击顶部"本地Windows调试器",试着运行一下代码。如果还是不成功,那就是代码的问题了,可能是哪少写或多写了。

我们也可以按F11,进行调试,每按一次F11,就会执行一句代码(逐语句调试)。

我们在调试的时候,会显示一个"无可用源"页面,这个不用去管,按F11继续进行调试就可以了。

在代码执行过程中,我们可以在顶部菜单栏中依次选择

"调试"->"窗口"->"寄存器",调出寄存器窗口,来查看寄存器中存放的数据。

寄存器窗口默认不显示标志寄存器,我们需要在寄存器窗口中单击鼠标右键,在弹出的菜单中选择"标志",这时寄存器窗口中就显示标志寄存器了。

本来到这里就应该结束了,但。。。啊,不行,还是要补充一下!众所周知,汇编器会读取我们的源文件,生成目标文件(.obj文件),在这个生成过程中还会产生列表文件。但如果不明确指出你需要列表文件,汇编器是不会把列表文件作为文件保存下来的。同样Visual Studio中也是一样的,我们不告诉它我们需要列表文件,它也是不生成的。现在我们告诉Visual Studio你需要列表文件,让Visual Stuio为我们生出来!

在顶部菜单中依次选择"项目"->"属性",弹出项目属性窗口。

左侧展开"Microsoft Macro Assembler"项,在展开项中选择"Listing File"。

右侧"Generate Preprocessed Source Listing"项,选择"是(/EP)",

"List All Availabel Information"项,选择"是(/Sa)",

"Assembled Code Listing File"项,输入"$(ProjectName).lst",

点击"应用"按钮,再点击"确定"按钮,关闭窗口。

这样我们在调试程序的时候,Visual Studio会生成一个以项目名称作为文件名,以".lst"作为扩展名的列表文件,要看这个文件,我们需要到项目目录下。

如果你能看到这里,说明你跟我一样,也在学汇编。所以。。。让我们一起在变秃的道路上尽情地奔跑吧( ̄︶ ̄)