zoukankan      html  css  js  c++  java
  • 汇编小程序

    相关图例:

    MY_CAL

      1 TITLE MY_CAL PROGRRAM TO RUN THE CALCULATION
      2 PAGE 60, 132
      3 ;---------------------------------
      4     .MODEL SMALL
      5     .STACK 64
      6      PUBLIC MY_CAL
      7 ;---------------------------------
      8     .DATA
      9     CAL_MSG1 DB 'Please enter the expression(Q for leave):', '$'
     10     CAL_MSG2 DB 'The result is:', '$'
     11     CAL_MSG3 DB 'ERROR: Only for two operators, and the operators is not negtive', '$'
     12     CAL_MSG4 DB 'ERROR: Mul operator error, a size of operator should be 1', '$'
     13     CAL_MSG5 DB 'ERROR: Div operator error, the size of two operator should be 1 or 2 and 1', '$'
     14     CAL_MSG6 DB 'ERROR: Invalid order', '$'
     15     CAL_OP1 DB 40 DUP(0)
     16     CAL_TMP_LEN DW 0 ;用于保存较大的长度值
     17     CAL_LEN1 DW 0
     18     CAL_OP2 DB 40 DUP(0)
     19     CAL_LEN2 DW 0
     20     CAL_CHA DB ? ;用于保存运算符
     21     CAL_CHA_NUM DB ? ;用于判断输入语法的正确性
     22     CAL_ERROR DB ? ;用于判断输入语法的正确性
     23     CAL_RES DB 80 DUP(0)  ;用于保存结果
     24     CAL_LEN DW 0;结果的长度
     25     CAL_FLAG DB 0
     26     CRLF DB 0DH, 0AH, '$'
     27 ;-----------------------------------------
     28     .CODE
     29 MY_CAL PROC FAR
     30   MC_S0:
     31     MOV AX, @DATA
     32     MOV DS, AX
     33     
     34     LEA DX, CAL_MSG1
     35     MOV AH, 9
     36     INT 21H
     37     
     38     MOV CAL_CHA_NUM, 0;用于保存运算符的个数以判断输入是否合法
     39     CALL INPUT_EXP ;输入表达式
     40     ;----------退出判断------
     41     MOV AL, CAL_FLAG
     42     CMP AL, 'Q'
     43     JNZ MC_S00
     44     MOV AL, 0
     45     MOV CAL_FLAG, AL
     46     RET
     47     ;---------错误处理--------------
     48   MC_S00:
     49     MOV CAL_ERROR, 0
     50     CALL DEAL_ERROR
     51     CMP CAL_ERROR, 0
     52     JZ MC_S01
     53     LEA DX, CRLF
     54     MOV AH, 9
     55     INT 21H
     56     MOV CAL_LEN1, 0
     57     MOV CAL_LEN2, 0
     58     JMP MC_S0
     59     
     60   MC_S01:
     61     ;把两个操作数处理成一样等长的数据,高位补0
     62     ;把长的长度保存在AX中
     63     MOV AX, CAL_LEN1
     64     CMP AX, CAL_LEN2
     65     JG MC_S1
     66     MOV AX, CAL_LEN2  
     67   MC_S1:
     68     ;已经有AX里面保存了最长的长度, BX中有自己的长度,去把DI指向的数据高位补O成长度为AX的
     69     MOV CAL_TMP_LEN, AX
     70     
     71     LEA DI, CAL_OP1
     72     MOV BX, CAL_LEN1
     73     CALL DEL_OP
     74     
     75     LEA DI, CAL_OP2
     76     MOV BX, CAL_LEN2
     77     CALL DEL_OP
     78 
     79     ;选择
     80     
     81   CAL_START:
     82     MOV AL, CAL_CHA
     83     CMP AL, '+'
     84     JZ CAL_ADD
     85     CMP AL, '-'
     86     JZ CAL_SUB
     87     CMP AL, '*'
     88     JZ CAL_MUL
     89     CMP AL, '/'
     90     JZ CAL_DIV
     91     
     92     LEA DX, CRLF
     93     MOV AH, 9
     94     INT 21H
     95     
     96     LEA DX, CAL_MSG6
     97     MOV AH, 9
     98     INT 21H
     99     MOV AX, 0
    100     MOV CAL_LEN1, AX
    101     MOV CAL_LEN2, AX
    102     MOV CAL_FLAG, AL
    103     MOV CAL_CHA, AL
    104     LEA DX, CRLF
    105     MOV AH, 9
    106     INT 21H
    107     JMP MC_S0
    108     
    109   CAL_ADD:
    110     CALL MY_ADD
    111     JMP CAL_OUTPUT_RES
    112     
    113   CAL_SUB:
    114     CALL MY_SUB
    115     JMP CAL_OUTPUT_RES
    116   
    117   CAL_MUL:
    118     CALL MY_MUL
    119     JMP CAL_OUTPUT_RES
    120     
    121   CAL_DIV:
    122     CALL MY_DIV
    123     JMP CAL_OUTPUT_RES
    124     
    125   CAL_OUTPUT_RES:
    126     LEA DX, CRLF
    127     MOV AH, 9
    128     INT 21H
    129     
    130     LEA DX, CAL_MSG2
    131     MOV AH, 9
    132     INT 21H
    133 
    134     CALL OUTPUT_RES
    135   MC_S2:
    136     LEA DX, CRLF
    137     MOV AH, 9
    138     INT 21H
    139     
    140     CALL CAL_RESET;全部数据归零
    141     JMP MC_S0
    142     
    143 MY_CAL ENDP
    144 ;********************DEAL_ERROR*****
    145 DEAL_ERROR PROC NEAR
    146     ;------------------运算符过多或是无运算符------------------
    147     MOV AX, 1
    148     CMP CAL_CHA_NUM, 1
    149     JZ DE_S0
    150     
    151     LEA DX, CRLF
    152     MOV AH, 9
    153     INT 21H
    154     
    155     LEA DX, CAL_MSG3
    156     MOV AH, 9
    157     INT 21H
    158 
    159     INC CAL_ERROR
    160     RET
    161   DE_S0:
    162     CMP CAL_CHA, '*'
    163     JZ MUL_CASE
    164     CMP CAL_CHA, '/'
    165     JZ DIV_CASE
    166     RET
    167     ;----要有一个长度为1的数
    168   MUL_CASE:
    169     CMP CAL_LEN1, 1
    170     JNZ MUL_CASE_1
    171     RET
    172     
    173   MUL_CASE_1:
    174     CMP CAL_LEN2, 1
    175     JNZ MUL_CASE_ERROR
    176     RET
    177   MUL_CASE_ERROR:
    178      LEA DX, CRLF
    179      MOV AH, 9
    180      INT 21H
    181      LEA DX, CAL_MSG4
    182      MOV AH, 9
    183      INT 21H
    184      INC CAL_ERROR
    185      RET
    186     
    187   DIV_CASE:
    188     CMP CAL_LEN1, 1
    189     JZ DIV_CASE_1
    190     CMP CAL_LEN1, 2
    191     JZ DIV_CASE_1
    192     JMP DIV_CASE_ERROR
    193     
    194   DIV_CASE_1:
    195     CMP CAL_LEN2, 1
    196     JNZ DIV_CASE_ERROR
    197     RET
    198   DIV_CASE_ERROR:
    199      LEA DX, CRLF
    200      MOV AH, 9
    201      INT 21H
    202      LEA DX, CAL_MSG5
    203      MOV AH, 9
    204      INT 21H
    205      INC CAL_ERROR
    206      RET
    207 DEAL_ERROR ENDP
    208 ;*******************INPUT_EXP**********
    209 ;函数说明,把运算式输入并交操作符保存在CHA中,两个操作数保存在 OP1和OP2中,对应的长度保存在LEN1和LEN2中
    210 INPUT_EXP PROC NEAR
    211     LEA DI, CAL_OP1
    212     LEA SI, CAL_LEN1
    213   IE_S1:
    214     MOV AH, 1
    215     INT 21H
    216     CMP AL, 'Q'
    217     JNZ IE_S11
    218     MOV CAL_FLAG, AL
    219     RET
    220   IE_S11:
    221     CMP AL, 0DH ;
    222     JNZ NOT_END
    223     MOV [DI], '$'
    224     RET
    225     
    226   NOT_END:
    227     CMP AL, '0'
    228     JB IE_S2;有运算符进来了 ,换第二个数输入
    229     MOV [DI], AL
    230     INC DI
    231     INC BYTE PTR [SI]
    232     JMP IE_S1
    233   IE_S2:
    234     MOV [DI], '$'
    235     MOV CAL_CHA, AL
    236     INC CAL_CHA_NUM
    237     LEA DI, CAL_OP2
    238     LEA SI, CAL_LEN2
    239     JMP IE_S1
    240     
    241 INPUT_EXP ENDP
    242 
    243 ;***************************CAL_INPUT*****************
    244 ;已经有AX里面保存了最长的长度, BX中有自己的长度,去把DI指向的数据高位补O成长度为AX的
    245 DEL_OP PROC NEAR
    246     CMP AX, BX
    247     JZ DO_S
    248 
    249     ;处理OP 定位
    250     MOV SI, DI;指向同一个数据数组
    251     ADD SI, BX
    252     DEC SI
    253     ADD DI, AX
    254     MOV [DI], '$'
    255     DEC DI
    256     MOV CX, BX
    257   DO_S1:
    258     MOV DL, [SI]
    259     MOV [DI], DL
    260     DEC DI
    261     DEC SI
    262     LOOP DO_S1
    263     
    264     ;高位补0
    265     MOV CX, AX
    266     SUB CX, BX
    267     MOV BL, '0'
    268   DO_S3:
    269     MOV [DI], BL   ;这里绝对不能使用MOV [DI], '0'不然只会把自己弄死
    270     DEC DI
    271     LOOP DO_S3
    272     
    273   DO_S:
    274     RET
    275 DEL_OP ENDP
    276 ;**********************RESET********************
    277 CAL_RESET PROC NEAR
    278     MOV CX, CAL_TMP_LEN
    279     LEA DI, CAL_OP1
    280     LEA SI, CAL_OP2
    281   RS_S0:
    282     MOV AL, 0
    283     MOV [DI], AL
    284     MOV [SI], AL
    285     INC SI
    286     INC DI
    287     LOOP RS_S0
    288     
    289     MOV CX, CAL_LEN
    290     LEA SI, CAL_RES
    291     RS_S1:
    292     MOV AL, 0
    293     MOV [SI], AL
    294     INC SI
    295     LOOP RS_S1
    296     
    297     MOV AX, 0
    298     MOV CAL_LEN1, AX
    299     MOV CAL_LEN2, AX
    300     MOV CAL_LEN, AX
    301     MOV CAL_TMP_LEN, AX
    302     MOV CAL_FLAG, AL
    303     MOV CAL_CHA, AL
    304     RET
    305 CAL_RESET ENDP
    306 ;****************************OUTPUT_RES***********
    307  OUTPUT_RES PROC NEAR
    308     MOV CX, CAL_LEN
    309     LEA SI, CAL_RES
    310     ADD SI, CAL_LEN
    311     DEC SI
    312   OR_S:
    313     MOV DL, [SI]
    314     MOV AH, 2
    315     INT 21H
    316     DEC SI
    317     LOOP OR_S
    318     RET
    319 OUTPUT_RES ENDP
    320 ;********************************MY_ADD**************
    321 ;参数说明, OP1,OP2 为操作九,RES为和, LEN1, LEN2为长度 
    322 MY_ADD PROC NEAR
    323     MOV AX, CAL_TMP_LEN
    324     MOV CAL_LEN, AX
    325     
    326     LEA SI, CAL_OP1
    327     ADD SI, CAL_TMP_LEN
    328     DEC SI
    329     LEA DI, CAL_OP2
    330     ADD DI, CAL_TMP_LEN
    331     DEC DI
    332     LEA DX, CAL_RES
    333     
    334     MOV CX, CAL_TMP_LEN
    335     XOR AX, AX
    336     PUSHF
    337     
    338     MA_S1:
    339     MOV AL, [SI]
    340     SUB AL, '0'
    341     MOV BL, [DI]
    342     SUB BL, '0'
    343     POPF
    344     ADC AL, BL
    345     AAA
    346     PUSHF ;保存进位信息
    347     ADD AL, '0'
    348     MOV [SI], AL
    349     
    350     ;汇编就是个坑
    351     PUSH SI
    352     MOV SI, DX
    353     MOV [SI], AL
    354     POP SI
    355     
    356     INC DX
    357     DEC DI
    358     DEC SI
    359     LOOP MA_S1
    360     
    361     ;判断最后有没有进位
    362     DEC DX;减去前面多减的
    363     MOV SI, DX
    364     XOR AL, AL
    365     POPF
    366     ADC AL,0
    367     CMP AL,0
    368     JZ MA_S2
    369     INC CAL_LEN
    370     INC SI
    371     ADD AL,'0'
    372     MOV [SI], AL
    373   MA_S2:
    374     RET
    375     
    376 MY_ADD ENDP
    377 ;*********************MY_SUB*********************
    378 MY_SUB PROC NEAR
    379     MOV AX, CAL_TMP_LEN
    380     MOV CAL_LEN, AX
    381     
    382     LEA SI, CAL_OP1
    383     ADD SI, CAL_TMP_LEN
    384     DEC SI
    385     LEA DI, CAL_OP2
    386     ADD DI, CAL_TMP_LEN
    387     DEC DI
    388     LEA DX, CAL_RES
    389     
    390     MS_S:
    391     MOV CX, CAL_TMP_LEN
    392     XOR AX, AX
    393     PUSHF
    394     
    395     MS_S1:
    396     MOV AL, [SI]
    397     SUB AL, '0'
    398     MOV BL, [DI]
    399     SUB BL, '0'
    400     POPF
    401     SBB AL, BL
    402     AAS
    403     PUSHF
    404     ADD AL, '0'
    405     MOV [SI], AL
    406     
    407     ;汇编就是个坑
    408     PUSH SI
    409     MOV SI, DX
    410     MOV [SI], AL
    411     POP SI
    412     
    413     INC DX
    414     DEC DI
    415     DEC SI
    416     LOOP MS_S1
    417     
    418     ;判断最后的借位
    419     DEC DX;减去前面多减的
    420     MOV SI, DX
    421     XOR AL, AL
    422     POPF
    423     SBB AL,0
    424     CMP AL,0
    425     JZ MS_S2
    426     INC CAL_LEN
    427     INC SI
    428     ADD AL,'0'
    429     MOV [SI], AL
    430   MS_S2:
    431     RET
    432     
    433 MY_SUB ENDP
    434 ;**************************************MY_MUL************
    435 MY_MUL PROC NEAR
    436     MOV AX, CAL_TMP_LEN
    437     MOV CAL_LEN, AX
    438     ;判断哪个是大数,比较长的放在SI中
    439     CMP AX, CAL_LEN1
    440     JNZ MM_S
    441     LEA SI, CAL_OP2
    442     ADD SI, CAL_TMP_LEN
    443     DEC SI
    444     MOV BL, [SI]
    445     SUB BL, '0' 
    446     LEA SI, CAL_OP1
    447     ADD SI, CAL_TMP_LEN
    448     DEC SI
    449     JMP MM_S00
    450   MM_S:
    451     LEA SI, CAL_OP1
    452     ADD SI, CAL_TMP_LEN
    453     DEC SI
    454     MOV BL, [SI]
    455     SUB BL, '0' 
    456     LEA SI, CAL_OP2
    457     ADD SI, CAL_TMP_LEN
    458     DEC SI
    459 
    460   MM_S00:
    461     LEA DI, CAL_RES
    462     XOR AX, AX
    463     XOR BH, BH
    464     MOV CX, CAL_TMP_LEN
    465   MM_S0:
    466     MOV AL, [SI]
    467     SUB AL, '0'
    468     MUL BL
    469     ADD AL, BH;加上进位
    470     AAM
    471     ADD AL, '0'
    472     MOV [DI], AL
    473     MOV BH, AH;保存进位
    474     DEC SI
    475     INC DI
    476     LOOP MM_S0
    477     
    478     ;判断有没有再进位
    479     MOV AL, 0
    480     CMP BH, AL
    481     JZ MM_S1
    482     INC CAL_LEN
    483     ADD BH, '0'
    484     MOV [DI], BH
    485     INC DI
    486     MM_S1:
    487     MOV [DI], '$'
    488     RET
    489 MY_MUL ENDP
    490 ;*****************************MY_DIV**************
    491 MY_DIV PROC NEAR
    492     MOV AX, CAL_TMP_LEN
    493     MOV CAL_LEN, AX
    494     
    495     MOV AX, WORD PTR CAL_OP1
    496     SUB AL, '0'
    497     SUB AH, '0'
    498     XCHG AL, AH
    499     
    500     AAD
    501     LEA SI, CAL_OP2
    502     ADD SI, CAL_TMP_LEN
    503     DEC SI
    504     MOV BL, [SI]
    505     SUB BL, '0'
    506     DIV BL
    507     AAM
    508     LEA DI, CAL_RES
    509     ADD AL, '0'
    510     MOV [DI], AL
    511     INC DI
    512     ADD AH, '0'
    513     MOV [DI], AH
    514     RET
    515 MY_DIV ENDP
    516 ;******************************************
    517     END
    View Code

    MY_GAME

      1 TITLE MY_GAME PROGRRAM TO RUN THE LITTLE GAME
      2 PAGE 60, 132
      3 ;---------------------------------
      4     EXTRN CLS:FAR
      5     .MODEL SMALL
      6     .STACK 64
      7      PUBLIC MY_GAME
      8 ;---------------------------------
      9     .DATA
     10     GAME_COUNT DW 0
     11     ROWS DW 4
     12     COLS DW 4
     13     GAME_START DB 'The init game is follows:', '$'
     14     GAME_MSG DB 'A,W,S,D for direction and  Q to leave: ', '$'
     15     GAME_MSG1 DB 'The result is follows:', '$'
     16     GAME_MSG2 DB 'The next order: ' , '$'
     17     GAME_MSG3 DB 'Wrong order, please check you order!!', '$'
     18     GAME_MSG4 DB 'COUNT: ', '$'
     19     MSG_END_GAME DB 'THE GAME IS ENDING!!!!!!', '$'
     20     CRLF DB 0DH, 0AH, '$'
     21     GAME_DIRECTION DB 0
     22     GAME_BOUND1 DB '---------------------------------', '$'
     23     GAME_BOUND2 DB '|'
     24     GAME_ARRAY DB  16 DUP ('$')  ; STORE the station of the chess
     25     GAME_BLANK DB '     ', '$'; for the output
     26     GAME_QUEUE DB 4 DUP (0)
     27     COUNT_QUEUE DW 0
     28     GAME_TMEP DB 4 DUP ('$') ;用于暂时保存数据 
     29     COUNT_NEW DW 0 ;记录GAME_TEMP的长度
     30 ;----------------------------------------
     31     .CODE
     32     MY_GAME PROC NEAR
     33     MOV AX, @DATA
     34     MOV DS, AX
     35     
     36     LEA DX, GAME_START
     37     MOV AH, 9
     38     INT 21H
     39     
     40     LEA DX, CRLF
     41     MOV AH, 9
     42     INT 21H
     43     
     44     CALL INIT_ARRAY ;初始化2048
     45     
     46     CALL GAME_OUTPUT
     47     
     48     LEA DX, GAME_MSG
     49     MOV AH, 9
     50     INT 21H
     51     
     52   S0:
     53     MOV AH, 1
     54     INT 21H
     55     MOV GAME_DIRECTION, AL ;用于保存输入的方向
     56     MOV BL, GAME_DIRECTION
     57     
     58     CMP BL, 'A'
     59     JNZ M1
     60     CALL MOVELEFT
     61     JMP S
     62     
     63   M1:
     64     
     65     CMP BL, 'S'
     66     JNZ M2
     67     CALL MOVEDOWN
     68     JMP S
     69     
     70   M2:
     71     CMP BL, 'D'
     72     JNZ M3 
     73     CALL MOVERIGHT
     74     JMP S
     75     
     76   M3:
     77     
     78     CMP BL, 'W'
     79     JNZ M4
     80     CALL MOVEUP
     81     JMP S
     82   M4:
     83     
     84     CMP BL, 'Q' ;手动结束游戏
     85     JNZ M5
     86     JZ S1
     87     
     88   M5: ;错误命令
     89     LEA DX, CRLF
     90     MOV AH, 9
     91     INT 21H
     92     LEA DX, CRLF
     93     MOV AH, 9
     94     INT 21H
     95     LEA DX, GAME_MSG3
     96     MOV AH, 9
     97     INT 21H
     98     
     99     LEA DX, CRLF
    100     MOV AH, 9
    101     INT 21H
    102     
    103     JMP S
    104   S:
    105     CALL CLS
    106     CALL GAME_OUTPUT ;显示游戏界面
    107     LEA DX, GAME_MSG2
    108     MOV AH, 9
    109     INT 21H
    110     JMP S0
    111  S1: 
    112     LEA DX, CRLF
    113     MOV AH, 9
    114     INT 21H
    115     
    116     LEA DX, MSG_END_GAME
    117     MOV AH,9
    118     INT 21H
    119     
    120     MOV AX, 0
    121     MOV GAME_COUNT, AX
    122     
    123     MOV AH, 1
    124     INT 21H
    125     
    126     RET
    127 MY_GAME ENDP
    128 
    129 ;**********************INIT_ARRA*****************************
    130 INIT_ARRAY PROC NEAR
    131     MOV CX, 16
    132     LEA SI, GAME_ARRAY
    133     MOV AL, 0
    134   IA_SO:
    135     MOV [SI], AL
    136     INC SI
    137     LOOP IA_SO
    138     
    139     LEA SI, GAME_ARRAY
    140     MOV [SI], 1
    141     MOV [SI+1], 2
    142     MOV [SI+2], 4
    143     MOV [SI+7], 3
    144     MOV [SI+8], 1
    145     ;MOV [SI+10], 1
    146     MOV [SI+13], 2
    147     MOV [SI+5], 3
    148     RET
    149 INIT_ARRAY ENDP
    150 
    151 ;**********************MOVELEFT*****************************
    152 MOVELEFT PROC NEAR
    153     MOV CX, ROWS
    154   ML_ROW:
    155   ; 确定要送入队列的数据的首地址
    156     LEA SI, GAME_ARRAY
    157     MOV AX, ROWS
    158     SUB AX, CX
    159     MUL COLS
    160     ADD SI, AX   ;当前确定行循环首地址
    161     
    162     PUSH CX
    163     MOV CX, COLS
    164     AND COUNT_QUEUE, 0
    165     LEA DI, GAME_QUEUE ;队列
    166   ML_COL: ;进队列
    167     MOV AL, [SI]  ;好坑啊,为什么 用MOV AL, O; CMP [SI], AL就错了
    168     CMP AL, 0
    169     JZ ML_G0
    170     
    171     ;;将[SI]中的数据放入到队列中
    172     MOV AL, [SI]
    173     MOV [DI], AL
    174     
    175     INC DI
    176     INC COUNT_QUEUE
    177     MOV AL, 0
    178     AND [SI], AL ;清零
    179   ML_G0: 
    180     INC SI
    181     LOOP ML_COL
    182     
    183     ;把队列的数字进行运算并暂时放入到GAME_TEMP
    184     AND COUNT_NEW, 0
    185     CALL CAL_NEW_DATA
    186     
    187     
    188     ;把新数据写回QUEUE_ARRAY
    189     MOV AX, COUNT_NEW
    190     CMP AX, 0
    191     JZ ML_G3
    192     ;计算要把数据从哪里开始
    193     POP BX ;得到外循环的CX
    194     PUSH BX 
    195     MOV AX, ROWS 
    196     SUB AX, BX ;因为数据不会太大,AH, BH都为0 
    197     MUL COLS
    198     LEA DI, GAME_ARRAY;
    199     ADD DI, AX ;AL有偏移量,加上就是要存放的起始地址
    200     
    201     MOV CX, COUNT_NEW
    202     LEA BX, GAME_TMEP
    203   ML_G5:
    204     MOV AL, [BX]
    205     MOV [DI], AL
    206     INC DI
    207     INC BX
    208     LOOP ML_G5
    209   ML_G3:
    210     POP CX
    211     LOOP ML_ROW
    212     
    213     INC GAME_COUNT
    214     RET
    215 MOVELEFT ENDP
    216 ;**********************MOVERIGHTP*****************************
    217 MOVERIGHT PROC NEAR
    218     MOV CX, ROWS
    219   MR_ROW:
    220     LEA SI, GAME_ARRAY
    221     MOV AX, ROWS
    222     SUB AX, CX
    223     MUL COLS
    224     ADD SI, AX
    225     MOV AX, COLS
    226     ADD SI, AX
    227     DEC SI
    228     
    229     LEA DI, GAME_QUEUE ;队列
    230     AND COUNT_QUEUE, 0
    231     PUSH CX
    232     MOV CX, COLS
    233   MR_COL: ;进队列
    234     MOV AL, [SI]
    235     CMP AL, 0 
    236     JZ MR_G0
    237     
    238     MOV AL, [SI] 
    239     MOV [DI], AL    
    240     INC DI
    241     INC COUNT_QUEUE ;用于记录队列的长度
    242     ;AND [SI], 0
    243     MOV AL, 0
    244     AND [SI], AL 
    245   MR_G0:
    246     DEC SI
    247     LOOP MR_COL
    248     
    249     ;问题怎么决断边界地址啊,怎么判断队列是空的情况,用纪录的方式记下个数再后期写回
    250     ;遍历队列,并把新数据放回GAME_TEMP对应的行中()
    251     AND COUNT_NEW, 0
    252     CALL CAL_NEW_DATA
    253     
    254     MOV AX, COUNT_NEW
    255     CMP AX, 0
    256     JZ MR_G3
    257     
    258     ;把新数据写回QUEUE_ARRAY
    259     ;计算从哪里开始放数据,怎么放
    260     POP BX ;得到外循环已经多少了
    261     PUSH BX 
    262     LEA DI, GAME_ARRAY
    263     MOV AX, ROWS
    264     SUB AX, BX
    265     MUL COLS
    266     ADD DI, AX
    267     MOV AX, COLS
    268     ADD DI, AX
    269     DEC DI
    270     
    271     MOV CX, COUNT_NEW
    272     LEA BX, GAME_TMEP
    273   MR_G5:
    274     MOV AL, [BX]
    275     MOV [DI], AL
    276     DEC DI
    277     INC BX
    278     LOOP MR_G5
    279   
    280   MR_G3:
    281     POP CX
    282     LOOP MR_ROW
    283     
    284     INC GAME_COUNT
    285     RET
    286 MOVERIGHT ENDP
    287 ;**********************MOVEUP*****************************
    288 MOVEUP PROC NEAR
    289     MOV CX, COLS
    290   MU_COL:
    291     LEA DI, GAME_QUEUE ;队列
    292     LEA SI, GAME_ARRAY  ;当前循环首地址定位 SI = GAME_ARRAY + 4 - ROW(CX) ,后面列循环的元素每个加4
    293     ADD SI, COLS
    294     SUB SI, CX
    295     
    296     AND COUNT_QUEUE, 0
    297     PUSH CX
    298     MOV CX, ROWS
    299   MU_ROW: ;进队列
    300     MOV AL, [SI]
    301     CMP AL, 0
    302     JZ MU_G0
    303     MOV AL, [SI] 
    304     MOV [DI], AL
    305     MOV AL, 0
    306     MOV [SI], AL
    307     INC DI
    308     INC COUNT_QUEUE ;用于记录队列的长度
    309   MU_G0:
    310     ADD SI, 4
    311     LOOP MU_ROW
    312     
    313     ;问题怎么决断边界地址啊,怎么判断队列是空的情况,用纪录的方式记下个数再后期写回
    314     ;遍历队列,并把新数据放回GAME_TEMP对应的行中()
    315     AND COUNT_NEW, 0
    316     CALL CAL_NEW_DATA
    317     
    318     MOV AX, COUNT_NEW
    319     CMP AX, 0
    320     JZ MU_G3
    321     ;把新数据写回QUEUE_ARRAY
    322     
    323     ;计算要把数据从哪里开始放 SI+4-row(cx),每次要加上4
    324     POP BX ;得到外循环已经多少了
    325     PUSH BX 
    326     MOV AX, COLS
    327     SUB AX, BX
    328     LEA DI, GAME_ARRAY
    329     ADD DI , AX
    330     MOV CX, COUNT_NEW
    331     LEA BX, GAME_TMEP
    332   MU_G5:
    333     MOV AL, [BX]
    334     MOV [DI], AL
    335     ADD DI, 4
    336     INC BX
    337     LOOP MU_G5
    338   
    339   MU_G3:
    340     POP CX
    341     LOOP MU_COL
    342     
    343     INC GAME_COUNT
    344     RET
    345 MOVEUP ENDP
    346 ;**********************MOVEDOWN*****************************
    347 MOVEDOWN PROC NEAR
    348     MOV CX, COLS
    349   MD_ROW:
    350   
    351     LEA DI, GAME_QUEUE ;队列
    352     LEA SI, GAME_ARRAY  ;当前循环首地址定位 SI = AGME_ARRAY + (ROWS - 1) * COLS,+ (ROWS - ROW(CX)),后面列循环的元素每个-4
    353     ADD SI, 12 ;(ROWS-1) * COLS  = 12 
    354     ADD SI, COLS
    355     SUB SI, CX
    356     PUSH CX
    357     MOV CX, ROWS
    358     AND COUNT_QUEUE, 0
    359     
    360   MD_COL: ;进队列
    361     MOV AL, 0
    362     CMP [SI], AL
    363     JZ MD_G0
    364     MOV AL, [SI]
    365     MOV [DI], AL
    366     ;AND [SI], 0 清零
    367     MOV AL, 0
    368     MOV [SI], AL
    369     INC DI
    370     INC COUNT_QUEUE ;用于记录队列的长度
    371   MD_G0:
    372     SUB SI, 4
    373     LOOP MD_COL
    374     ;运用队列运算并把运算结果放到GAME_TEMP中
    375     AND COUNT_NEW, 0
    376     CALL CAL_NEW_DATA
    377     
    378     MOV AX, COUNT_NEW
    379     CMP AX, 0
    380     JZ MD_G3
    381     
    382     ;把新数据写回QUEUE_ARRAY
    383     ;计算要把数据从哪里开始放 SI + (ROWS-1)*COLS+COLS-COL(CX),后面每次要-4
    384     POP BX ;得到外循环已经多少了
    385     PUSH BX 
    386     MOV AX, COLS
    387     SUB AX, BX
    388     LEA DI, GAME_ARRAY
    389     ADD DI, 12
    390     ADD DI, AX
    391     MOV CX, COUNT_NEW
    392     LEA BX, GAME_TMEP
    393   MD_G5:
    394     MOV AL, [BX]
    395     MOV [DI], AL
    396     SUB DI, 4
    397     INC BX
    398     LOOP MD_G5
    399   
    400   MD_G3:
    401     POP CX
    402     LOOP MD_ROW
    403     
    404     INC GAME_COUNT
    405     RET
    406 MOVEDOWN ENDP
    407 ;==========
    408 GAME_UPDATE PROC NEAR
    409     MOV AX, ROWS
    410     MOV BX, COLS
    411     MUL BL ;得到ROWS * COLS
    412     MOV CX, AX
    413   
    414     LEA SI, GAME_ARRAY
    415   GU_S0:
    416     CMP SI, 0
    417     JZ GU_S1
    418     JNZ GU_S2
    419   GU_S1:
    420     MOV AL, 2
    421     MOV [SI], AL
    422     RET
    423   GU_S2:
    424     INC SI
    425     LOOP GU_S0
    426     ;没有办法更新数据
    427     RET
    428 GAME_UPDATE ENDP
    429 ;**********************CAL_NEW_DATA*****************************
    430 GAME_OUTPUT PROC NEAR
    431     LEA DX, CRLF
    432     MOV AH, 9
    433     INT 21H    
    434     
    435     LEA DX, GAME_MSG4
    436     MOV AH, 9
    437     INT 21H
    438     
    439     MOV AX, GAME_COUNT
    440     CALL OUTPUT_VALUE_G
    441     
    442     LEA DX, CRLF
    443     MOV AH, 9
    444     INT 21H
    445     
    446     LEA DX, GAME_MSG1
    447     MOV AH, 9
    448     INT 21H
    449     
    450     LEA DX, CRLF
    451     MOV AH, 9
    452     INT 21H
    453     
    454     LEA DX, GAME_BOUND1
    455     MOV AH, 9
    456     INT 21H
    457     
    458     LEA DX, CRLF
    459     MOV AH, 9
    460     INT 21H
    461     
    462     MOV CX,ROWS
    463     LEA SI, GAME_ARRAY
    464     
    465    GO_S0:
    466     MOV DL, GAME_BOUND2
    467     MOV AH,2
    468     INT 21H
    469     
    470     PUSH CX
    471     MOV CX, COLS
    472   GO_S1:
    473     LEA DX, GAME_BLANK
    474     MOV AH, 9
    475     INT 21H
    476     
    477     MOV AL, [SI]
    478     INC SI
    479     CALL OUTPUT_VALUE_S
    480     
    481     MOV DL, GAME_BOUND2
    482     MOV AH, 2
    483     INT 21H
    484     
    485     LOOP GO_S1
    486     POP CX
    487     
    488     LEA DX, CRLF
    489     MOV AH, 9
    490     INT 21H
    491     
    492     LOOP GO_S0
    493     
    494     LEA DX, GAME_BOUND1
    495     MOV AH, 9
    496     INT 21H
    497     
    498     LEA DX, CRLF
    499     MOV AH, 9
    500     INT 21H
    501     RET
    502 GAME_OUTPUT ENDP
    503 ;**********************CAL_NEW_DATA*****************************
    504 CAL_NEW_DATA PROC NEAR
    505 ; DEBUG
    506     ;MOV DX, COUNT_QUEUE
    507     ;ADD DL, '0'
    508     ;MOV AH, 2
    509     ;INT 21H
    510     
    511     MOV CX, COUNT_QUEUE
    512     CMP CX, 0 ;队列为空
    513     JZ G5
    514     LEA DI, GAME_QUEUE
    515     LEA BX, GAME_TMEP
    516   G1:
    517     MOV AL, [DI]  
    518     MOV [BX], AL ;PUSH
    519     INC COUNT_NEW ;用于纪录有多少个新的数据
    520     INC DI
    521     DEC CX   ;先行减1,用于提前判断是否为空
    522     CMP CX,0 ;本次迭代结束后,队列为空
    523     JZ G5
    524     MOV AL, [BX]
    525     CMP [DI], AL ;判断可不可以进行叠加
    526     JNZ G4
    527     MOV AL, [BX]
    528     ADD [BX], AL
    529     INC DI
    530     DEC CX  ;POP
    531   G4: 
    532     INC CX ;补加之前减去的1
    533     INC BX
    534     LOOP G1 ;POP + FOR
    535   G5:
    536     RET
    537 CAL_NEW_DATA ENDP
    538 ;**********************OUTPUT_VALUE_S*****************************
    539 ;输出保存在AL中的数字,v如果是0则输出两个空格,如果是一数字则输出一个空格
    540 OUTPUT_VALUE_S PROC NEAR
    541     MOV DL, AL
    542     CMP DL, 0
    543     JNZ OVS_S1
    544     MOV DL, ' '
    545     MOV AH, 2
    546     INT 21H
    547     MOV AH, 2
    548     INT 21H
    549     RET
    550   OVS_S1:
    551     MOV AL, DL
    552     MOV AH, 0
    553     MOV BL, 10
    554     DIV BL
    555     MOV BL, AH
    556     CMP AL, 0
    557     JZ OVS_S2
    558     MOV DL, AL
    559     ADD DL, '0'
    560     MOV AH, 2
    561     INT 21H
    562     JMP OVS_S21
    563   OVS_S2:
    564     MOV DL, ' '
    565     MOV AH, 2
    566     INT 21H
    567   OVS_S21:
    568     CMP BL, 0
    569     JZ OVS_S3
    570     MOV DL, BL
    571     ADD DL, '0'
    572     MOV AH,2
    573     INT 21H
    574     RET
    575   OVS_S3:
    576     MOV DL, ' '
    577     MOV AH, 2
    578     INT 21H
    579     RET
    580 OUTPUT_VALUE_S ENDP
    581 ;**********************OUTPUT_VALUE*****************************
    582 ;输出保存在AX中的数字
    583 OUTPUT_VALUE PROC NEAR
    584     MOV BL, 10
    585     DIV BL
    586     
    587     MOV BH, AH ;保存余数
    588     
    589     MOV DL, AL
    590     CMP DL, 0
    591     JZ OV_S1  ;如果十位为0不输出
    592     ADD DL, '0'
    593     MOV AH, 2
    594     INT 21H
    595     
    596   OV_S1:
    597     MOV DL, BH ;得到个位
    598     ADD DL, '0'
    599     MOV AH, 2
    600     INT 21H
    601     RET
    602 OUTPUT_VALUE ENDP
    603 ;**********************OUTPUT_VALUE_G*****************************
    604 OUTPUT_VALUE_G PROC NEAR
    605 ; 输出 AL中的数字,可能有两位; 
    606     MOV BL, 10
    607     DIV BL
    608     
    609     MOV BH, AH ;保存余数
    610     
    611     MOV DL, AL
    612     CMP DL, 0
    613     JZ OL_S1  ;如果十位为0不输出
    614     ADD DL, '0'
    615     MOV AH, 2
    616     INT 21H
    617     
    618   OL_S1:
    619     MOV DL, BH ;得到个位
    620     ADD DL, '0'
    621     MOV AH, 2
    622     INT 21H
    623     RET
    624 OUTPUT_VALUE_G ENDP
    625 ;***************************************************
    626     END
    627     
    View Code

    MY_PASSWORD_TEST

      1 TITLE PASSWORD_TEST PROGRRAM TO CHECK THE PASSWORD
      2 PAGE 60, 132
      3 ;---------------------------------
      4     .MODEL SMALL
      5     .STACK 64
      6      PUBLIC PASSWORD_TEST
      7 ;---------------------------------
      8     .DATA
      9     PT_MSG1 DB "Please input your password:", '$'
     10     PT_MSG2 DB "Password wrong, try agagin", '$'
     11     PASSWORD DB "QINKAI", '$'
     12     PASSWORD_LEN DB 6
     13     TEST_PASS DB 30 DUP ('$')
     14     TEST_PASS_LEN DB 0
     15     PT_FLAG DB 0
     16     CRLF DB 0DH, 0AH,'$'
     17 ;----------------------------------------
     18     .CODE
     19 PASSWORD_TEST PROC FAR
     20 PT_SO:
     21     MOV AX, @DATA
     22     MOV DS, AX
     23     MOV ES, AX
     24     
     25     LEA DX, PT_MSG1
     26     MOV AH, 9
     27     INT 21H
     28     
     29     ; 输入密码
     30     LEA DI, TEST_PASS
     31     CALL INPUT_PASSWORD
     32     
     33     LEA DX,CRLF
     34     MOV AH, 9
     35     INT 21H
     36     
     37     ;测试密码 否正确
     38     LEA DI, PASSWORD
     39     LEA SI, TEST_PASS
     40     MOV AL, PASSWORD_LEN
     41     MOV AH, TEST_PASS_LEN
     42     MOV TEST_PASS_LEN, 0
     43     MOV PT_FLAG, 0 ;为0代表 正确的
     44     CALL IS_RIGHT
     45     CMP PT_FLAG, 0
     46     
     47     LEA DX,CRLF
     48     MOV AH, 9
     49     INT 21H
     50     
     51     JNZ PT_SO
     52     
     53     RET
     54 PASSWORD_TEST ENDP
     55 
     56 ;*************************************INPUT_PASSWORD*********************************************
     57 INPUT_PASSWORD PROC NEAR
     58     S2:
     59     MOV AH, 8
     60     INT 21H
     61     CMP AL, 0DH ; 判断是不是输入换行符
     62     JNZ IP_S3
     63     MOV AH, '$'
     64     MOV [DI], AH
     65     RET
     66     
     67   IP_S3:
     68     MOV [DI], AL;[si]是当前地址,相当于c语言中的*pt = value; 
     69     INC DI
     70     INC [TEST_PASS_LEN]
     71     MOV DL, '*'
     72     MOV AH, 2
     73     INT 21H
     74     JMP S2
     75     
     76 INPUT_PASSWORD ENDP
     77 
     78 ;*********************************IS_RIGHT*********************************
     79 IS_RIGHT PROC NEAR
     80     CMP AL, AH
     81     JZ S3
     82     LEA DX, PT_MSG2 ;长度不相等
     83     MOV AH, 9
     84     INT 21H
     85     MOV PT_FLAG, 1
     86     RET
     87     
     88      S3:
     89     MOV CL, PASSWORD_LEN
     90     MOV CH, 0
     91     
     92     REPE CMPSB
     93     JNZ S5
     94     RET
     95   S5:
     96     ;error
     97     LEA DX, PT_MSG2
     98     MOV AH,9
     99     INT 21H
    100     MOV PT_FLAG, 1
    101     RET
    102 
    103 IS_RIGHT ENDP
    104 ;***********************************
    105     END
    View Code

    MY_MAIN

      1 TITLE MAIN PROGRRAM TO CONTROL THE SYSTEM
      2 PAGE 60, 132
      3     EXTRN PASSWORD_TEST:FAR
      4     EXTRN MY_GAME:FAR
      5     EXTRN MY_CAL:FAR
      6     PUBLIC CLS
      7 ;---------------------------------------------
      8     .MODEL SMALL
      9     .STACK 64
     10 ;------------------------------------------------
     11     .DATA
     12     MAIN_MSG1 DB 'Welcome to System!', '$'
     13     MAIN_MSG3 DB 'Password wrong try again', '$'
     14     MAIN_MSG4 DB 'Please choose your item to continue', '$'
     15     MAIN_MSG5 DB '1: Little game', '$'
     16     MAIN_MSG6 DB '2: Calculation', '$'
     17     MAIN_MSG7 DB 'YOUR CHOISE:', '$'
     18     MAIN_FLAG DB 0
     19     CRLF DB 0DH, 0AH,'$'
     20 ;----------------------------------
     21     .CODE
     22 START:
     23     MOV AX, @DATA
     24     MOV DS, AX
     25     CALL CLS ;清屏
     26     
     27     MOV CX, 2
     28     CALL CRLF_FUNC
     29     LEA DX, MAIN_MSG1
     30     MOV AH, 9
     31     INT 21H
     32     
     33     LEA DX, CRLF
     34     MOV AH, 9
     35     INT 21H
     36     
     37     CALL PASSWORD_TEST ;调用密码判断功能可以跳出这个函数就可以往下运行
     38     
     39     MAIN_S:
     40     CALL MAIN_OUTPUT ;调用系统界面
     41     
     42     ;输入选择
     43     MOV AH, 1
     44     INT 21H
     45     
     46     PUSH AX;保存命令,防止调用函数时改变了AL
     47     CMP AL, '1' ;游戏
     48     JNZ MAIN_S0
     49     CALL CLS
     50     CALL MY_GAME
     51 
     52     
     53   MAIN_S0:
     54     CMP AL, '2' ;计算器
     55     JNZ MAIN_S1
     56     CALL CLS
     57     CALL MY_CAL
     58     
     59   MAIN_S1:
     60     POP AX
     61     CMP AL, 'Q'
     62     JNZ MAIN_S
     63     
     64     MOV AH,4CH
     65     INT 21H
     66     RET
     67 ;***************************CLS*************************
     68 CLS PROC FAR
     69     MOV AH, 0FH
     70     INT 10H
     71     MOV AH, 0
     72     INT 10H
     73     RET
     74 CLS ENDP
     75 ;***************************CRLF_FUNC***************************
     76 ;按CX来进行输空行
     77 CRLF_FUNC PROC NEAR
     78   SO:
     79     LEA DX, CRLF
     80     MOV AH, 9
     81     INT 21H
     82     LOOP SO
     83     RET
     84 CRLF_FUNC ENDP
     85 ;***************************MAIN_OUTPUT***************************
     86 
     87 MAIN_OUTPUT PROC NEAR
     88     CALL CLS
     89     MOV CX, 2
     90     CALL CRLF_FUNC
     91     
     92     LEA DX, MAIN_MSG4
     93     MOV AH,9
     94     INT 21H
     95     
     96     LEA DX, CRLF
     97     MOV AH, 9
     98     INT 21H
     99     
    100     LEA DX, MAIN_MSG5
    101     MOV AH, 9
    102     INT 21H
    103     
    104     LEA DX, CRLF
    105     MOV AH, 9
    106     INT 21H
    107     
    108     LEA DX, MAIN_MSG6
    109     MOV AH, 9
    110     INT 21H
    111     
    112     LEA DX, CRLF
    113     MOV AH, 9
    114     INT 21H
    115     
    116     LEA DX, MAIN_MSG7
    117     MOV AH, 9
    118     INT 21H
    119     
    120     RET
    121 MAIN_OUTPUT ENDP
    122 ;***************************
    123     END START
    View Code
  • 相关阅读:
    pyzabbix 接口使用
    lvs使用进阶
    lvs基础
    linux服务基础之nginx配置详解
    linux服务基础之编译安装nginx
    iptables (二) nat & tcp_wrapper
    iptables (一) 主机防火墙和网络防火墙
    rsyslog及loganalyzer
    linux基础之Mini Linux制作
    linux基础之磁盘管理与文件系统
  • 原文地址:https://www.cnblogs.com/kinthon/p/4733141.html
Copyright © 2011-2022 走看看