使用8086汇编语言通过循环实现1至10的数字求和
嘿,我来帮你搞定8086汇编里用循环求1到10和的问题!这其实是个很经典的入门练习,我给你两个实用的实现方案,再一步步拆解逻辑,保证你能搞懂。
方案一:用BX存当前累加数字,CX做循环计数器
这是最直观的写法,适合刚接触循环指令的同学理解:
.MODEL SMALL .STACK 100H .DATA SUM DW ? ; 定义一个16位变量,用来存储最终求和结果 .CODE MAIN PROC ; 初始化数据段(8086必须先做这一步才能访问数据段变量) MOV AX, @DATA MOV DS, AX ; 循环前的准备工作 MOV CX, 10 ; CX是8086的循环专用计数器,这里设置循环10次(对应1-10) MOV AX, 0 ; AX作为累加器,初始化为0,用来逐步存储总和 MOV BX, 1 ; BX从1开始,每次自增1,代表当前要加的数字 LOOP_START: ; 循环入口标签 ADD AX, BX ; 把当前BX里的数字加到累加器AX中 INC BX ; BX自增,准备下一个要加的数字 LOOP LOOP_START ; LOOP指令自动做两件事:CX减1,若CX≠0则跳回LOOP_START继续循环 MOV SUM, AX ; 循环结束后,AX里就是1+2+...+10的结果(55),存到SUM变量里 ; 程序退出调用DOS中断 MOV AH, 4CH INT 21H MAIN ENDP END MAIN
方案二:用CX同时做计数器和累加数字(更简洁)
利用加法交换律,我们可以直接用CX来存当前要加的数字,不用额外的BX寄存器,代码更紧凑:
.MODEL SMALL .STACK 100H .DATA SUM DW ? .CODE MAIN PROC MOV AX, @DATA MOV DS, AX MOV CX, 10 ; CX初始为10,既是循环次数,也是第一个要加的数字 MOV AX, 0 ; 累加器初始化为0 LOOP_START: ADD AX, CX ; 把当前CX的值加到AX LOOP LOOP_START ; CX自动减1,直到CX=0时退出循环(此时已经加完10到1) MOV SUM, AX MOV AH, 4CH INT 21H MAIN ENDP END MAIN
关键逻辑拆解
不管用哪个方案,核心都是8086的LOOP指令:
LOOP label会自动将CX寄存器的值减1,然后判断CX是否为0- 如果CX≠0,就跳转到指定的标签处继续执行循环体
- 如果CX=0,就执行
LOOP指令后面的代码,循环结束
两个方案最终的结果都是55,因为1+2+...+10和10+9+...+1的和是一样的~
如果你之前的尝试代码有问题(比如循环次数错了、累加器没初始化、寄存器冲突之类的),可以把你的代码贴出来,我帮你排查问题!
内容的提问来源于stack exchange,提问作者over
相关产品推荐
相关产品推荐

