[课题2.3] 汇编入门小程序联系2
课题要求:编写3个小程序

(1)在以BUF为起始地址的数组中存入了一个字符串,检测该字符串中是否有数字字符,若有,将DL的D3位置1,否则将该位置0。

(2)从键盘输入一个字符串,分类统计该字符串中字母、数字及其它字符的个数,并显示出分类统计值。

(3)在起始地址为ARRAY的数组中,存入了100个16位带符号数,试求该数组中的最大值、最小值及平均值,并将这3个值显示出来。

实现[课题2.3](1)
 

代码:
assume CS:code,DS:data

data segment
  buf db 'caaaaabbbbbbbbbcccccecccaaabbb','$'
data ends

code segment
start:   mov AX,data
  mov DS,AX

  lea BX,buf
  mov CX,001ch
  mov DX,0h
s:  
  mov AH,[BX]
  cmp AH,30h
  js theend
  cmp AH,39h
  jns theend
  
s1:  or DX,8h
  
theend:  
  inc BX
  loop s
  
  mov ax,4c00h
  int 21h
code ends
end  start
实现[课题2.3](2)
 
代码:
assume CS:code,DS:data

data segment
line db '23456@#%SDFghj','$'
da1 db 0
da2 db 0
da3 db 0
res1 db 0ah,0dh,'letter:','$'
res2 db 0ah,0dh,'number:','$'
res3 db 0ah,0dh,'others:','$'
data ends

code segment
start:   
  mov AX,data
  mov DS,AX

  lea BX,line
  mov CX,000eh

s:  
  mov DL,[BX]
  cmp DL,30h
  js s0
  cmp DL,39h
  jns c1

s1:  
  mov DH,da1
  inc DH
  mov da1,DH
  jmp theends
c1:  
  cmp DL,41h
  js s0

c2:  
  cmp DL,5ah
  jns c3

s2:  
  mov DH,da2
  inc DH
  mov da2,DH
  jmp theends

c3:  
  cmp DL,61h
  js s0
  cmp DL,7ah
  js s2
  jz s2

s0:  
  mov DH,da3
  inc DH
  mov da3,DH
  jmp theends

theends:  
  inc BX
  loop s
  
  lea DX,line
  mov Ah,09
  int 21h

  lea DX,res1
  mov Ah,09
  int 21h

        mov DL,DS:[da1]
  add DL,48
        mov Ah,02
  int 21h

  lea DX,res2
  mov Ah,09
  int 21h

       mov DL,DS:[da2]
  add DL,48
        mov Ah,02
  int 21h

  lea DX,res3
  mov Ah,09
  int 21h

       mov DL,DS:[da3]
   add DL,48
        mov Ah,02
  int 21h
  
        mov AX,4c00h
   int 21h 
code ends
end  start
实现[课题2.3](3)
 
代码:
assume cs:code,ds:data

data segment 
 array dw 1,2,3,4,5,6,7,8,9,10
       dw 2,2,3,4,5,6,7,8,9,10
       dw 3,2,3,4,5,6,7,8,9,200
       dw 4,2,3,4,5,6,7,8,9,10
       dw 5,2,3,4,5,6,7,8,9,10
       dw 6,2,3,4,51,6,70,8,9,10
       dw 7,2,3,4,5,6,7,8,9,10
       dw 8,2,3,4,5,6,7,8,9,101
       dw 9,2,3,4,5,6,7,8,9,10
       dw 10,2,3,4,5,6,7,8,9,10
 temp   dw ? 
 result dw ?
 max    dw ?
 min    dw ?
 aver   dw ?
data ends  

code segment
start:
       mov ax,data
  mov ds,ax

  mov ax,0      ;求和
  mov bx,0
  mov cx,100
s:        
  add ax,array[bx]
   inc bx
  inc bx
  loop s
  mov ds:[result],ax
  
  mov bx,0      ;求最大值
  mov ax,array[bx]
  mov ds:[temp],ax
  mov cx,100
s1:
  mov ax,ds:[temp]
  cmp array[bx],ax
  jc  less
  mov ax,array[bx]
  mov ds:[temp],ax
less:   
  inc bx
  inc bx
  loop s1
  mov ax,ds:[temp]
  mov ds:[max],ax

  mov bx,0      ;求最小值
  mov ax,array[bx]
  mov ds:[temp],ax
  mov cx,100
s2:
  mov ax,ds:[temp]
  cmp array[bx],ax
  jnc  greater
  mov ax,array[bx]
  mov ds:[temp],ax
greater: 
  inc bx
  inc bx
  loop s2
  mov ax,ds:[temp]
  mov ds:[min],ax
  
  mov ax,ds:[result]
  mov dx,0
  mov bx,100      ;求平均值
  div bx
  mov ds:[aver],ax    
  
  mov ax,4c00h
  int 21h

code ends
end start