Liny_@NotePad

沉迷ACG中

宏指令设计实验

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

循环结构、选择结构练习

试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃的ASCII码为07H)。

  1. DATAS SEGMENT
  2.     INFOR DB 'please input the number(0~9):$'
  3.     RING DB 0AH,0DH,'RING~$'
  4. DATAS ENDS
  5.  
  6. CODES SEGMENT
  7. MAIN PROC FAR
  8.     ASSUME CS:CODES,DS:DATAS
  9. START:
  10.     PUSH DS
  11.     SUB AX,AX
  12.     PUSH AX
  13.     MOV AX,DATAS
  14.     MOV DS,AX
  15.    
  16.     MOV DX,OFFSET INFOR
  17.     MOV AH,09H
  18.     INT 21H
  19.    
  20.     MOV AH,01H
  21.     INT 21H
  22.     SUB AL,30H
  23.     MOV BL,AL
  24.    
  25.     CMP BL,0
  26.     JLE EXIT
  27.    
  28.     CMP BL,9
  29.     JG EXIT
  30.  
  31. RINGUP: 
  32.         CALL WAITTIME
  33.  
  34.         MOV AH,02H
  35.         MOV DL,07H
  36.         INT 21H
  37.  
  38.         MOV DX,OFFSET RING
  39.         MOV AH,09H
  40.         INT 21H
  41.        
  42.         DEC BL
  43.         JNZ RINGUP
  44.        
  45. EXIT:   
  46.         MOV AH,4CH
  47.         INT 21H
  48. MAIN ENDP
  49.  
  50. WAITTIME PROC
  51.         PUSH CX
  52.         MOV CX,2000H
  53.        
  54. WAITFOR:
  55.         CALL WAITTIME2
  56.         LOOP WAITFOR
  57.         POP CX
  58.         RET
  59.  
  60. WAITTIME ENDP
  61.  
  62. WAITTIME2 PROC
  63.         PUSH CX
  64.         MOV CX,3600H
  65.        
  66. WAITFOR2:
  67.         LOOP WAITFOR2
  68.         POP CX
  69.         RET
  70.  
  71. WAITTIME2 ENDP
  72.  
  73. CODES ENDS
  74.     END START

选择结构练习

1、从键盘输入一字符,判断该字符是小写字母、大写字母、数字还是其它字符。若输入为小写字母,则显示“You Input a Lowercase Letter!”;若输入为大写字母,则显示“You Input a Uppercase Letter!”;若输入为数字,则显示“You Input a Digit!”;若输入为其它字符,则显示“You Input Other Letter!”。

  1. DATAS SEGMENT
  2.     INFOR_I DB 'please input a char:$'
  3.     INFOR_L DB 0AH,0DH,'You Input a Lowercase Letter!$'
  4.     INFOR_U DB 0AH,0DH,'You Input a Uppercase Letter!$'
  5.     INFOR_N DB 0AH,0DH,'You Input a Digit!$'
  6.     INFOR_O DB 0AH,0DH,'You Input Other Letter!$' 
  7. DATAS ENDS
  8.  
  9. CODES SEGMENT
  10.     ASSUME CS:CODES,DS:DATAS
  11. START:
  12.     MOV AX,DATAS
  13.     MOV DS,AX
  14.    
  15.     MOV DX,OFFSET INFOR_I
  16.     MOV AH,9H
  17.     INT 21H
  18.    
  19.     MOV AH,1
  20.     INT 21H
  21.    
  22.     CMP AL,'0'
  23.     JL INPUT_OTHER
  24.    
  25.     CMP AL,'9'
  26.     JNG INPUT_NUMBER
  27.    
  28.     CMP AL,'A'
  29.     JL INPUT_OTHER
  30.    
  31.     CMP AL,'Z'
  32.     JNG INPUT_UPPER
  33.    
  34.     CMP AL,'a'
  35.     JL INPUT_OTHER
  36.    
  37.     CMP AL,'z'
  38.     JNG INPUT_LOWER
  39.     JG INPUT_OTHER
  40.    
  41. INPUT_LOWER:
  42.         MOV DX,OFFSET INFOR_L
  43.     JMP RESULT
  44.        
  45. INPUT_UPPER:
  46.         MOV DX,OFFSET INFOR_U
  47.     JMP RESULT
  48.        
  49. INPUT_NUMBER:
  50.         MOV DX,OFFSET INFOR_N
  51.     JMP RESULT
  52.            
  53. INPUT_OTHER:
  54.         MOV DX,OFFSET INFOR_O
  55.     JMP RESULT
  56.        
  57. RESULT:
  58.     MOV AH,9H
  59.     INT 21H
  60.  
  61.     MOV AH,4CH
  62.     INT 21H
  63. CODES ENDS
  64.     END START

 

2、在屏幕上显示“Are you really want to exit?”,然后从键盘输入一字符,若输入“Y”或“y”,则显示“Thank you for your using!”;若输入“N”或“n”,则显示“Let’s continue!”;若输入其它字符,则显示“You press an error key!”后程序结束。
  1. DATAS SEGMENT
  2.     INFOR DB 'Are you really want to exit?$'
  3.     INFOR_Y DB 0AH,0DH,'Thank you for your using!$'
  4.     INFOR_N DB 0AH,0DH,'Lets continue!$'
  5.     INFOR_O DB 0AH,0DH,'You press an error key!$'
  6. DATAS ENDS
  7.  
  8. CODES SEGMENT
  9.     ASSUME CS:CODES,DS:DATAS
  10. START:
  11.     MOV AX,DATAS
  12.     MOV DS,AX
  13.    
  14.     MOV DX,OFFSET INFOR
  15.     MOV AH,09H
  16.     INT 21H
  17.    
  18.     MOV AH,01H
  19.     INT 21H
  20.    
  21.     AND AL,11011111B
  22.    
  23.     CMP AL,01011001B
  24.     JE INPUT_Y
  25.    
  26.         CMP AL,01001110B
  27.         JE INPUT_N
  28.         
  29.     JMP INPUT_O
  30.    
  31. INPUT_Y:
  32.         MOV DX,OFFSET INFOR_Y
  33.         JMP RESULT
  34.    
  35. INPUT_N:
  36.         MOV DX,OFFSET INFOR_N
  37.         JMP RESULT
  38.        
  39. INPUT_O:
  40.         MOV DX,OFFSET INFOR_O
  41.             
  42. RESULT:
  43.         MOV AH,09H
  44.         INT 21H
  45.    
  46.     MOV AH,4CH
  47.     INT 21H
  48. CODES ENDS
  49.     END START

第一个asm……好囧

这真是一门可怕的学科 TAT

编写程序实现:从键盘输入0~9中任意一个自然数,将其平方值在屏幕上显示出来(要求使用查表法)。