首页 > 编程语言 >汇编:x86汇编环境搭建与基础框架(32位)

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

时间:2024-05-30 16:01:41浏览次数:30  
标签:汇编 调用 x86 32 指令 处理器 指令集 寄存器 main

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,64h
    mov 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两个寄存器中。

标签:汇编,调用,x86,32,指令,处理器,指令集,寄存器,main
From: https://blog.csdn.net/WolvenSec/article/details/139326737

相关文章

  • Stm32H7系列定时中断设置HAL库
    Stm32定时中断配置,在我们的日常调试中,想要以一个固定的时钟频率对传感器定时周期采样时往往会直接在main.c函数的While(1)中进行,通过HAL_Delay()来控制采样频率,但是如果多传感器同时采样的话由于HAL_Delay()的方法时效性不是很准确往往会出现一系列的问题,而使用定时中断的话,只需......
  • 玩转STM32-I2C通信协议(详细-慢工出细活)
    文章目录一、I2C总线原理(掌握)1.1硬件构成1.2传输位1.3数据传输格式二、STM32的I2C特性和结构三、STM32的I2C通信实现(硬件实现方式)3.1I2C主模式四、应用实例一、I2C总线原理(掌握)1.1硬件构成I2C总线由串行数据线SDA和串行时钟线CL构成,总线上的每个器件都有一个......
  • GD32 使用ST-Link进行调试出现Error:Flash Download Failed-“Cortex-M3“ 解决方案
    项目场景:原来一直使用STM32,最近有个项目发项工程师打板采用的是GD32,外部引脚是一一对应的,STM32的各种下载工具和方法也是基本相同的。问题描述`前期就是库函数和芯片包要改成GD32的。前期工作都完成了,剩下最后一公里,就是下载程序。在MDK5中,采用STLINK,选好芯片型号,准备下载,但出现了Error:FlashDow......
  • 20231325 贾罗祁 《Python程序设计》实验四报告
    20231325贾罗祁2023-2024-2《Python程序设计》实验四报告课程:《Python程序设计》班级:2313姓名:贾罗祁学号:20231325实验教师:王志强实验日期:2024年5月15日必修/选修:公选课1.实验内容Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。课......
  • Proteus8.0仿真应用设计(九十三)基于STM32CubeMX、STM32F103C8T6 、FREERTOS、MCP4151(SP
    一、简介:        MCP4151是一款SPI接口的7位数字电位器。二、主要特性:电阻值(欧姆)5kΩ、10kΩ、50kΩ、100kΩ抽头数257接口类型SPI通道数1供电电压1.8V~5.5V精度±20%温度系数(典型值)150ppm/℃工作温度-40℃~+125℃三、引脚定义:四、内部逻辑框图:五、时序图......
  • esp32-s3-mini-1 otg board, uvc调试记录
    网上购买了一块ESP32-S3-USB-OTG开发板(非乐鑫官方开发板)。准备实现usbuvccamera+lcd显示。使用esp-idf/example/usb/host/uvc进行测试,修改了引脚,对USB供电和数据切换的引脚重新校正,出现报错:0x40056fc9:memcpyinROM0x4200b219:_uvc_process_payloadatC:/Users/yinsu......
  • P9327 [CCC 2023 S4] Minimum Cost Roads
    原题链接题解贪心,我管这种叫做策略贪心,即按照某种顺序或者角度去贪心可以得到最优解既然题目要求任意两点间最短路最小的同时,价格也最小,那么我们就按长度为第一关键字,花费为第二关键字排序。然后遍历所有边看看这条边能否使用遍历过程的策略:如果这条边加入后,这条边两端的节点......
  • 基于STM32的GPS远程矿山矿场监控系统
    **单片机设计介绍,基于STM32的GPS远程矿山矿场监控系统文章目录一概要二、功能设计设计思路三、软件设计原理图五、程序六、文章目录一概要  基于STM32的GPS远程矿山矿场监控系统概要如下:一、系统概述基于STM32的GPS远程矿山矿场监控系统旨在实现对矿山......
  • s32k312 之 Relocating code in ITCM
    ITCM(指令紧耦合内存)是零等待内存,即CPU访问的时间ITCM将比访问闪存或SRAM更快。要使用ITCM内存,操作步骤如下:第一步:在链接器文件中定义ITCM部分。因为默认的链接器文件已经定义了ITCM内存区域int_itcm,所以我们可以从section定义开始__itcm_rom=__shareable_data_rom_end;......
  • LeetCode 1329. Sort the Matrix Diagonally
    原题链接在这里:https://leetcode.com/problems/sort-the-matrix-diagonally/description/题目:A matrixdiagonal isadiagonallineofcellsstartingfromsomecellineitherthetopmostroworleftmostcolumnandgoinginthebottom-rightdirectionuntilreachin......