2026/2/13 9:15:18
网站建设
项目流程
凡科建站官网电脑版,特色的南昌网站建设,第一赢销网,网站建设是怎么赚钱MASM DOSBox 8086 汇编语言实验#xff1a;第十五周 —— 重复数统计#xff08;数组交集#xff09;环境#xff1a;MASM DOSBox
目标平台#xff1a;Intel 8086 实模式
关键词#xff1a;汇编语言、双层循环、数组交集、有符号数比较、DOS系统调用一、实验目的与要求…MASM DOSBox 8086 汇编语言实验第十五周 —— 重复数统计数组交集环境MASM DOSBox目标平台Intel 8086 实模式关键词汇编语言、双层循环、数组交集、有符号数比较、DOS系统调用一、实验目的与要求本实验旨在巩固以下内容汇编程序的基本结构数据段、代码段、堆栈段8086 指令系统的熟练使用特别是CMP、JE、指针操作等DOS 系统功能调用如程序退出有符号整数的比较逻辑调试与排查汇编程序中的逻辑错误二、实验内容已知两个数组ARRAY1包含若干互不相等的有符号整数ARRAY2同样包含若干互不相等的有符号整数任务找出两个数组中共同出现的元素存入ARRAY3并统计其个数存入NUM。三、数据段定义DATA SEGMENT ARRAY1 DW 1,2,3,4,5,6 ; 数组ABX作为地址寄存器 ARRAYLEN EQU ($-ARRAY1)/2 ; 计算数组元素个数每个元素占2字节 ARRAY2 DW 2,4,6,8,10,12 ; 数组BSI作为地址寄存器 ARRAY3 DW ?,?,?,?,?,? ; 数组CDI作为地址寄存器存储交集元素 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程序将无法正确读写ARRAY1、ARRAY2等变量。2.双层嵌套循环结构外层循环遍历ARRAY1使用BX指针CX控制次数内层循环对每个ARRAY1[i]遍历整个ARRAY2使用SI指针BP控制次数这种结构时间复杂度为O(n2)O(n^2)O(n2)适用于小规模数据如本实验的 6 个元素。3.有符号数比较CMP AX, [SI] JE FOUNDCMP指令本身不区分有符号/无符号它只是做减法并设置标志位。是否相等JE/JNE在有符号和无符号下行为一致。若需判断大小如、才需注意使用JG/JL有符号或JA/JB无符号。本实验仅需判断“是否相等”因此直接使用JE即可。4.指针移动与数组操作由于数组元素是DW16 位每个元素占2 字节所以ADD BX, 2 ADD SI, 2 ADD DI, 2若误用ADD BX, 1会导致读取错位数据引发严重逻辑错误5.结果存储与程序退出找到的交集元素依次存入ARRAY3交集数量由DX累加最终写入NUM使用 DOS 功能号4CH安全退出程序六、编译与运行步骤DOSBox将代码保存为compare.asm在 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中