现在部分学校用的还是这本书,清华大学出版社,沈美明、温冬婵编著。
   这当然不是标准答案,自己做的,呵呵,希望对大家有用处。

5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来
.model small
.stack 100H
.code
main proc far
Start:
 push dx
 mov ax,0
 push ax
 
 mov ah,01H
 int 21H
 
 cmp al,61H
 
 jl lop1
 
 cmp al,7BH
 jge lop1
 
 sub al,20H
 mov dl,al
 
 lop1:mov ah,2
 int 21H
 
 ret
End start

5.2 编写一个程序,从键盘接受一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符.
.model small
.386
.code
MAIN PROC FAR
start:
 push ds
 sub ax,ax
 push ax
 
input:
 mov ah,7H
 int 21H
cmpe:
 
 cmp al,20H
 JE  exit
 
 cmp al,61H
 JL  input
 
 cmp al,7AH
 JG  input
print:
 sub al,01H
 mov dl,al
 mov ah,02H
 int 21H
 
 add al,01H
 mov dl,al
 mov ah,02H
 int 21H
 
 add al,01H
 mov dl,al
 mov ah,02H
 int 21H
 
 ;输出换行回车
 mov dl,0AH
 mov ah,02H
 int 21H

 jmp input
exit :
 ret
MAIN ENDP
END start

5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。
.model small
.data
x DB 4 dup(?)
.stack 100H
.code
MAIN PROC FAR
start:
 push ds
 and ax,00H
 push ax
 
 mov ax,1234H
 
 mov cx,04H
 mov si,00H
lop:
 push cx
 mov  cl,04H
 rol ax,cl
 push ax
 and al,0FH
 mov BYTE PTR x[si],al
 pop ax
 pop cx
 add si,2
 Loop lop
 mov al,[X]
 mov bl,[X+2]
 mov cl,[X+4]
 mov dl,[X+6]
print:
 mov ah,02H
 int 21H
 
 mov dl,al
 mov ah,02H
 int 21H
 
 mov dl,bl
 mov ah,02H
 int 21H

 mov dl,cl
 mov ah,02H
 int 21H
exit:
 ret
MAIN ENDP
END start

5.4 编写一个程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示"MATCH",若不同在显示:"NO MATCH"。

.model small
.data
STRING1 DB 'I must study hard'
STRING2 DB 'I must study hard'
X       DB 'MATCH .$'
Y       DB 'NO MATCH.$'

.stack 100H
.code
main proc far
Start:
 push dx
 mov ax,0
 push ax
 
 mov ax,@data
 mov ds,ax
 mov es,ax
 
 lea si,STRING1
 lea di,STRING2
 cld
 
 mov cx,(string2-string1)/ type STRING2
 ret
End start

5.5编写一个程序,要求能从键盘接收一个个位数N,然后响铃N次,(响铃的ASCII为07)。
这题比较有意思,呵呵。
.model small

.code
main proc far
start:
 push ds
 sub ax,ax
 push ax
input:
         mov ah,01H
         int 21H

         cmp al,20H
         je  exit

         cmp al,30H
         jle input
         cmp al,3AH
         jge input
         sub al,30H
         mov cx,ax
         and cx,0FFH
lop:
         mov dl,07H
         mov ah,2H
         int 21H
         loop lop
         jmp input
exit :
         ret

main endp
end start

5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组和负数数组N,并分别把这两个数组中的数据个数显示出来。
.model small
.386
.data
M DB 1,2,3,4,5,6,7,8,9,10,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10
P DB 20 dup(?)
N DB 20 dup(?)
.code
MAIN PROC FAR
start:
  PUSH ds
  AND  ax,0
  PUSH ax
 
  MOV  ax,@data
  mov  ds,ax
  MOV  bx,0
  MOV  si,0
  MOV  di,0
  MOV  cx,20D
 
cmpe  :
  CMP  M[bx],0
  JL  ifLow
hight :
  MOV  al,byte ptr M[bx]
  MOV  byte ptr P[si],al
  inc  si
  JMP  commonContrl
ifLow :
  MOV  al,byte ptr M[bx]
  MOV  byte ptr N[di],al
  INC  di
commonContrl:
  INC  bx
  loop cmpe
  mov  ax,si
  call showNumber
  call printCR
  mov  ax,di
  call showNumber
exit: ret
MAIN ENDP
;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;
showNumber PROC NEAR
covernum:
  DAA
  MOV  dx,ax
  MOV  cl,2H
show:
  ROL  dl,4H
  push dx
  AND  dl,0fH
  ADD  dl,30H
  MOV  ah,02H
  int  21H
  pop  dx
  loop show
  ret
showNumber ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
printCR PROC NEAR
  mov dl,0aH
  mov ah,02H
  int 21H
  mov dl,0dH
  mov ah,02H
  int 21H
  ret
printCR ENDP

end start

5.7编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。
     此题根据题意要求应该使用完整汇编格式,因为精简格式也使用DATA....

dataarea segment
DATA DW 3322H,4555H,200H,3544H,1245H
num  DB ($-DATA)/2
dataarea ends

code segment

assume cs:code,ds:dataarea

MAIN PROC FAR
start:
  push ds
  mov  ax,0H
  push ax
 
  mov  ax,dataarea
  mov  ds,ax
  mov  dx,0H               ;偶数数量计数
  mov  cx,Word ptr [num]
  mov  si,0H
isO:
  mov  bx,WORD PTR DATA[si]
  shr  bx,1H
  jnc  addDX
  jmp  commonControl
addDX:
  ADD  dx,1H
  cmp  dx,1H
  je   firstAXValue
compare:
  mov  bx,WORD PTR DATA[si]
  cmp  bx,ax
  jge  commonControl
  mov  ax,bx
commonControl:
  ADD  si,2H
  loop isO
  jmp  exit
firstAXvalue:
  mov ax,WORD PTR DATA[si]
  jmp compare
exit:
ret
main endp
code ends
end start

5.8(刚刚补上来)
cseg segment
main proc far
assume cs:cseg
start:
push ds
sub ax,ax
push ax
mov ax,3
mov cx,8
mov dl,0
next3:
ror ax,1
jnc next1
ror ax,1
jnc next2
inc dl
next2:
loop next3
add dl,30h
mov ah,2
int 21h
mov ah,4ch
int 21h
next1:
ror ax,1
jmp next2

main endp
cseg ends
end start

  5.9编写一个汇编语言程序,要求从键盘上接收一个思维的十六位进制数,并在终端上显示与它等值的二进制数。  
  .model   small  
  .386  
  .code  
  main   proc   far  
  start:  
  push   ds  
  mov     ax,0  
  push   ax  
  mov     ax,0  
  mov     cx,4  
  mov     dx,0  
  input:  
  mov     ah,1H  
  int     21H  
  cmp     al,30H  
  jl       input  
          cmp     al,39H  
          jle     s  
  cmp     al,61H  
  jl       input  
  cmp     al,66H  
  jg       input  
  sub     al,27H  
  s:  
  sub     al,30H  
  add     dl,al  
  cmp     cx,1H  
  je       f  
  rol     dx,4  
   
  f:  
  loop   input  
  exit:  
  call   print  
  ret  
  main   endp  
   
  print   proc   near  
  mov   cx,10H  
  p:    
                            rol     dx,1  
  push   dx  
  and     dx,1  
  add     dx,30H  
  mov     ah,2  
  int     21H  
  pop     dx  
  loop   p  
  ret  
  print   endp  
  end   start  
   
  5.10设有一段英文,其变量字符名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式"SUN   XXXX"显示出次数。  
  .model   small    
  .386  
  .data  
  ENG           db   'SUN's   SUN   JAVA',24H     ;;;;24H   =   $  
  MESSAGE   db   'SUN:','$'  
  .stack   100H  
  .code  
  MAIN   PROC   FAR  
  start:  
  PUSH   DS  
  AND     AX,0  
  PUSH   AX  
   
  MOV     AX,@data  
  MOV     DS,AX  
  ;------------------------  
  MOV     AX,0H  
  MOV     SI,1H  
  subSI1:  
  SUB     SI,1H  
  subSI2:  
  SUB     SI,1H  
  compareS:  
  ADD     SI,1H  
  MOV     DL,ENG[SI]  
  CMP     DL,24H  
  JE       print  
  CMP     DL,53H  
  JNE     compareS  
  compareU:  
  ADD     SI,1H  
  MOV     DL,ENG[SI]  
  CMP     DL,55H  
  JNE     subSI2  
  compareN:  
  ADD     SI,1H  
  MOV     DL,ENG[SI]  
  CMP     DL,4EH  
  JNE     subSI1  
  INC     AX  
  JMP     compares  
  print:  
  LEA     DX,MESSAGE  
  PUSH   AX  
  MOV     AH,09H  
  INT     21H  
  POP     AX  
  call   showNumber  
  exit:  
  ret  
  MAIN   ENDP  
  ;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;  
  showNumber   PROC   NEAR  
  covernum:  
  DAA  
  MOV     dx,ax  
  MOV     cl,4H  
  show:  
  ROL     dx,4H  
  push   dx  
  AND     dx,0fH  
  ADD     dx,30H  
  MOV     ah,02H  
  int     21H  
  pop     dx  
  loop   show  
  ret  
  showNumber   ENDP  
  END   start  
   
  5.11从键盘输入一系列以$为结束副的字符串,然后对其中的非数字字符计数,并显示出计数结果。  
  .model   small  
  .386  
  .code  
  MAIN   PROC   FAR  
  start:  
  push   ds  
  mov     ax,0  
  push   ax  
   
  mov     cx,0  
  input:  
  mov     ah,1H  
  int     21H  
  compare:  
  cmp     al,24H  
  je       print  
  cmp     al,30H  
  jl       addCount  
  cmp     al,39H  
  jg       addCount  
  addCount:  
  add     ax,1H  
  jmp     input  
  print:  
  call   showNumber  
  exit: ret  
  MAIN   ENDP  
  ;;;;;;;;;;;;;;;;;注意,ShowNumber这个子过程有问题,请自行修改;;;;;;;;;;;;;;;;  
  showNumber   PROC   NEAR  
  covernum:  
  DAA  
  MOV     dx,ax  
  MOV     cl,2H  
  show:  
  ROL     dl,4H  
  push   dx  
  AND     dl,0fH  
  ADD     dl,30H  
  MOV     ah,02H  
  int     21H  
  pop     dx  
  loop   show  
  ret  
  showNumber   ENDP  
  END   start  
   
  5.12   有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。  
  .model   small  
  .386  
  .stack   100H  
  .data  
  mem   dw   12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,12,0,0,0,0,0,1,2,3,6,4,7,8,2,1,0,0,54,5,0,2,4,7,8,0,5,6,2,1,4,8,5,1,45,7,5,1,2,0,2,4,0,2,54,0,45,7,5,1,2,0,2,4,0,2  
  .code  
  MAIN   PROC   FAR  
  start:  
  push   ds  
  and     ax,0  
  push   ax  
   
  mov     ax,@data  
  mov     ds,ax  
  ;----------------------  
  mov     ax,0H  
  mov     bx,64H  
  mov     cx,64H  
  mov     si,0FFFEH  
  repeat:  
  ADD     si,2H  
  cmp     MEM[si],0H  
  JE       calls  
  loop   repeat  
  calls:  
  INC     ax  
  call   sort  
  cmp     ax,1H  
  JE       lastValue  
  DEC     cx  
  jmp     repeat  
  exit   :  
  ret  
  lastValue:  
  mov     mem[bx],0H  
  DEC     cx  
  jmp     repeat  
   
  MAIN   ENDP  
   
  sort   PROC   NEAR  
  push   cx  
  push   si  
  sub     si,2H  
  s:  
  add     si,2H  
  mov     dx,mem[si]  
  mov     mem[si+2],dx  
  loop   s  
  return:  
  pop   si  
  pop   cx  
  ret  
  sort   ENDP  
  END   start