昌西 发表于 2017-4-5 18:56:48

为什么我的输出字符串回事乱码

如图,如题。望不吝赐教。

人造人 发表于 2017-4-5 19:18:25

把代码贴上来

昌西 发表于 2017-4-5 23:45:00

人造人 发表于 2017-4-5 19:18
把代码贴上来

extrnwrite:far
data    segment
str1   db0dh,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   db0dh,0ah,"The max is $"
str6   db0dh,0ah,"The min is $"
sum      dw0
array    dw40,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   macromsg
      lea dx,msg
      mov ah,9
      int21h
      endm
disp   macrointeger
      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,                   ;bp为最大值
      mov sp,                  ;sp为最小值

      

again:   disp
      mov dl,20h                   ;单字符输出空格
      mov ah,2
      int21h
      cmp word ptr ,0
      jnznz
      incsum
      cmp word ptr ,bp
      jg greater
      cmp word ptr ,sp
      jl less
      jmpnext
nz:      jgplus
      incdi
      cmp word ptr ,bp
      jg greater
      cmp word ptr ,sp
      jl less
      jmpnext
plus:    incsi
         cmp word ptr ,bp
      jg greater
      cmp word ptr ,sp
      jl less
greater:mov bp,
         jmp next
less:   mov sp,
         jmp next      
next:    incbx
      incbx
      loopagain
      
      outstrstr1
      disp sum
      outstrstr2
      outstrstr1
      disp si
      outstrstr3
      outstrstr1
      disp di
      outstrstr4
      outstrstr5
      disp bp
      outstrstr6
      disp sp
      

   
      mov ax,4c00h
      int21h
code    ends
      endstart

人造人 发表于 2017-4-6 11:15:11

write 是什么?

昌西 发表于 2017-4-6 11:38:22

人造人 发表于 2017-4-6 11:15
write 是什么?

是一个子程序,我把它的obj传上来

昌西 发表于 2017-4-6 11:42:47

人造人 发表于 2017-4-6 11:15
write 是什么?

放在一起就能可以用了

人造人 发表于 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
        int21h
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, ;bp为最大值
        mov sp, ;sp为最小值

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

        cmp word ptr , 0
        jnz nz

        inc sum
        cmp word ptr , bp
        jg greater

        cmp word ptr , sp
        jl less
        jmp next

nz:
        jgplus
       
        incdi
        cmp word ptr ,bp
        jg greater
       
        cmp word ptr ,sp
        jl less
        jmpnext
       
plus:
        inc si
        cmp word ptr , bp
        jg greater
       
        cmp word ptr , sp
        jl less
       
greater:
        mov bp,
        jmp next
       
less:
        mov sp,
        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

昌西 发表于 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
      int21h
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, ;bp为最大值
      mov sp, ;sp为最小值

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

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

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

nz:
      jgplus       ;数据比0大,跳转到pius,否则不跳转
      
      incdi       ;记下小于0的数据的个数
      cmp word ptr ,bp
      jg greater
      
      cmp word ptr ,sp
      jl less
      jmpnext            ;跳转到next
      
plus:
      inc si      ;记下比0大的数据的个数
      cmp word ptr , bp
      jg greater
      
      cmp word ptr , sp
      jl less
      
greater:
      mov bp,          ;将比当前最大值大的bx指向的数据作为新的最大值
      jmp next
      
less:
      mov sp,    ;把比当前最小值小的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

人造人 发表于 2017-4-6 16:41:39

昌西 发表于 2017-4-6 13:43


不要用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, 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, 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, 0
        jnl next2
       
        inc less_count
next2:
        add bx, 2
        loop s2
       
;查找最大值
find_max:
        lea bx, array
        mov cx, len
        mov ax,
        mov max, ax
s3:
        mov ax,
        cmp max, ax
        jg next3
       
        mov max, ax
next3:
        add bx, 2
        loop s3
       
;查找最小值
find_min:
        lea bx, array
        mov cx, len
        mov ax,
        mov min, ax
s4:
        mov ax,
        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

昌西 发表于 2017-4-6 18:48:21

人造人 发表于 2017-4-6 16:41
不要用bp,sp寄存器

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


可以了,谢谢啊

昌西 发表于 2017-4-6 18:52:57

人造人 发表于 2017-4-6 16:41
不要用bp,sp寄存器

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


给了我很大的启示,我刚学汇编没多久,写程序总是很乱,感觉。你这个很清晰。
页: [1]
查看完整版本: 为什么我的输出字符串回事乱码