Liny_@NotePad

沉迷ACG中

宏指令设计实验

YOYO posted @ 2008年12月06日 08:14 in 【杂物箱】乱七八糟 with tags 汇编 , 2117 阅读

1、下面是按要求实现的源程序,现要求将源程序中的重复部分指令改用宏指令实现。
从键盘输入一字符,判断该字符是小写字母、大写字母、数字还是其它字符。若输入为小写字母,则显示“You Input a Lowercase Letter!”; 若输入为大写字母,则显示“You Input a Uppercase Letter!”; 若输入为数字,则显示“You Input a Digit!”; 若输入为其它字符,则显示“You Input Other Letter!”。

  1. data  SEGMENT
  2.       INfor1  DB        0ah,0dh,'please press any key to input a letter:$'
  3.       INfor2  DB        0ah,0dh,'you input a lowetcase letter!$'
  4.       INfor3  DB        0ah,0dh,'you input a uppercase letter!$'
  5.       INfor4  DB        0ah,0dh,'you input a digit!$'
  6.       INfor5  DB        0ah,0dh,'you input a other letter!$'
  7. data  ENDS
  8. code  SEGMENT
  9.       ASSUME    CS:code,DS:data
  10. start:        MOV       AX,data
  11.               MOV       DS,AX
  12.               MOV       DX,OFFSET INfor1
  13.               MOV       AH,09
  14.               INT       21h
  15.               MOV       AH,01h
  16.               INT       21h
  17.               CMP       AL,'0'
  18.               JB        other
  19.               CMP       AL,'9'
  20.               JBE       DIgit
  21.               CMP       AL,'A'
  22.               JB        other
  23.               CMP       AL,'Z'
  24.               JBE       upper
  25.               CMP       AL,'a'
  26.               JB        other
  27.               CMP       AL,'z'
  28.               JBE       LOWer
  29.               JMP       pend
  30. LOWer:        MOV       DX,OFFSET INfor2
  31.               MOV       AH,09h
  32.               INT       21h
  33.               JMP       pend
  34. upper:        MOV       DX,OFFSET INfor3
  35.               MOV       AH,09h
  36.               INT       21h
  37.               JMP       pend
  38. DIgit:        MOV       DX,OFFSET INfor4
  39.               MOV       AH,09h
  40.               INT       21h
  41.               JMP       pend
  42. other:        MOV       DX,OFFSET INfor5
  43.               MOV       AH,09h
  44.               INT       21h
  45.              
  46. pend:         ;MOV       AH,01               
  47.               ;INT  21h
  48.              
  49.               MOV  AH,4cH     
  50.               INT  21h
  51. code          ENDS
  52.               END    START

改用宏指令实现:

  1. INPUT MACRO
  2.         MOV AH,01H
  3.         INT 21H
  4.         ENDM
  5. OUTPUT MACRO XX
  6.         MOV DX,OFFSET INFOR&XX
  7.         MOV AH,09H
  8.         INT 21H
  9.         ENDM
  10. DATAS SEGMENT
  11.     INFOR1 DB 0AH,0DH,'please press any key to input a letter:$'
  12.     INFOR2 DB 0AH,0DH,'you input a lowercase letter!$'
  13.     INFOR3 DB 0AH,0DH,'you input a uppercase letter!$'
  14.     INFOR4 DB 0AH,0DH,'you input a digit!$'
  15.     INFOR5 DB 0AH,0DH,'you input a other letter!$'
  16. DATAS ENDS
  17.  
  18. CODES SEGMENT
  19.     ASSUME CS:CODES,DS:DATAS
  20. START:
  21.     MOV AX,DATAS
  22.     MOV DS,AX
  23.    
  24.     OUTPUT 1
  25.    
  26.     INPUT
  27.    
  28.     CMP AL,'0'
  29.     JB OTHER
  30.    
  31.     CMP AL,'9'
  32.     JBE DIGIT
  33.    
  34.     CMP AL,'A'
  35.     JB OTHER
  36.    
  37.     CMP AL,'Z'
  38.     JBE UPPER
  39.    
  40.     CMP AL,'a'
  41.     JB OTHER
  42.    
  43.     CMP AL,'z'
  44.     JBE LOWER
  45.    
  46.     JMP OTHER
  47.    
  48. LOWER:
  49.     OUTPUT 2
  50.     JMP RESULT
  51.    
  52. UPPER:
  53.         OUTPUT 3
  54.         JMP RESULT
  55.        
  56. DIGIT:
  57.         OUTPUT 4
  58.         JMP RESULT
  59.        
  60. OTHER:
  61.         OUTPUT 5
  62.        
  63. RESULT:  
  64.     MOV AH,4CH
  65.     INT 21H
  66. CODES ENDS
  67.     END START

2、编程实现:找出下面数据段所定义的20个数中的最大数,并将找到的最大数以十进制数的形式在屏幕上显示出来,能用宏指令的用宏指令。

  1. DATAS SEGMENT   
  2.  xx   Db 73,59,61,45,81,107,37,25,14,64
  3.        db 3,17,9,23,55,97,115,78,121,67
  4.        db 215,137,99,241,36,58,87,100,74,62
  5. yy    db ?
  6. BUF   DB "THE MAX IS:$"
  7. DATAS ENDS

感谢fansy同学的帮忙 TAT 终于写出来了:

  1. ;-------------------------------------------------------------------
  2. ;       Title:
  3. ;              找出下面数据段所定义的20个数中的最大数,
  4. ;       并将找到的最大数以十进制数的形式在屏幕上显示出来。
  5. ;
  6. ;       Code by linyq@2008-12-4
  7. ;-------------------------------------------------------------------
  8. OUTPUT MACRO WW      ; 输出指定的字符
  9.         MOV DL,WW
  10.         ADD DL,30H
  11.         MOV AH,02H
  12.         INT 21H
  13. ENDM
  14. ;-------------------------------------------------------------------
  15. DECDIV MACRO RESULT,XX        ; 输出除法指令后的商
  16.         MOV AX,RESULT
  17.         MOV DX,0
  18.         DIV XX
  19.         MOV RESULT,DX
  20.         OUTPUT AL
  21. ENDM
  22. ;-------------------------------------------------------------------
  23. DATAS SEGMENT
  24.         XX      DB 73,59,61,45,81,107,37,25,14,64
  25.                 DB      3,17,9,23,55,97,115,78,121,67
  26.                 DB 215,137,99,241,36,58,87,100,74,62
  27.         BUF DB 'The max is:$'
  28.         CNT EQU $-XX                    ; CNT为XX数组长度
  29. DATAS ENDS
  30. ;-------------------------------------------------------------------
  31. CODES SEGMENT
  32. ;-------------------------------------------------------------------
  33. MAIN PROC FAR
  34.         ASSUME CS:CODES,DS:DATAS
  35. START:
  36.     MOV AX,DATAS
  37.     MOV DS,AX
  38.        
  39.         MOV DX,OFFSET BUF                            ; 输出提示信息
  40.     MOV AH,09H
  41.     INT 21H
  42.        
  43.     CALL SEARCH      ; 查找最大值并存储到BX
  44.    
  45.         MOV BL,BH
  46.         MOV BH,00H
  47.     CALL BINIDEC                                        ; 输出最大值       
  48.    
  49.     MOV AH,4CH
  50.     INT 21H
  51. MAIN ENDP 
  52. ;-------------------------------------------------------------------   
  53. SEARCH PROC NEAR                                        ; 查找最大值
  54.  
  55.         MOV SI,OFFSET XX                                ; SI指向XX数组首地址
  56.         MOV BX,[SI]                              ; BX初始化为SI内容
  57.                
  58.         MOV CX,CNT-1                    ; 循环变量CX
  59. COMPARE:
  60.         INC SI              ; SI向后移一位
  61.         CMP BX,[SI]                              ; 比较BX与SI当前内容
  62.         JA LITTLE                                          ; 若小于则跳到LITTLE
  63.        
  64.         MOV BX,[SI]                              ; 不小于则将BX更新为SI当前内容
  65. LITTLE:
  66.         DEC CX              ; CX--
  67.         JNZ COMPARE                              ; 继续循环
  68.        
  69.         RET
  70. SEARCH ENDP
  71. ;-------------------------------------------------------------------
  72. BINIDEC PROC NEAR                                   ; 输出四位十进制数
  73.         MOV CX,1000D
  74.         DECDIV BX,CX
  75.         MOV CX,100D
  76.         DECDIV BX,CX
  77.         MOV CX,10D
  78.         DECDIV BX,CX
  79.         MOV CX,1D
  80.         DECDIV BX,CX
  81.         RET
  82. BINIDEC ENDP
  83. ;-------------------------------------------------------------------
  84. CODES ENDS
  85.     END START

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter