文章目录
第0步 打开VS 2022 点击创建新项目
第1步 选择windows 桌面向导
第2步 配置项目
第3步 选择空项目
第4步 找到生成依赖项 选择生成自定义
第5步 勾选masm
第6步 新建文件
第7步 选择cpp文件并在下方手动指定asm后缀
输入如下代码
; AddTwo.asm - 两个32位整数相加
; 第三章示例
.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
.code
main PROC
mov eax, 5
add eax, 6
INVOKE ExitProcess, 0
main ENDP
END main
第8步 配置解决方案的平台
第9步 查看asm文件的属性页
若此处为ml64.exe ,则之后的运行会报错,因为用的是64位汇编,我们这里是32位。
第10步 为程序打上断点
第11步 点击F5开始调试
第12步 CTRL+ALT+G 打开寄存器
第13步 按F11逐步运行
可看到此处eax的值被修改,eip(extended instruction pointer)指令寄存器的值也发生了变化。
第14步 按F11继续运行
可看到EAX = 0Bh = 11d = 5d + 6d, 运行结果正确。
继续F11单步执行 程序结束
至此,第一个x86程序运行完毕。
可能遇到的问题
1.asm 文件没有被编译
原因:先创建了asm文件再生成依赖项。已生成的asm是不能被编译的属性
2. 使用中断会触发异常
原因:Windows上的程序运行在保护模式下,在此模式只能触发系统定义的软中断,无法触发硬中断。
如果还有遇到的问题,可留言,尽力帮
小白一个,如有错误,还望指出。
简述一下配置过程和思路,如果能帮助到你那是最好。
起源为今天通过王爽那本学习完了16位的汇编语言。想更进一步学习32位。
毕竟现在基本上都是32和64位机器。
最开始打算先看看C代码得到的汇编代码。
于是写了一个简单的C代码。
用
gcc -s a.i -o a.s
得到的一个a.s文件。
然后就想打开看看,但是用VSCode尝试了半天也不行。
下了一堆插件,后来整烦了,,,(主要是不知道是什么编码)
于是就打算直接下链接器和汇编器,写32位代码。
但是下完了nasm和link后,没在指定的路径找到kernel32.dll,网上找的都是要C盘一块搜索,懒得找了。
就转VS了。
然后按照别人的流程来了一遍,总是报错。微软官方的错误提示页面没找到这个错误。
报错格式类似于
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 A2004 symbol type conflict tasm C:\Users\wulil\Desktop\研讨\tasm\tasm\t.asm 18
严重性 代码 说明 项目 文件 行 禁止显示状态
警告 A4023 with /coff switch, leading underscore required forstart address : main tasm C:\Users\wulil\Desktop\研讨\tasm\tasm\t.asm 66
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 MSB3721 命令“ml64.exe /c /nologo /Zi /Fo"Debug\t.obj"/W3 /errorReport:prompt /Tat.asm”已退出,返回代码为 1。 tasm D:\visualstudio\Common7\IDE\VC\VCTargets\BuildCustomizations\masm.targets 69
后来在别人文章的评论区找到了和我有相同问题的人,不过别人写的是16位代码。
后来突然明白了,这是因为汇编代码操作的机器和所采用的汇编器位数不对应,这才去修改了当前文件的机器 。
然后成功运行。
参考书籍
《汇编语言:基于X86处理器》
《汇编语言》王爽,3e
参考博文
VS2017写Intel32
WIN10写汇编的3种方法
进一步阅读
VS2017 写汇编调用C库函数
高亮插件
版权归原作者 腰部以上的叛逆 所有, 如有侵权,请联系我们删除。