如何在汇编语言中对字节数组求和?寄存器使用问题求助
字节数组求和的汇编代码问题分析与修正
你的代码主要有三个核心问题,导致求和结果不正确:
问题1:输入循环次数不匹配
数组arr定义了10个字节元素,但input循环设置cx=9,只输入9个值,漏了最后一个元素。需要把cx改成10。
问题2:寄存器操作类型错误
数组是字节类型,但你用了16位的字操作来读取和累加:
- 初始化求和值时,
mov ax,[bx]会一次性读取bx和bx+1两个字节到AX,这不符合单字节元素的读取逻辑。应该改成mov al,[bx]读取单个字节,同时用mov ah,0清空AH,避免残留数据干扰。 - 累加时
add ax,[bx]同样是字操作,应该改成add al,[bx],并且每次相加后要处理进位:用adc ah,0把进位加到AH中——因为多个字节相加的总和可能超过8位,需要用AX的完整16位来存储结果。
问题3:结果输出逻辑错误
直接把AL中的数值放到DL调用int 21h输出,会显示该数值对应的ASCII字符,而不是十进制数字。需要把AX中的总和转换成十进制ASCII字符串再输出。
修正后的完整代码
.MODEL SMALL DATA SEGMENT arr DB 0,0,0,0,0,0,0,0,0,0 ; 10个字节元素 resultMsg DB '总和为:$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA start: MOV AX,DATA MOV DS,AX MOV BX, OFFSET arr mov cx, 10 ; 循环10次,输入全部元素 input: mov ah,1 int 21h sub al, 30h ; 把输入的ASCII字符转成数值('0'-'9'对应0-9) mov [bx],al inc bx loop input ; 输出换行 mov ah,2 mov dl,10 int 21h mov dl,13 int 21h ; 输出提示信息 mov ah, 09h lea dx, resultMsg int 21h ; 初始化求和寄存器 mov bx, OFFSET arr mov cx,10 mov ax, 0 ; AX清零,AH存进位,AL存当前累加值 mov al, [bx] inc bx cal: add al, [bx] adc ah, 0 ; 处理进位,把CF加到AH inc bx loop cal ; 将AX中的十进制数转成ASCII输出(处理0-99的情况,因为10个0-9的和最大是90) mov bl, 10 div bl ; AL = 商(十位),AH = 余数(个位) mov dl, al add dl, 30h ; 转成ASCII mov ah, 2 int 21h mov dl, ah add dl, 30h int 21h MOV AH,4Ch INT 21h CODE ENDS END start
额外说明:
- 输入时用
sub al,30h把ASCII字符转成数值,这样求和的是实际数字,而不是ASCII码值。 - 输出时通过除法拆分十位和个位,再转成ASCII字符输出,确保显示正确的十进制结果。
内容的提问来源于stack exchange,提问作者Or_Melamed
相关产品推荐
相关产品推荐

