求解释:汇编实现向量元素求和程序无屏幕输出的原因
你的汇编代码无法显示内容的原因及修正方案
我来帮你拆解下这段代码里的问题,为啥没法正常显示求和结果~
核心错误点分析
求和结果根本没被用到,反而用了错误的寄存器值
你在循环求和结束后写了mov bx,ax,但此时ax里存的还是一开始加载的数据段地址(mov ax,@data的结果),完全没把你辛辛苦苦算出来的suma值(1+2+...+9=45)放到bx里。后面输出bl的时候,这个地址对应的ASCII字符基本都是不可见的控制字符,所以屏幕上自然看不到内容。直接输出数值二进制值,没转成可显示的ASCII字符
就算你拿到了正确的45,直接mov dl,bl调用int 21h的ah=2功能,输出的是ASCII码为45的字符(也就是减号-),而不是数字“45”。要显示十进制数字,必须把数值拆成十位和个位,分别加上30h(ASCII里'0'的编码是48,也就是十六进制30h)转换成可显示的字符。冗余指令(不影响功能但没必要)
xor si,si已经把si寄存器清零了,后面又写了mov si,0,这步完全多余,删掉就行。
修正后的完整代码
.model small .stack 100h .data vector db 1,2,3,4,5,6,7,8,9 suma db 0 count db 9 msg db 10,13,"Sum is:$" .code main: mov ax,@data mov ds,ax xor si,si ; 清零si,无需重复mov si,0 xor cx,cx mov cl,count repeta: mov al,vector[si] add suma,al inc si loop repeta ; 输出提示字符串 mov ah,09h lea dx,msg int 21h ; 拆分求和结果(45)为十位和个位 mov al,suma ; 将求和结果加载到al mov ah,0 ; 把ax清零高8位,准备做除法 mov bl,10 div bl ; 除法后:al=十位(4),ah=个位(5) ; 输出十位数字:转成ASCII后输出 mov dl,al add dl,30h mov ah,02h int 21h ; 输出个位数字:转成ASCII后输出 mov dl,ah add dl,30h mov ah,02h int 21h ; 程序退出 mov ah,4ch int 21h end main
关键改动说明
- 把求和结果
suma加载到al,通过div bl(除数为10)拆分出十位和个位; - 每个数字位加上
30h转换成对应的ASCII字符,再调用int 21h的ah=2功能输出; - 移除了冗余的
mov si,0指令,简化代码; - 调整了指令顺序,让输出逻辑更清晰。
内容的提问来源于stack exchange,提问作者Lola
相关产品推荐
相关产品推荐

