You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在汇编语言中对字节数组求和?寄存器使用问题求助

字节数组求和的汇编代码问题分析与修正

你的代码主要有三个核心问题,导致求和结果不正确:

问题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:50:22