汇编语言统计一组数中的正数,负数和零的个数并显示.为什么输出超过10的时候显示的是ASCII码了

学习 时间:2026-04-02 10:23:59 阅读:8163
汇编语言统计一组数中的正数,负数和零的个数并显示.为什么输出超过10的时候显示的是ASCII码了代码如下:DATA SEGMENTDD1 db 1,4,-5,-2,23,43,24,-12,0,25,-56,0,-64,0,83,52,58,0,9,12COUNT db $-dD1m1 db '1,4,-5,-2,23,43,24,-12,0,25,-56,0,-64,0,83,52,58,0,9,12',0dh,0ah,'gz= 'gz db 0db 0dh,0ah,'z= 'z db 0db 0dh,0ah,'lz= 'lz db 0db 0dh,0ah,'11041905 12','$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARSTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSET DD1MOV CH,0MOV CL,COUNTAGAIN:MOV AL,[SI]CMP AL,0JG GGJL LLINC ZJMP N1GG:INC GZJMP N1LL:INC LZN1:INC SILOOP AGAINMOV AL,30HADD GZ,ALADD Z,ALADD LZ,ALMOV AH,9MOV DX,OFFSET M1INT 21HMOV AH,4CH ;返回DOSINT 21HMAIN ENDPCODE ENDSEND START怎么才能显示正确的数字呢?

最佳回答

怕黑的钢笔

忐忑的绿草

2026-04-02 10:23:59

0到9的ASCII码是30H-39H 大于这个数就应该是显示其它的字符。
需要用函数进行转换再写入,先把GZ Z IZ定义为2字节,函数参数共两个:
bx为要写入的地址,al为要转换的数字。
这样调用:mov bx,offset gz
mov al,gz
call display
display:
push ax ;保护现场
push cx
push dx
mov dh,al ;暂时存放al的值
mov ch,2
mov cl,4
shr al,cl ;先写入高位
d1:
and al,0fh
cmp al,10
jb d2
add al,7
d2:
add al,48
mov dl,al
mov [bx],dl ;写入dl
mov al,dh
inc bx
dec ch
jnz d1
pop dx ;恢复现场
pop cx
pop ax
ret
再问: 你这个应该是插入到哪儿?是把这段代码插入到ADD GZ,AL这句吗?可是运行的时候会报错啊,提示是NTVDM CPU 遇到无效的指令。CS:0401 IP:023d OP:ff ff ff ff ff 选择“关闭”终止应用程序。这是怎么回事啊?
再答: 调试成功的代码,把这个子程序放在main endp后,不然就要用远调用call far ptr display。 gz dw 0 db 0dh,0ah,'z= ' z dw 0 db 0dh,0ah,'lz= ' lz dw 0 ;MOV AL,30H ;ADD GZ,AL ;ADD Z,AL ;ADD LZ,AL mov bx,offset gz mov al,byte ptr gz call display mov bx,offset z mov al,byte ptr z call display mov bx,offset lz mov al,byte ptr lz call display

最新回答共有2条回答

  • 俭朴的黑猫
    回复
    2026-04-02 10:23:59

    0到9的ASCII码是30H-39H 大于这个数就应该是显示其它的字符。需要用函数进行转换再写入,先把GZ Z IZ定义为2字节,函数参数共两个:bx为要写入的地址,al为要转换的数字。这样调用:mov bx,offset gzmov al,gzcall displaydisplay:push ax ;保护现场push cxpush dxmov dh,al ;暂时存放al的值mov ch,2mov cl,4shr al,cl ;先写入高位d1:and al,0fhcmp al,10jb d2add al,7d2:add al,48mov dl,almov [bx],dl ;写入dlmov al,dhinc bxdec chjnz d1pop dx ;恢复现场pop cxpop axret 再问: 你这个应该是插入到哪儿?是把这段代码插入到ADD GZ,AL这句吗?可是运行的时候会报错啊,提示是NTVDM CPU 遇到无效的指令。CS:0401 IP:023d OP:ff ff ff ff ff 选择“关闭”终止应用程序。这是怎么回事啊? 再答: 调试成功的代码,把这个子程序放在main endp后,不然就要用远调用call far ptr display。 gz dw 0 db 0dh,0ah,'z= ' z dw 0 db 0dh,0ah,'lz= ' lz dw 0 ;MOV AL,30H ;ADD GZ,AL ;ADD Z,AL ;ADD LZ,AL mov bx,offset gz mov al,byte ptr gz call display mov bx,offset z mov al,byte ptr z call display mov bx,offset lz mov al,byte ptr lz call display

上一篇 这样的健康生活使她变年轻.英文翻译

下一篇 方程lg²x+(lg2+lg3)lgx+lg2lg3=0的两个根积为x1x2等于