汇编:x86汇编环境搭建与基础框架(32位)

32位汇编代码编写环境:Visual Studio(笔者用的版本为2017);先来说一下在Visual Studio 2017中编写汇编代码的准备操作:

①创建空项目

②设置项目属性:平台工具集设置为Visual Studio 2015(v140),因为一些库再2015版本后取消了;

③为该项目生成自定义依赖项;

勾选masm文件

④设置汇编代码入口点为main

⑤为了方便阅读代码,可以下载插件

此处我们下载Asm Dude插件,帮助我们更好地编写代码(该插件可以高亮汇编代码)

此时就可以在项目中添加汇编源文件,此时的源文件的后缀名为.asm;

添加完成后就可以开始编写代码了。

代码基本框架

①指定启用的指令集;

在汇编语言编程中,指令集是处理器所支持的一系列指令的集合。在MASM(Microsoft Macro Assembler)中,用于指定处理器的指令集有:

①.8086
描述:启用Intel 8086处理器指令集。
特点:仅支持8086及其兼容处理器的指令。
​
②.186
描述:启用Intel 80186处理器指令集。
特点:支持8086的指令集以及80186的新指令。
​
③.286
描述:启用Intel 80286处理器指令集。
特点:支持实模式和保护模式,增加了新指令。
​
④.386
描述:启用Intel 80386处理器指令集。
特点:支持32位操作,增加了更多的寄存器和指令。
​
⑤.486
描述:启用Intel 80486处理器指令集。
特点:增加了一些新的指令和性能优化。
​
⑥.586
描述:启用Intel Pentium(80586)处理器指令集。
特点:支持更高级的指令和优化。

②指定程序使用的内存模型和调用约定

指定程序使用的内存模型和调用约定时可以使用.model 指令;

内存模型

在DOS下的16位汇编程序中,内存模型有不同的选择(如tiny, small, compact, medium, large, huge),但在32位或64位模式下,这通常设为 flat(扁平模型),这意味着整个程序和数据都在一个线性地址空间中。

调用约定

调用约定(Calling Conventions)定义了函数调用时参数的传递方式、返回值的处理方式以及栈的清理;不同的调用约定在参数传递顺序、寄存器使用、栈管理等方面有所不同。以下是几种常见的调用约定:

①cdecl(C Declaration):主要用于C语言程序中;参数从右到左压入栈中,调用者(caller)负责清理栈。这意味着调用者在函数调用结束后要调整栈指针以清理传递的参数。
②stdcall:主要用于Windows API和一些其他情况下,调用约定规定被调用者(callee)负责清理栈。
③fastcall:通过寄存器传递函数参数,从而提高函数调用的效率,相比于将所有参数压入栈中,使用寄存器传递参数可以减少内存访问次数,从而提升性能。
④thiscall:主要用于C++类的成员函数调用;在thiscall调用约定下,this指针(即当前对象的指针)通过寄存器传递,而其他参数通常通过栈传递。
⑤vectorcall:主要用于优化处理器支持SIMD(Single Instruction, Multiple Data)指令集的情况下向量和浮点数参数的函数调用,这种调用约定旨在通过使用寄存器传递参数来提高性能,特别是在处理大量浮点数和向量数据时。

③可以设置其他可选参数

此处我们可以使用option指令设置汇编器的各种选项,如如代码是否区分大小写;若此时要设置代码不区分大小写则可以按照如下方法进行编写:

option casemap:none

最简单的x86汇编程序:

汇编代码设置了汇编器的一些选项,定义了程序的内存模型和函数的调用约定,并且包含了数据段和代码段的定义,以及一个简单的过程 main

.586
.model flat,stdcall
option casemap:none
​
.data   ;数据段
​
.code   ;代码段
main proc  ;入口点mov eax,64hmov ebx,65h
main endp
end 

.586:这个指令告诉汇编器使用 Intel 80386 处理器及其支持的指令集。.586指令启用了对这些指令的支持。

.model flat, stdcall:这是一个模型指令,用于定义程序的内存模型和函数的调用约定。

  • flat 是指定了程序使用的内存模型。在这里,flat 内存模型表示程序使用的是平坦内存模型,即所有的内存地址都是在一个统一的地址空间中。

  • stdcall 是一个调用约定标识符,指示函数的调用约定。在这种调用约定下,函数的参数从右到左依次入栈,调用者清理栈。

option casemap:none:这个选项指令设置了汇编器的一些选项;casemap:none 设置了符号不进行大小写转换,这意味着汇编器不会将符号强制转换为特定的大小写格式,符号将保持其原始的大小写形式。

.data:是一个伪操作符,用于标记数据段的开始;在数据段中,程序可以定义变量和常量。

.code:是一个伪操作符,用于标记代码段的开始;在代码段中,程序包含了执行的指令。

main proc:是定义一个过程(procedure)的开始;这个过程是程序的入口点。(上述准备工作中已经在项目属性中将main作为代码入口点)

main endp:main endp 表示过程 main 的结束。

mov eax,64hmov ebx,65h:这两条指令将立即数 64h65h 分别加载到寄存器 eaxebx 中。

end: 用于标记程序的结束。

点击本地Windows调试器运行该代码;

由于在程序中我们没有设置输出,则可以在Visual Studio的寄存器窗口查看代码运行情况;

根据寄存器中的情况可以看出代码正常运行:64h、65h分别被写入EAXEBX两个寄存器中。

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

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

相关文章

YOLOv5改进 | 注意力机制 | 添加三重注意力机制 TripletAttention【原理 + 完整代码】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 得益于在通道或空间位置之间建立相互依赖关系的能力,近年来,注意力机制在计算机视觉任务中得到了广泛的研究和应用。…

嵌入式Linux命令基础

一、命令概述 1. 命令本质 命令的特性:一般就是对应shell命令,每一个命令代表一个可执行程序,运行一个命令就相当于 运行一个可执行代码。 2. 打开终端方法 第一种方法:通过鼠标右键选择打开终端 第二种方法:利用…

Django——Admin站点(Python)

#前言: 该博客为小编Django基础知识操作博客的最后一篇,主要讲解了关于Admin站点的一些基本操作,小编会继续尽力更新一些优质文章,同时欢迎大家点赞和收藏,也欢迎大家关注等待后续文章。 一、简介: Djan…

认识Oracle v$mystat视图

v$mystat就是当前用户的各种统计信息, sid就是session的id(也就是当前用户),STATISTIC#就是统计量的编号(用来唯一确定统计量的名称),value是统计量的值; desc命令在Oracle中通常用于查看表结构; v$mystat视图中只会有当前用户…

【NVM】nvm常用命令,切换node版本命令

nvm常用的命令,切换node版本命令 nvm 查看支持安装的node版本 nvm list available nvm安装指定版本node nvm install 版本号 例如:nvm install 10.24.1 nvm查看本机安装所有node版本 nvm list nvm切换node版本 nvm use 10.24.1 检测当前node版本 node -…

大数据中的电商数仓项目:探秘业务的核心

我学习完一个电商数仓的项目和电影实时推荐项目,便兴冲冲的去面试大数据开发岗,在面试的时候,面试官总是喜欢问,聊聊你为什么要做这个项目以及你这个项目有哪些业务? 我心想,为什么要做这个业务&#xff1f…

【码银送书第二十期】《游戏运营与出海实战:策略、方法与技巧》

市面上的游戏品种繁杂,琳琅满目,它们是如何在历史的长河中逐步演变成今天的模式的呢?接下来,我们先回顾游戏的发展史,然后按照时间轴来叙述游戏运营的兴起。 作者:艾小米 本文经机械工业出版社授权转载&a…

用Idea 解决Git冲突

https://intellijidea.com.cn/help/idea/resolving-conflicts.html https://www.jetbrains.com/help/idea/resolve-conflicts.html idea 官方文档 当您在团队中工作时,您可能会遇到这样的情况:有人对您当前正在处理的文件进行更改。如果这些更改没有重叠(也就是说…

Ps系统教程03

选区工具的组合使用 先用魔棒将大致区域点击圈主 会发现一些零散的小区域 使用套索工具进行区域的加减(按住shift/alt键进行相关区域加减) 可以放大查看 基本处理完细节之后 如果把不用的填充背景直接按delete删除,那么原版图案就会…

Hadoop3:MapReduce的序列化和反序列化

一、概念 1、序列化 就是把内存中的对象,转换成字节序列 (或其他数据传输协议)以便于存储到磁 盘(持久化)和网络传输。 2、反序列化 就是将收到字节序列(或其他数据传输协议)或者是磁盘的持…

LeetCode-47 全排列Ⅱ

LeetCode-47 全排列Ⅱ 题目描述解题思路代码说明 题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 : 输入:nums [1,1,2]输出: [[1,1,2], [1,2,1], [2,1,1]] b站题目解读讲的不好&…

部署k8s的DashBoard

1. 部署 Dashboard UI [rootk8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recomme nded.yaml一般上面的网站访问不了 可以下载我上传的资源DashBoard的recommended.yaml vim recommended.yaml 复制粘贴我上…

做外贸,怎么选国外服务器?

不管是新手还是外贸老司机,大家都知道要用海外服务器来做外贸网站,无论外贸独立站的客户是欧美、东南亚、还是非洲,都不能选择国内机房的服务器,必须选择海外服务器,这是共识。 但是今天,我要告诉大家一个…

Java Apache Jaccard文本相似度匹配初体验

文章目录 前言一、文本相似度算法的选择二、常见的文本相似度算法介绍三、使用示例1、引入jar包2、方法示例3、Jaccard源码剖析4、Jaccard源码解释 写在最后 前言 产品今天提了个需求,大概是这样的,来,请看大屏幕。。。额。。。搞错了&#…

Spring Boot 2 入门基础

学习要求 ● 熟悉Spring基础 ● 熟悉Maven使用 环境要求 ● Java8及以上 ● Maven 3.3及以上:https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started-system-requirements 学习资料 ● 文档地址: htt…

前端从零到一开发vscode插件并发布到插件市场

前端从零到一开发vscode插件并发布到插件市场 背景目标成果展示一条龙实现过程安装插件脚手架和工具创建项目运行调试打包第一次打包前的必要操作 发布第一次发布前账号准备注册Azure DevOps发布账号-获取token注册vscode开发者账号终端登录vsce 发布方式2-手动上传插件 进阶开…

深入分析 Android Service (三)

文章目录 深入分析 Android Service (三)1. Service 与 Activity 之间的通信2. 详细示例:通过绑定服务进行通信2.1 创建一个绑定服务2.2 绑定和通信 3. 优化建议4. 使用场景5. 总结 深入分析 Android Service (三) 1. Service 与 Activity 之间的通信 在 Android …

115道MySQL面试题(含答案),从简单到深入!

1. 什么是数据库事务? 数据库事务是一个作为单个逻辑工作单元执行的一系列操作。事务具有ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性&#xf…

手机站怎么推广

随着手机的普及和移动互联网的快速发展,越来越多的人开始使用手机进行在线购物、社交娱乐、阅读资讯等,同时也催生了越来越多的手机站的出现。但是,在海量的手机站中,要让自己的手机站脱颖而出,吸引更多用户访问和使用…

CSS 【实战】 “四合院”布局

效果预览 页面要求: 上下固定高度左右固定宽度中间区域自适应宽高整个页面内容撑满全屏,没有滚动条 技术要点 使用 html5 语义化标签 header 网页内的标题区域nav 导航区域aside 侧边栏footer 页脚区域section 内容分区article 文章区域 清除浏览器默…