为什么我的输出字符串回事乱码
如图,如题。望不吝赐教。 把代码贴上来 人造人 发表于 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 write 是什么?
人造人 发表于 2017-4-6 11:15
write 是什么?
是一个子程序,我把它的obj传上来 人造人 发表于 2017-4-6 11:15
write 是什么?
放在一起就能可以用了 我重新调整了一下
请添加一下注释
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 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 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 16:41
不要用bp,sp寄存器
不要在一个循环中做太多事
可以了,谢谢啊 人造人 发表于 2017-4-6 16:41
不要用bp,sp寄存器
不要在一个循环中做太多事
给了我很大的启示,我刚学汇编没多久,写程序总是很乱,感觉。你这个很清晰。
页:
[1]