汇编小程序
相关图例:
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
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
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
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