news 2026/6/10 15:15:26

MASM + DOSBox 8086 汇编语言实验:第十五周 —— 重复数统计(数组交集)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MASM + DOSBox 8086 汇编语言实验:第十五周 —— 重复数统计(数组交集)

MASM + DOSBox 8086 汇编语言实验:第十五周 —— 重复数统计(数组交集)

环境:MASM + DOSBox
目标平台:Intel 8086 实模式
关键词:汇编语言、双层循环、数组交集、有符号数比较、DOS系统调用


一、实验目的与要求

本实验旨在巩固以下内容:

  • 汇编程序的基本结构(数据段、代码段、堆栈段)
  • 8086 指令系统的熟练使用(特别是CMPJE、指针操作等)
  • DOS 系统功能调用(如程序退出)
  • 有符号整数的比较逻辑
  • 调试与排查汇编程序中的逻辑错误

二、实验内容

已知两个数组:

  • ARRAY1:包含若干互不相等的有符号整数
  • ARRAY2:同样包含若干互不相等的有符号整数

任务:找出两个数组中共同出现的元素,存入ARRAY3,并统计其个数存入NUM


三、数据段定义

DATA SEGMENT ARRAY1 DW 1,2,3,4,5,6 ; 数组A,BX作为地址寄存器 ARRAYLEN EQU ($-ARRAY1)/2 ; 计算数组元素个数(每个元素占2字节) ARRAY2 DW 2,4,6,8,10,12 ; 数组B,SI作为地址寄存器 ARRAY3 DW ?,?,?,?,?,? ; 数组C,DI作为地址寄存器,存储交集元素 NUM DW ? ; 存储交集元素的个数 DATA ENDS

注意:DW表示每个元素为16 位有符号整数(word),因此地址偏移每次需加 2。


四、完整汇编代码实现

DATA SEGMENT ARRAY1 DW 1,2,3,4,5,6 ARRAYLEN EQU ($-ARRAY1)/2 ARRAY2 DW 2,4,6,8,10,12 ARRAY3 DW ?,?,?,?,?,? NUM DW ? DATA ENDS STACK1 SEGMENT PARA STACK DW 20H DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK1 START: ; 初始化数据段 MOV AX, DATA MOV DS, AX ; 初始化指针和计数器 LEA BX, ARRAY1 ; BX 指向 ARRAY1 MOV CX, ARRAYLEN ; 外层循环次数 LEA DI, ARRAY3 ; DI 指向 ARRAY3 XOR DX, DX ; DX = 0,用于记录交集数量 OUTER_LOOP: MOV AX, [BX] ; 取 ARRAY1 当前元素 LEA SI, ARRAY2 ; SI 指向 ARRAY2 起始 MOV BP, ARRAYLEN ; 内层循环计数器 INNER_LOOP: CMP AX, [SI] ; 比较 ARRAY1[i] 与 ARRAY2[j] JE FOUND ; 相等则找到交集 ADD SI, 2 ; 移动到下一个 ARRAY2 元素 DEC BP JNZ INNER_LOOP ; 继续内层循环 NEXT: ADD BX, 2 ; 移动到下一个 ARRAY1 元素 DEC CX JNZ OUTER_LOOP ; 继续外层循环 JMP END_PROC FOUND: MOV [DI], AX ; 将交集元素存入 ARRAY3 ADD DI, 2 ; 移动 ARRAY3 指针 INC DX ; 交集数量 +1 JMP NEXT ; 返回外层继续 END_PROC: MOV NUM, DX ; 保存交集数量到 NUM ; DOS 程序退出 MOV AH, 4CH INT 21H CODE ENDS END START

五、关键点解析

1.段寄存器初始化

MOV AX, DATA MOV DS, AX

这是访问数据段变量的前提。若未初始化DS,程序将无法正确读写ARRAY1ARRAY2等变量。


2.双层嵌套循环结构

  • 外层循环:遍历ARRAY1(使用BX指针,CX控制次数)
  • 内层循环:对每个ARRAY1[i],遍历整个ARRAY2(使用SI指针,BP控制次数)

这种结构时间复杂度为O(n2)O(n^2)O(n2),适用于小规模数据(如本实验的 6 个元素)。


3.有符号数比较

CMP AX, [SI] JE FOUND
  • CMP指令本身不区分有符号/无符号,它只是做减法并设置标志位。
  • 是否相等JE/JNE)在有符号和无符号下行为一致。
  • 若需判断大小(如><),才需注意使用JG/JL(有符号)或JA/JB(无符号)。

本实验仅需判断“是否相等”,因此直接使用JE即可。


4.指针移动与数组操作

由于数组元素是DW(16 位),每个元素占2 字节,所以:

ADD BX, 2 ADD SI, 2 ADD DI, 2

若误用ADD BX, 1,会导致读取错位数据,引发严重逻辑错误!


5.结果存储与程序退出

  • 找到的交集元素依次存入ARRAY3
  • 交集数量由DX累加,最终写入NUM
  • 使用 DOS 功能号4CH安全退出程序

六、编译与运行步骤(DOSBox)

  1. 将代码保存为compare.asm
  2. 在 DOSBox 中执行:
masm compare.asm;linkcompare.obj;compare.exe

注意:MASM 和 LINK 命令末尾加分号可跳过提示输入。


七、运行结果验证

给定输入:

  • ARRAY1 = [1, 2, 3, 4, 5, 6]
  • ARRAY2 = [2, 4, 6, 8, 10, 12]

预期输出

  • ARRAY3 = [2, 4, 6, ?, ?, ?]
  • NUM = 3

可通过调试工具(如debug compare.exe)查看内存内容验证结果。


八、总结

本实验通过经典的“数组交集”问题,深入练习了:

  • 8086 汇编的双层循环控制
  • 指针操作内存寻址
  • 有符号数比较的正确处理方式
  • DOS 系统调用的规范使用

虽然逻辑简单,但极易因地址偏移错误、寄存器未初始化等问题导致程序异常。建议在 DOSBox 中配合debug工具单步调试,加深对汇编执行流程的理解。

💡思考题延伸
若数组中存在重复元素,如何修改程序以避免ARRAY3中出现重复?
(提示:可在写入ARRAY3前,先检查该元素是否已存在于ARRAY3中)


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:14:41

腾讯混元4B开源:40亿参数如何重塑企业级AI部署格局

导语 【免费下载链接】Hunyuan-4B-Instruct 腾讯开源混元4B指令微调大模型&#xff0c;专为高效部署设计。支持256K超长上下文与混合推理模式&#xff0c;兼具快速响应与深度思考能力。在数学、编程、科学推理及智能体任务中表现卓越&#xff0c;适配从边缘设备到高并发服务器的…

作者头像 李华
网站建设 2026/6/7 1:46:50

收藏!大模型从入门到实战全攻略:小白程序员必看的AI成长手册

无论是刚接触AI的编程小白&#xff0c;还是想转型大模型领域的资深开发者&#xff0c;都需要一份系统、易懂的知识框架——本文从大模型基础概念讲到商业落地&#xff0c;拆解训练推理核心逻辑&#xff0c;聚焦RAG、MCP、Agent三大核心能力&#xff0c;搭配实战学习路径&#x…

作者头像 李华
网站建设 2026/6/10 11:20:40

5分钟掌握RunHiddenConsole:让Windows程序后台静默运行的终极指南

5分钟掌握RunHiddenConsole&#xff1a;让Windows程序后台静默运行的终极指南 【免费下载链接】RunHiddenConsole Hide console window for windows programs 项目地址: https://gitcode.com/gh_mirrors/ru/RunHiddenConsole 你是否曾经被那些顽固的黑色控制台窗口困扰&…

作者头像 李华
网站建设 2026/6/10 11:29:30

零基础入门:Vite创建第一个Vue3项目详解

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个面向新手的ViteVue3教学项目&#xff0c;要求&#xff1a;1. 极简项目结构(只保留核心文件) 2. 包含详细的代码注释(中英双语) 3. 分步骤的教程README 4. 交互式学习练习(通…

作者头像 李华
网站建设 2026/6/10 13:47:49

Python天体力学终极指南:poliastro太空仿真工具完整教程

Python天体力学终极指南&#xff1a;poliastro太空仿真工具完整教程 【免费下载链接】poliastro poliastro - :rocket: Astrodynamics in Python 项目地址: https://gitcode.com/gh_mirrors/po/poliastro 探索宇宙奥秘&#xff0c;计算星际轨迹&#xff0c;现在用Python…

作者头像 李华
网站建设 2026/6/10 17:11:42

高效文件管理新选择:wl-explorer让Vue项目开发事半功倍

在现代Web开发中&#xff0c;文件管理功能的实现往往成为项目开发的痛点。wl-explorer作为一款专为Vue框架设计的文件管理器插件&#xff0c;通过简洁的界面和强大的功能&#xff0c;帮助开发者快速构建云盘级别的文件管理系统&#xff0c;显著提升开发效率。 【免费下载链接】…

作者头像 李华