当前位置: 首页 > article >正文

汇编语言基础: 搭建实验环境

环境配置

1.Visual Studio 创建空项目

在这里插入图片描述
在这里插入图片描述

  • 创建成功

在这里插入图片描述

2.平台框架改为为WIN32
  • 右键点击项目

在这里插入图片描述

  • 点击属性
    在这里插入图片描述
  • 点击配置管理器
    在这里插入图片描述
  • 平台改为Win32(本文使用32位的汇编)

在这里插入图片描述

3.生成采用MASM
  • 在项目属性里点击"生成依赖项"的"生成自定义"
    在这里插入图片描述

  • 勾选 masm
    在这里插入图片描述

4.创建第一个汇编程序
  • 右键源文件添加新建项,添加一个.asm结尾的文件
    在这里插入图片描述
  • 写下如下代码
.386
.model flat,stdcall
option casemap:none
.datax dd 2
.code
_main proc
start::push ebpmov ebp,esppop ebpxor eax,eaxret
_main endp
end start
  • 打一个断点编译并调试(内存中x变量值为2)
    在这里插入图片描述
  • 如果没有内存图,点击上方调试,点击窗口的内存(同样也可以调出寄存器的)
    在这里插入图片描述

简单程序编写

  • 要求:编写程序,求sum=x+y,sum=x-y,sum=x/y,sum=x*y的结果
.386                ; 使用386指令集
.model flat, stdcall ; 平坦内存模型,stdcall调用约定
option casemap:none  ; 区分大小写.datax db 8         ; 定义字节变量x,值为8y db 4         ; 定义字节变量y,值为4sum db 0       ; 定义字节变量sum,初始值为0.code
_main proc 
start::push ebp        ; 保存基址指针mov ebp, esp    ; 设置基址指针为当前栈指针; 1. 加法运算: sum = x + ymov al, x       ; 将x的值(8)加载到AL寄存器add al, y       ; AL = AL + y(8+4=12)mov sum, al     ; 将结果(12)存入sum; 2. 减法运算: sum = x - ymov al, x       ; 重新加载x的值到ALsub al, y       ; AL = AL - y(8-4=4)mov sum, al     ; 将结果(4)存入sum; 3. 乘法运算: sum = x * ymov al, x       ; 加载x到ALmul y           ; 乘法: AL * y → AX(8*4=32)mov sum, al     ; 将结果的低8位(32)存入sum; 4. 除法运算: sum = x / ymov al, x       ; 加载被除数x(8)mov ah, 0       ; 清除AH寄存器(高位)mov bl, y       ; 加载除数y(4)div bl          ; 除法: AX / BL → 商在AL(2),余数在AHmov sum, al     ; 将商(2)存入sumpop ebp         ; 恢复基址指针xor eax, eax    ; 将eax清零(作为程序返回值)ret             ; 返回
_main endp
end start           ; 指定程序入口点
代码详解
  1. 数据段(.data)

    • x db 8:定义8位字节变量x,初始值为8
    • y db 4:定义8位字节变量y,初始值为4
    • sum db 0:定义8位结果变量,初始化为0
  2. 代码段(.code)

    • push ebp / mov ebp, esp:标准函数开场,建立栈帧
    • pop ebp:函数结束前恢复栈帧
  3. 算术运算实现

    • 加法

      mov al, x   ; AL = 8
      add al, y   ; AL = 8 + 4 = 12
      mov sum, al ; sum = 12
      
      • 使用ADD指令实现加法,结果存入AL寄存器
    • 减法

      mov al, x   ; 重新加载x值(因AL已被修改)
      sub al, y   ; AL = 8 - 4 = 4
      mov sum, al ; sum = 4
      
      • SUB指令实现减法,需注意寄存器值的覆盖问题
    • 乘法

      mov al, x ; AL = 8
      mul y     ; AX = AL * y = 8 * 4 = 32
      mov sum, al ; sum = AL = 32
      
      • MUL指令执行无符号乘法
      • 结果存储在AX(16位)中,AL包含低8位
    • 除法

      mov al, x ; AL = 8(被除数低8位)
      mov ah, 0 ; AH = 0(被除数高8位)
      mov bl, y ; BL = 4(除数)
      div bl    ; AL = AX/BL = 8/4 = 2(商)
      mov sum, al ; sum = 2
      
      • DIV指令执行无符号除法
      • 被除数必须在AX中(16位)
      • 商存储在AL,余数在AH
  4. 程序退出

    • xor eax, eax:将EAX清零,作为程序返回值
    • ret:从过程返回
调试技巧
  1. 在关键指令后设置断点(F9)
  2. 使用内存窗口(调试→窗口→内存)查看变量值
  3. 使用寄存器窗口(调试→窗口→寄存器)观察寄存器变化
  4. 单步执行(F10/F11)跟踪指令执行流程
注意事项
  1. 乘法结果可能超出8位(如本例中8*4=32仍在8位范围内)
  2. 除法前必须清除AH寄存器(16位除法)
  3. 连续运算时需注意寄存器值的覆盖问题
  4. Win32汇编使用平坦内存模型(flat),无分段概念
  5. 确保使用正确的调用约定(stdcall)
http://www.lryc.cn/news/2398302.html

相关文章:

  • SIFT 算法原理详解
  • 基于springboot的益智游戏系统的设计与实现
  • 短剧系统开发文案:打造沉浸式互动娱乐新体验
  • 第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列
  • 多模态大语言模型arxiv论文略读(104)
  • 【C++高级主题】多重继承下的类作用域
  • 基于Android的一周穿搭APP的设计与实现 _springboot+vue
  • 机器学习——使用多个决策树
  • C# 中的对话框与导航:构建流畅用户交互的完整指南
  • DeepSeek - 尝试一下GitHub Models中的DeepSeek
  • 【判断酒酒花数】2022-3-31
  • 对称加密-非对称加密
  • 【OCCT+ImGUI系列】011-Poly-Poly_Triangle三角形面片
  • 【机器学习基础】机器学习入门核心算法:Mini-Batch K-Means算法
  • 机器学习实战36-基于遗传算法的水泵调度优化项目研究与代码实现
  • 计算机视觉与深度学习 | 基于Matlab的门禁指纹识别与人脸识别双系统实现
  • TypeScript 定义同步方法
  • debian12.9或ubuntu,vagrant离线安装插件vagrant-libvirt,20250601
  • 【仿muduo库实现并发服务器】使用正则表达式提取HTTP元素
  • 核心机制:流量控制
  • Java中并发修改异常如何处理
  • 极智项目 | 基于PyQT实现的YOLOv12行人目标检测软件设计
  • JavaScript 对象展开语法
  • 简单transformer运用
  • vscode不满足先决条件问题的解决——vscode的老版本安装与禁止更新(附安装包)
  • RustDesk 搭建自建服务器并设置服务自启动
  • 【数据库】数据库恢复技术
  • Qt企业级串口通信实战:高效稳定的工业级应用开发指南
  • 力扣HOT100之动态规划:32. 最长有效括号
  • 深入理解前端DOM:现代Web开发的基石