鱼C论坛

 找回密码
 立即注册
查看: 3479|回复: 10

[已解决]为什么我的输出字符串回事乱码

[复制链接]
发表于 2017-4-5 18:56:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如图,如题。望不吝赐教。
最佳答案
2017-4-6 16:41:39

不要用bp,sp寄存器

不要在一个循环中做太多事

我看不懂你要干嘛
我帮你改写了一下
assume cs:code, ds:data

extrn write:far

data segment
        str1 db 0dh, 0ah, "There are  $"
        str2 db "  data equal to zero in the array! $"
        str3 db "  data greater than zero in the array! $"
        str4 db "  data less than zero in the array! $"
        str5 db 0dh, 0ah, "The max is $"
        str6 db 0dh, 0ah, "The min is $"
        
        zero_count dw 0 ;等于0的计数器
        greater_count dw 0 ;大于0的计数器
        less_count dw 0 ;小于0的计数器
        
        max dw 0 ;最大值
        min dw 0 ;最小值

        array dw 40, 12, 0, -2, 23, -12, 0, 2, -10, 100, 0, -100
        len equ ($ - array) / 2
data ends


code    segment

outstr macro msg
        lea dx, msg
        mov ah, 9
        int 21h ;调用9号功能输出字符
endm
        
disp macro integer
        mov ax, integer
        stc
        call far ptr write
endm ;这一段调用子程序write用来输出

start:
        mov ax, data
        mov ds, ax
        
        
;查找等于0的个数
find_zero:
        lea bx, array
        mov cx, len
        mov zero_count, 0
s:
        cmp word ptr[bx], 0
        jne next
        
        inc zero_count
next:
        add bx, 2
        loop s


;查找大于0的个数
find_greater_zero:
        lea bx, array
        mov cx, len
        mov greater_count, 0
s1:
        cmp word ptr[bx], 0
        jng next1
        
        inc greater_count
next1:
        add bx, 2
        loop s1

;查找小于0的个数
find_less_zero:
        lea bx, array
        mov cx, len
        mov less_count, 0
s2:
        cmp word ptr[bx], 0
        jnl next2
        
        inc less_count
next2:
        add bx, 2
        loop s2
        
;查找最大值
find_max:
        lea bx, array
        mov cx, len
        mov ax, [bx]
        mov max, ax
s3:
        mov ax, [bx]
        cmp max, ax
        jg next3
        
        mov max, ax
next3:
        add bx, 2
        loop s3
        
;查找最小值
find_min:
        lea bx, array
        mov cx, len
        mov ax, [bx]
        mov min, ax
s4:
        mov ax, [bx]
        cmp min, ax
        jl next4
        
        mov min, ax
next4:
        add bx, 2
        loop s4
        
        
        outstr str1
        disp zero_count                ;输出等于0的数据的个数
        outstr str2
        outstr str1
        disp greater_count        ;输出大于0的数据的个数
        outstr str3
        outstr str1
        disp less_count                ;输出小于0的数据的个数
        outstr str4
        outstr str5
        disp max        ;输出最大值
        outstr str6
        disp min        ;输出最小值

        mov ax, 4c00h
        int 21h
code ends

end start

出现的问题

出现的问题

代码行

代码行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-5 19:18:25 | 显示全部楼层
把代码贴上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-5 23:45:00 | 显示全部楼层

extrn  write:far
data    segment
str1     db  0dh,0ah,"There are  $"
str2     db  "  data equal to zero in the array! $"
str3     db  "  data greater than zero in the array! $"
str4     db  "  data less than zero in the array! $"
str5     db  0dh,0ah,"The max is $"
str6     db  0dh,0ah,"The min is $"
sum      dw  0
array    dw  40,12,0,-2,23,-12,0,2,-10,100,0,-100
len      equ  ($-array)/2
data    ends
code    segment
assume cs:code,ds:data
outstr   macro  msg
        lea dx,msg
        mov ah,9
        int  21h
        endm
disp     macro  integer
        mov ax,integer
        stc
        call far ptr write
        endm
start:    mov ax,data
        mov ds,ax
        mov cx,len
        mov sum,0                   ;sum为等于0数的计数器
        mov si,0                   ;si为大于0数的计数器
        mov di,0                   ;di为小于0数的计数器
      
        lea bx,array
        mov bp,[bx]                   ;bp为最大值
        mov sp,[bx]                    ;sp为最小值

      

again:   disp [bx]
        mov dl,20h                   ;单字符输出空格
        mov ah,2
        int  21h
        cmp word ptr [bx],0
        jnz  nz
        inc  sum
        cmp word ptr [bx],bp
        jg greater
        cmp word ptr [bx],sp
        jl less
        jmp  next
nz:      jg  plus
        inc  di
        cmp word ptr [bx],bp
        jg greater
        cmp word ptr [bx],sp
        jl less
        jmp  next
plus:    inc  si
         cmp word ptr [bx],bp
        jg greater
        cmp word ptr [bx],sp
        jl less
greater:  mov bp,[bx]
         jmp next
less:     mov sp,[bx]
         jmp next        
next:    inc  bx
        inc  bx
        loop  again
        
        outstr  str1
        disp sum
        outstr  str2
        outstr  str1
        disp si
        outstr  str3
        outstr  str1
        disp di
        outstr  str4
        outstr  str5
        disp bp
        outstr  str6
        disp sp
        

     
        mov ax,4c00h
        int  21h
code    ends
        end  start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-6 11:15:11 | 显示全部楼层
write 是什么?
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-6 11:38:22 | 显示全部楼层

是一个子程序,我把它的obj传上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-6 11:42:47 | 显示全部楼层

放在一起就能可以用了

DISPINT.zip

316 Bytes, 下载次数: 1

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-6 12:34:57 | 显示全部楼层
我重新调整了一下

请添加一下注释
assume cs:code, ds:data

extrn write:far

data segment
        str1 db 0dh, 0ah, "There are  $"
        str2 db "  data equal to zero in the array! $"
        str3 db "  data greater than zero in the array! $"
        str4 db "  data less than zero in the array! $"
        str5 db 0dh, 0ah, "The max is $"
        str6 db 0dh, 0ah, "The min is $"
        sum dw 0
        
        array dw 40, 12, 0, -2, 23, -12, 0, 2, -10, 100, 0, -100
        len equ ($ - array) / 2
data ends

code    segment

outstr macro msg
        lea dx, msg
        mov ah, 9
        int  21h
endm
        
disp macro integer
        mov ax, integer
        stc
        call far ptr write
endm

start:
        mov ax, data
        mov ds, ax
        mov cx, len
        mov sum, 0 ;sum为等于0数的计数器
        mov si, 0 ;si为大于0数的计数器
        mov di, 0 ;di为小于0数的计数器

        lea bx, array
        mov bp, [bx] ;bp为最大值
        mov sp, [bx] ;sp为最小值

again:
        disp [bx]
        mov dl, 20h ;单字符输出空格
        mov ah, 2
        int 21h

        cmp word ptr [bx], 0
        jnz nz

        inc sum
        cmp word ptr [bx], bp
        jg greater

        cmp word ptr [bx], sp
        jl less
        jmp next

nz:
        jg  plus
        
        inc  di
        cmp word ptr [bx],bp
        jg greater
        
        cmp word ptr [bx],sp
        jl less
        jmp  next
        
plus:
        inc si
        cmp word ptr [bx], bp
        jg greater
        
        cmp word ptr [bx], sp
        jl less
        
greater:
        mov bp, [bx]
        jmp next
        
less:
        mov sp, [bx]
        jmp next
        
next:
        inc bx
        inc bx
        loop again
        
        outstr str1
        disp sum
        outstr str2
        outstr str1
        disp si
        outstr str3
        outstr str1
        disp di
        outstr str4
        outstr str5
        disp bp
        outstr str6
        disp sp
        
        mov ax, 4c00h
        int 21h
code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-6 13:43:11 | 显示全部楼层
人造人 发表于 2017-4-6 12:34
我重新调整了一下

请添加一下注释
assume cs:code, ds:data

extrn write:far

data segment
        str1 db 0dh, 0ah, "There are  $"
        str2 db "  data equal to zero in the array! $"
        str3 db "  data greater than zero in the array! $"
        str4 db "  data less than zero in the array! $"
        str5 db 0dh, 0ah, "The max is $"
        str6 db 0dh, 0ah, "The min is $"
        sum dw 0
        
        array dw 40, 12, 0, -2, 23, -12, 0, 2, -10, 100, 0, -100
        len equ ($ - array) / 2
data ends

code    segment

outstr macro msg
        lea dx, msg
        mov ah, 9
        int  21h
endm    ;这一段调用9号功能输出字符
        
disp macro integer
        mov ax, integer
        stc
        call far ptr write
endm   ;这一段调用子程序write用来输出

start:
        mov ax, data
        mov ds, ax
        mov cx, len
        mov sum, 0 ;sum为等于0数的计数器
        mov si, 0 ;si为大于0数的计数器
        mov di, 0 ;di为小于0数的计数器

        lea bx, array ;获取array的首地址给bx寄存器
        mov bp, [bx] ;bp为最大值
        mov sp, [bx] ;sp为最小值

again:
        disp [bx]
        mov dl, 20h ;单字符输出空格
        mov ah, 2
        int 21h     ;输出一个数组内的数据并输出一个空格
                
        cmp word ptr [bx], 0   ;bx里的数据跟0做对比
        jnz nz    ;数据不等于0,则跳转到标号nz,等于0则不跳转

        inc sum    ;数据等于0,sum加1,记下等于0的数据的个数
        cmp word ptr [bx], bp     ;数据与当前最大值比较
        jg greater        ;数据比当前最大值大,跳转到greater,否则不跳转

        cmp word ptr [bx], sp   ;数据与当前最小值比较
        jl less                   ;数据比当前最小值小,跳转到less,否则不跳转
        jmp next

nz:
        jg  plus       ;数据比0大,跳转到pius,否则不跳转
        
        inc  di       ;记下小于0的数据的个数
        cmp word ptr [bx],bp
        jg greater
        
        cmp word ptr [bx],sp
        jl less
        jmp  next            ;跳转到next
        
plus:
        inc si      ;记下比0大的数据的个数
        cmp word ptr [bx], bp
        jg greater
        
        cmp word ptr [bx], sp
        jl less
        
greater:
        mov bp, [bx]         ;将比当前最大值大的bx指向的数据作为新的最大值
        jmp next
        
less:
        mov sp, [bx]     ;把比当前最小值小的bx指向的数据作为新的最小值
        jmp next
        
next:
        inc bx    
        inc bx            ;bx+2,指向下一个字数据
        loop again    ;从again标号再次开始
        
        outstr str1        ;输出字符串
        disp sum            ;输出等于0的数据的个数
        outstr str2
        outstr str1
        disp si             ;输出大于0的数据的个数
        outstr str3
        outstr str1
        disp di         ;输出小于0的数据的个数
        outstr str4
        outstr str5
        disp bp          ;输出最大值
        outstr str6
        disp sp          ;输出最小值
        
        mov ax, 4c00h
        int 21h
code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-6 16:41:39 | 显示全部楼层    本楼为最佳答案   

不要用bp,sp寄存器

不要在一个循环中做太多事

我看不懂你要干嘛
我帮你改写了一下
assume cs:code, ds:data

extrn write:far

data segment
        str1 db 0dh, 0ah, "There are  $"
        str2 db "  data equal to zero in the array! $"
        str3 db "  data greater than zero in the array! $"
        str4 db "  data less than zero in the array! $"
        str5 db 0dh, 0ah, "The max is $"
        str6 db 0dh, 0ah, "The min is $"
        
        zero_count dw 0 ;等于0的计数器
        greater_count dw 0 ;大于0的计数器
        less_count dw 0 ;小于0的计数器
        
        max dw 0 ;最大值
        min dw 0 ;最小值

        array dw 40, 12, 0, -2, 23, -12, 0, 2, -10, 100, 0, -100
        len equ ($ - array) / 2
data ends


code    segment

outstr macro msg
        lea dx, msg
        mov ah, 9
        int 21h ;调用9号功能输出字符
endm
        
disp macro integer
        mov ax, integer
        stc
        call far ptr write
endm ;这一段调用子程序write用来输出

start:
        mov ax, data
        mov ds, ax
        
        
;查找等于0的个数
find_zero:
        lea bx, array
        mov cx, len
        mov zero_count, 0
s:
        cmp word ptr[bx], 0
        jne next
        
        inc zero_count
next:
        add bx, 2
        loop s


;查找大于0的个数
find_greater_zero:
        lea bx, array
        mov cx, len
        mov greater_count, 0
s1:
        cmp word ptr[bx], 0
        jng next1
        
        inc greater_count
next1:
        add bx, 2
        loop s1

;查找小于0的个数
find_less_zero:
        lea bx, array
        mov cx, len
        mov less_count, 0
s2:
        cmp word ptr[bx], 0
        jnl next2
        
        inc less_count
next2:
        add bx, 2
        loop s2
        
;查找最大值
find_max:
        lea bx, array
        mov cx, len
        mov ax, [bx]
        mov max, ax
s3:
        mov ax, [bx]
        cmp max, ax
        jg next3
        
        mov max, ax
next3:
        add bx, 2
        loop s3
        
;查找最小值
find_min:
        lea bx, array
        mov cx, len
        mov ax, [bx]
        mov min, ax
s4:
        mov ax, [bx]
        cmp min, ax
        jl next4
        
        mov min, ax
next4:
        add bx, 2
        loop s4
        
        
        outstr str1
        disp zero_count                ;输出等于0的数据的个数
        outstr str2
        outstr str1
        disp greater_count        ;输出大于0的数据的个数
        outstr str3
        outstr str1
        disp less_count                ;输出小于0的数据的个数
        outstr str4
        outstr str5
        disp max        ;输出最大值
        outstr str6
        disp min        ;输出最小值

        mov ax, 4c00h
        int 21h
code ends

end start

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
兰陵月 + 5 + 5 + 3 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

 楼主| 发表于 2017-4-6 18:48:21 | 显示全部楼层
人造人 发表于 2017-4-6 16:41
不要用bp,sp寄存器

不要在一个循环中做太多事

可以了,谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-6 18:52:57 | 显示全部楼层
人造人 发表于 2017-4-6 16:41
不要用bp,sp寄存器

不要在一个循环中做太多事

给了我很大的启示,我刚学汇编没多久,写程序总是很乱,感觉。你这个很清晰。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表