求编写Intel 8086汇编程序:替换向量前DIM/2元素为VAL值
8086汇编:替换向量前DIM/2个元素为VAL值
你的代码存在几个关键问题,导致无法正确运行:
- 栈段定义错误:
DB 8 DUP(O)中的O是字母,应改为数字0;且栈段需添加STACK属性,确保系统正确识别栈段。 - 过程与主程序入口同名:
MYPROC既是主程序入口,又是要调用的过程,会触发无限递归调用。 - 参数栈清理错误:3个双字(DW)参数共占6字节,
ADD SP,10应改为ADD SP,6。 - 缺少核心处理过程:代码仅写了调用逻辑,但未实现实际替换元素的过程。
- 寄存器使用不规范:调用过程前未保存关键寄存器,可能破坏原有数据。
以下是修正并完善后的完整代码:
STACKSEGMENT SEGMENT STACK 'STACK' DB 100H DUP(0) ; 扩大栈空间,避免溢出 STACKSEGMENT ENDS DATASEGMENT SEGMENT PUBLIC 'DATA' VECTOR DW 1, 2, 3, 4 ; 初始化向量,方便测试 DIM DW 4 VAL DW 5 DATASEGMENT ENDS MYCODESEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:MYCODESEG, DS:DATASEGMENT, SS:STACKSEGMENT MAIN PROC NEAR MOV AX, DATASEGMENT MOV DS, AX ; 初始化数据段寄存器 ; 压入参数:VAL -> DIM -> VECTOR地址(从右到左入栈) MOV AX, VAL PUSH AX MOV AX, DIM PUSH AX LEA AX, VECTOR PUSH AX CALL REPLACE_FIRST_HALF ; 调用替换过程 ADD SP, 6 ; 清理栈上的3个DW参数(2*3=6字节) ; 程序退出 MOV AH, 4CH INT 21H MAIN ENDP ; 过程:替换向量前DIM/2个元素为VAL ; 参数栈结构(栈顶到栈底): ; [SP+4] -> DIM的值 ; [SP+2] -> VAL的值 ; [SP] -> VECTOR的偏移地址 REPLACE_FIRST_HALF PROC NEAR PUSH BP ; 保存基址寄存器 MOV BP, SP ; 用BP访问栈参数 PUSH SI ; 保存源变址寄存器 PUSH AX PUSH CX ; 计算需要替换的元素个数:DIM / 2 MOV AX, [BP+6] ; 取出DIM的值 SHR AX, 1 ; 右移1位等价于除以2(仅适用于偶数,奇数可改用DIV指令) MOV CX, AX ; CX作为循环计数器 JZ END_PROC ; 如果DIM为0,直接退出 ; 准备向量地址和VAL值 MOV SI, [BP+4] ; SI指向VECTOR的第一个元素 MOV AX, [BP+2] ; AX保存VAL的值 REPLACE_LOOP: MOV [SI], AX ; 将VAL写入当前向量元素 ADD SI, 2 ; 移动到下一个DW元素(每个占2字节) LOOP REPLACE_LOOP ; 循环直到CX为0 END_PROC: POP CX ; 恢复寄存器 POP AX POP SI POP BP RET REPLACE_FIRST_HALF ENDP MYCODESEG ENDS END MAIN
代码说明:
- 栈段修正:添加
STACK属性,并扩大栈空间至256字节,避免栈溢出。 - 过程分离:将主程序入口改为
MAIN,新增REPLACE_FIRST_HALF作为核心处理过程,避免递归调用。 - 参数传递:采用栈传递参数,通过基址寄存器
BP访问栈中参数,确保寻址准确。 - 循环处理:用
SHR AX,1高效计算DIM/2,通过SI遍历向量,逐个替换元素为VAL。 - 寄存器保护:在过程中保存并恢复
BP、SI、AX、CX等寄存器,避免破坏主程序的寄存器状态。
内容的提问来源于stack exchange,提问作者disperata_mente
相关产品推荐
相关产品推荐

