使用 Visual Studio 2022 写纯32位汇编(intel风格)

文章目录

  • 第0步 打开VS 2022 点击创建新项目
  • 第1步 选择windows 桌面向导
  • 第2步 配置项目
  • 第3步 选择空项目
  • 第4步 找到生成依赖项 选择生成自定义
  • 第5步 勾选masm
  • 第6步 新建文件
  • 第7步 选择cpp文件并在下方手动指定asm后缀
  • 第8步 配置解决方案的平台
  • 第9步 查看asm文件的属性页
  • 第10步 为程序打上断点
  • 第11步 点击F5开始调试
  • 第12步 CTRL+ALT+G 打开寄存器
  • 第13步 按F11逐步运行
  • 第14步 按F11继续运行
  • 继续F11单步执行 程序结束
  • 可能遇到的问题
    • 1.asm 文件没有被编译
    • 2. 使用中断会触发异常
    • 如果还有遇到的问题,可留言,尽力帮
  • 参考书籍
  • 参考博文
  • 进一步阅读

第0步 打开VS 2022 点击创建新项目

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第1张图片

第1步 选择windows 桌面向导

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第2张图片

第2步 配置项目

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第3张图片

第3步 选择空项目

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第4张图片

第4步 找到生成依赖项 选择生成自定义

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第5张图片

第5步 勾选masm

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第6张图片

第6步 新建文件

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第7张图片

第7步 选择cpp文件并在下方手动指定asm后缀

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第8张图片
输入如下代码

; 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步 配置解决方案的平台

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第9张图片

第9步 查看asm文件的属性页

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第10张图片
若此处为ml64.exe ,则之后的运行会报错,因为用的是64位汇编,我们这里是32位。

第10步 为程序打上断点

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第11张图片

第11步 点击F5开始调试

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第12张图片

第12步 CTRL+ALT+G 打开寄存器

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第13张图片

第13步 按F11逐步运行

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第14张图片
可看到此处eax的值被修改,eip(extended instruction pointer)指令寄存器的值也发生了变化。

第14步 按F11继续运行

使用 Visual Studio 2022 写纯32位汇编(intel风格)_第15张图片
可看到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 for start 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”已退出,返回代码为 1tasm D:\visualstudio\Common7\IDE\VC\VCTargets\BuildCustomizations\masm.targets 69

后来在别人文章的评论区找到了和我有相同问题的人,不过别人写的是16位代码。
后来突然明白了,这是因为汇编代码操作的机器和所采用的汇编器位数不对应,这才去修改了当前文件的机器 。
然后成功运行。

参考书籍

《汇编语言:基于X86处理器》
《汇编语言》王爽,3e

参考博文

VS2017写Intel32
WIN10写汇编的3种方法

进一步阅读

VS2017 写汇编调用C库函数
高亮插件

你可能感兴趣的:(汇编语言,笔记,visual,studio,windows,c++)