vs 2019编写汇编并运行调试

前言
我是上学期学的汇编,因为有vs又不想用课上教的麻烦的dosbox以及masm32,但是一直没找到高亮插件和能调试的(难在运行不了而找不到答案上,出现的错误在最后放出,还请先达们不吝指点)汇编代码所以放弃了。

但是我又偶然想起来了,而且偶然找到了高亮插件!

(那时查了很多帖子,甚至有人说在某度知道里说vs不能写汇编,我真是对这种不负责任的回答嗤之以鼻,

有个贴吧的帖子说
汇编开发环境,个人建议,如果已经安装了Visual Studio,推荐直接用vs作为开发调试工具,原因很简单,现在用的规则就是masm,微软的规则,没有人比微软更了解微软,而且可以很方便的为后续加入c/c++开发提供一站式的平台,如果没有安装,可以考虑后者Radasm+ Masm32,不要用什么cmd,然后debug。。。愚蠢至极,除了装逼浪费时间,还是装逼浪费时间,并没有半点实际价值。详见http://tieba.baidu.com/p/4827889049

嗯,我很同意上面不是斜体的那段文字(尤其是win10后根本没debug了,还得搞dosbox),所以我又来找vs运行汇编的方法了~

没想到课本上那么少的东西实际运行起来水那么深,深的不是基本语法,而是各种库什么的照搬书上的代码都没法运行,真是……根本不像之前的c语言直接一个f5就完事那么简单。(ps:参考的那几个帖子的代码有的能运行,有的)

 

==============分割线============

~最简单的(C中内嵌汇编代码):在VS的C++文件里直接使用__asm{} 直接写汇编代码.

http://blog.csdn.net/sinat_27382047/article/details/53968622

 

~偷个懒写汇编作业(C语言生成汇编代码)或者研究一下生成的汇编代码

http://blog.csdn.net/sinat_27382047/article/details/72810726

 

~反汇编介绍(直接查看c中某些代码的汇编代码):

http://blog.csdn.net/sinat_27382047/article/details/72810788

 

~汇编代码在vs上的使用方法(配置完的VS并不能正常运行平时能在dosbox上运行的汇编语句):

http://blog.csdn.net/sinat_27382047/article/details/72830040

↑↑↑↑↑↑(你们想要的纯汇编hello world)↑↑↑↑↑

 

==============分割线============

 

 

正片儿:
插件
 

vs2015的汇编语法高亮插件(安装就行)这玩意找了我很久= =

http://download.csdn.net/detail/fhw_bin_dl/9724391

**其实AsmHighlighter高亮插件非常好弄的,在VS2017 工具->扩展和更新->选择联机->搜索AsmHighlighter,然后安装就行了【感谢下方评论中的OringeEd君】

 

过程【这是小事,vs这一系列都可以照葫芦】
 

一、建项目
1.建一个空项目,必须先建空项目,改现成的C++项目为assembler项目可能会造成编译不过.


 

2.选中项目右键 “生成自定义”,选择MASM生成规则.


 

 

二、添加及设定源文件
3.选中源文件右键-》添加-》新建项


此处后缀名是汇编的.asm

4.选中项目右键-》属性-》链接器-》系统-》 子系统选 “控制台(SUBSYSTEM:CONSOLE)”


5.选中项目右键-》属性-》链接器-》高级-》 入口点 填 "main"

 

三、测试代码编译运行:
(可以看到,如果安装了高亮插件,不仅注释可以用了,代码也有高亮提示了)

最后,输出,调试时选择菜单 调试-》窗口-》寄存器 就能看到寄存器值。(这样,就不至于苦逼地用指令-ip一步步看了吧~)


 

 
代码【这事儿可深了……】
先上那位大神可以过的代码
 
TITLE Add and Subtract              (AddSub.asm)
 
; This program adds and subtracts 32-bit integers.
; Last update: 2/1/02
 
 
INCLUDELIB kernel32.lib
 
.MODEL flat,stdcall
 
;.code
ExitProcess PROTO,              ; exit program
dwExitCode:DWORD        ; return code
 
 
.data
.code
main PROC
 
    mov eax,10000h        ; EAX = 10000h
    add eax,40000h        ; EAX = 50000h
    sub eax,20000h        ; EAX = 30000h
 
    push 0h
    call ExitProcess
 
main ENDP
END main
关于代码的讨论:https://blog.csdn.net/Alisebeast/article/details/79861177
 

   

 

感谢以下找过的对我有用的帖子:
——来自贴吧的嘲讽~
http://tieba.baidu.com/p/4827889049

——高亮插件(asmhighlighter官网?)

http://asmhighlighter.codeplex.com/

——求高亮插件的帖子

 http://bbs.csdn.net/topics/391043876

——[汇编]_[初级]_[VS2010搭建汇编开发环境win32和x64](过程部分基本如此帖所做)

http://blog.csdn.net/infoworld/article/details/45085415

——vs2010的插件英文教程

http://kipirvine.com/asm/4th/index.html【《Intel汇编语言程序设计(第4版)》作者网址】

http://kipirvine.com/asm/gettingStartedVS2015/index.htm#tutorial32(貌似这就是所有参考的源头,很全)

http://kipirvine.com/asm/gettingstartedvs2010/#syntax (大佬jie汇介绍高亮插件)

(↑以上都是这位大佬写的!)

http://www.deconflations.com/2011/masm-assembly-in-visual-studio-2010/

 

 

=========分割线====2018.2.10============
VS2017写汇编教程(亲测可用,很顺畅,做到了上文中“直接一个f5就完事”,没有ml.exe的错误):

http://blog.csdn.net/maguanzhan7939/article/details/78608345

【这样 就不用masm for windows那样的收费ide了~还比那个逼格高】

 

——一些源网:

http://www.masm32.com/download.htm (masm32)

https://archive.codeplex.com/?p=asmhighlighter  (asmhighlighter)

 

===========以下为广告,想省事的可以来我这里2C币下载~===================

不想装masm32(上图那货)只想要库的可以下我放的链接(内含一套 高亮插件+要用到的masm库):

http://download.csdn.net/download/sinat_27382047/10248253

 
————————————————

原文链接:https://blog.csdn.net/sinat_27382047/article/details/70339455

 

----------------------------------------------------------------------------------------------------------------------------------------------


1. 新建个 Visual C++ 的空项目

关闭 [安全开发生命周期(SDL)检查],并选择空项目

2.生成依赖性


选择 masm 依赖项并生成 

(注意:若先创建了 asm 文件再生成依赖项,asm 文件是不会被汇编软件编译的!解决方案在最后!)

3.新建 asm 汇编文件

4.编写汇编语言

        .code            ;代码段      !64 位没有 .model 宏指令,无法设置内存模型和生成的代码风格!
main proc                ;main函数开始
    
    mov rax, 120
    add rax, 34
    sub rax, 130
 
    ret
 
main endp                ;main函数结束
end
                    ;masm x64 没有指定入口点的宏指令!
关于 masm x64 没有指定入口点的宏指令 的问题,会在最后的参考博客中给出链接(国外论坛和微软官方的解答)

5.将调试器位数换成 x64

6.选择 项目->属性 [配置属性->连接器->高级[入口点   输入您想入口的函数名]]

4 步骤中的汇编代码,我用 main 当作入口函数,所以这里填入的是 main

若想让入口点为 a 函数,即下面贴的汇编代码,则在入口点处填个 a (表示 a 函数是程序的入口点)

        .code            ;代码段     !64 位无法使用 .model 宏指定内存模型和生成的代码风格!
a proc                        ;a函数开始
    
    mov rax, 120
    add rax, 34
    sub rax, 130
 
    ret
 
a endp                        ;a函数结束
end


7.在第一条语句打下断点,然后执行程序

8.在 调试->窗口->打开寄存器、内存、反汇编 之类的信息窗口(根据需要选择)

若没有这些选项,说明您没有(调试)运行程序 参照第七条

9.选择蓝圈中不同的执行方式,来调试您的汇编程序

提示:在上图左下 [寄存器] 显示框中,可右键选择您想显示的寄存器

结束


可能遇到问题的解决方案:(遇到其他问题,请留言,我会找解决方法)

一. asm 文件没有被编译

 原因:若先创建了 asm 文件再生成依赖项,已创建的 asm 文件是不会被汇编软件编译的,已创建的 asm 文件的属性是不能被编译的属性

    ①打开 .asm 文件的的属性

    ②在常规中更改 项选项 位 Microsoft Macro Assembler

二. error LNK2005: main 已经在 a.obj 中定义


( main 是您定义的入口点函数,若是定义的入口点是函数 a,则异常是 error LNK2005: main 已经在 *.obj 中定义)

    原因:在一个项目里定义了多个 asm 文件,并具有相同的入口函数

    解决方案1:用项目分割不同的 asm 文件

    解决方案2:不同的 asm 文件定义不同的函数入口点,运行相应汇编程序时,照着步骤六修改项目的程序入口点为相应文件的入口函数


三. 为什么我使用中断会触发异常

    原因:Windows10 上的程序是运行在 CPU 保护模式下的,在此模式下只能触发系统定义的软中断,无法触发硬中断,若想触发硬中断,请使用 DosBox 模拟 CPU 实模式


推荐书籍:

《现代x86汇编语言程序设计》

《汇编语言:基于x86处理器》

参考博文:

Visual Studio 2017 asm 高亮插件:

https://blog.csdn.net/sinat_27382047/article/details/70339455#comments

http://blog.csdn.net/maguanzhan7939/article/details/78608345

masm 宏定义规则:

https://msdn.microsoft.com/en-us/library/wxy1fb5k.aspx

关于 masm x64 没有指定入口点的宏指令 的问题:

https://docs.microsoft.com/zh-cn/cpp/assembler/masm/masm-for-x64-ml64-exe

https://social.msdn.microsoft.com/Forums/vstudio/en-US/2107f634-1152-4a85-ae48-0d580aaf3f02/why-does-64bit-masm-not-accept-an-entry-point-address-on-the-end-directive?forum=vcgeneral

推荐阅读:

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

https://blog.csdn.net/alisebeast/article/details/79875393
————————————————
原文链接:https://blog.csdn.net/Alisebeast/article/details/79875620

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三菱880彩铅和uni的区别_孟祥雷丨清华美院毕业,彩铅界的“冷军”(附彩铅教程哦!)...

今天要分享的是妥妥的一个高冷帅气、又有才华的艺术家,毕业于清华大学美术学院。有20多年的绘画经验,设计、绘画等艺术多面手,彩铅是他最出名的作品之一。人物篇(逆光)(麻花辫)用彩铅画肖像人物的人很多,但能把人物塑造得维妙维俏…

substring()分解字符串

substring解决了如何在指定位置将一个字符串划分为子串 单参数形式:返回从起始位置到结尾之间的子串**(起始索引从0开始)** public class SubStringReview {public static void main(String[] args) {String s "Java is great";…

ubuntu 16.04忘记登录密码的解决办法

1、开机长按shift,我这是按esc,出现如下界面,选中如下选项: 2、按回车键进入如下界面,然后选择有recovery mode的选项,注意:然后按e进入3的界面(请不要使用enter键) 推…

11g oracle xe启动_详解Oracle等待事件的分类、发现及优化

一、等待事件由来大家可能有些奇怪,为什么说等待事件,先谈到了指标体系。其实,正是因为指标体系的发展,才导致等待事件的引入。总结一下,Oracle的指标体系,大致经历了下面三个阶段:以命中率为主…

您可能不知道的 C++ 关键字

C 有些操作符,其实有对应的关键字(目的是为了在没有这些字符的键盘也可以输入C程序) and &&and_eq &bitand &bitor |compl ~not !or ||or_eq |xor ^xor_eq ^not_eq !从可读性的角度看&#xff0c…

StringTokenizer将一个字符串分解为单词或者标记

原理:StringTokenizer方法实现了Iterator的设计模式,也直接实现了枚举接口,通常情况下StringTotkenizer对象根据欧洲语言的单词分割将对字符串分解为若干单词,例如: public class StringTokenizerReview {public stat…

Ubuntu14.04设置开机可以以root用户身份登录

ubuntu系统信息: 步骤: 1. 切换到root用户 2. 设置Root用户密码 3.进入到相应目录 cd /usr/share/lightdm/lightdm.conf.d/ 4.编辑 50-ubuntu.conf文件, 增加greeter-show-manual-logintrue 5.关机重启,在开机界面弹出如下图所示…

JSP数据库连接

JSP数据库连接 一、SQL Server 2000数据库的连接 驱动:String driverClass"com.microsoft.jdbc.sqlserver.SQLServerDriver"; 需要用到的包: msbase.jar , mssqlserver.jar, msutil.jar URL: String url"jdbc:microsoft:sqlserver://127…

hystrix 单独使用_Hystrix学习

学习主题:Hystrix解决灾难性雪崩效应-服务熔断-服务熔断处理熔断参数circuitBreaker.enabled的作用是什么?熔断参数circuitBreaker.requestVolumeThreshold的作用是什么?熔断参数circuitBreaker.sleepWindowInMiliseconds的作用是什么&#x…

Centos7搭建Ngrok

安装gcc和git(下载ngrok源码) yum install gcc -y yum install git -y yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386 yum update -y nss curl libcurl yum -y install gcc automake auto…

WebClient与WebRequest差异

WebRequst的使用 WebClient和HttpWebRequst是用来获取数据的2种方式,在我的这篇数据访问(2)中主要是讲的WebClient的使用,一般而言,WebClient更倾向于“按需下载”,事实上掌握它也是相对容易的,而HttpWebRequst则允许你…

连接字符串

方式一:可以使用运算符**“”**来连接字符串 public class StringBufferReview {/*** 方式一:使用连接* param args*/public static void main(String[] args) {String s1 "hello";String s2 "Java";String s3 s1s2;System.out.…

的使用_面部精华使用方法和使用步骤;

核心提示:精华液,是护肤品中之极品,成分精致、功效强大、效果显著,始终保持着它拥有的高贵和神秘。精华液中的基质是水,含有硅树脂,有利于渗透进皮肤和推开,其它添加成分,则带有治疗…

处理字符串中的单个字符CharAt()

1、解决方法:采用循环以及String类的charAt()方法 charAt()方法将返回String对象中索引值**(从0开始)**位置的字符。所以,我们只需要执行从0到String.length()-1的循环,就能够依次处理字符串中的所有字符。 注意&#…

Acer Travelmate T3290笔记本拆机指南

中午闲来无事,把永哥的笔记本拆了(Acer Travelmate某款,很老的机器了)。整个过程有惊无险,也没拍照片,大体说下拆机流程吧,如果有人要拆该系笔记本可以参考。 先卸电池。拿掉诸如读卡器盖&#…

解决VS2013中出现类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误

禁用安全检查,一步到位! 参考URL:https://blog.csdn.net/dan15188387481/article/details/49622783

横向全屏滑动插件_【案例】JQuery横向手风琴图片轮播切换代码

点击上方[我分享我快乐]→[...]右上角→[设为星标⭐]即可第一时间获取最新设计资源哈喽大家好,又到了每周二经典案例环节啦~同学们还想了解哪些网页知识今天段老师给同学们带来的是JQuery横向手风琴图片轮播切换代码。01脚本简介jQuery实现水平手风琴图片轮播切换特…

Spring学习大杂烩(待续)

IOC控制反转:依赖注入:需要的jar文件dist\spring.jarlib\jakarta-comnons\comnons-logging.jarlib\aspectj\aspectjweaver.jaraspectjrt.jarlib/cglib/cglib nodep2.1_3.jarlib\j2ee\common-annotation.jar实例化Spring容器的方法ApplicationContext ctx…

将字符串全部转为大写或者小写

1、全部转大写,使用toUpperCase()方法;全部转小写,使用toLowerCase()方法 public class StringUpperAndLowerReview {public static void main(String[] args) {String s "Hello jaVa";System.out.println(s.toUpperCase());Syst…

是网关吗_什么是边缘控制器?就是IPC+PLC+网关吗?今天就拆开一个来看看

边缘计算作为云计算的一项重要补充,在构建互联工厂中的作用正越来越受到重视。边缘计算实现了数据在网络边缘侧的分析、处理与储存,不仅减少了对云端依赖,也提高了数据的安全性。不管是因为云计算本身,还是网络传输受限&#xff0…