├── README.md └── atm final.asm /README.md: -------------------------------------------------------------------------------- 1 | # Simple_ATM-Machine-EMU8086 2 | 3 | This project was developed by a freshman student utilizing assembly language. 4 | 5 | Title and Introduction 6 | 7 | Title: Console-based ATM System Implementation in Assembly Language 8 | 9 | Introduction: The purpose of this project is to develop an emu8086-based ATM 10 | 11 | (Automated Teller Machine) using assembly language. Account holders can 12 | perform a variety of banking tasks using the program's user interface, including 13 | checking their account balance, withdrawing money, depositing money, changing 14 | their password, and logging out. 15 | Objectives: The main objectives of the project are as follows: 16 | 1. To simulate the functionality of an ATM machine using assembly language. 17 | 2. To implement secure login authentication through an account number and 18 | password. 19 | 3. To provide a user-friendly interface for account holders to perform banking 20 | operations. 21 | 4. To maintain account balance. 22 | 23 | Methodology 24 | 25 | Assembly language is used in the development of the ATM system, enabling direct 26 | hardware control and effective resource management. The x86 architecture's 27 | specialized assembly language instructions are used, allowing for low-level 28 | programming and optimization. This decision guarantees accurate system 29 | component manipulation and effective ATM functioning implementation. The x86 30 | architecture was chosen for this project since it is often used in personal 31 | computers. The x86 architecture and assembly language may be used to create an 32 | effective and efficient ATM system. 33 | 34 | Implementation 35 | 36 | The x86 architecture's instructions and registers are utilized in the assembly 37 | language implementation of the ATM system. The various features are 38 | implemented using a variety of programming techniques, such as loops, 39 | conditional branching, and stack manipulation. Efficiency, error management, and 40 | user-friendly interaction are the main goals of the implementation. 41 | 42 | Verification and Testing 43 | 44 | A thorough testing process is used to guarantee the accuracy and durability of the 45 | ATM system. Different test cases are created to address various situations, such as 46 | valid and incorrect inputs, border cases, and concurrent transactions. The 47 | programmed is thoroughly examined, and any bugs or other problems are quickly 48 | fixed. 49 | 50 | Conclusion 51 | 52 | The ATM machine project implemented in assembly language using emu8086 53 | provides a user-friendly interface for account holder to perform banking 54 | operations securely. The project successfully achieves its objectives of simulating 55 | an ATM machine, implementing login authentication, and enabling various 56 | banking functionalities such as checking balance, withdrawing money, depositing 57 | money, and changing the account password. The project can be further enhanced 58 | by adding additional features like account statements, transaction history, and 59 | error handling mechanisms. 60 | -------------------------------------------------------------------------------- /atm final.asm: -------------------------------------------------------------------------------- 1 | .MODEL SMALL 2 | 3 | .DATA 4 | ;Account number 5 | ACC_PROMPT DB 0AH, " Enter your account number: $" 6 | ACC_WRONG DB 0AH, 0AH, 0DH, " Account number does not exist.$" 7 | ACC_NUM DB "0123456789$" 8 | ACC_LEN DW $-(OFFSET ACC_NUM)-1 9 | ENTERED_ACC_LEN DW 0H 10 | 11 | ;Password data 12 | PWD_PROMPT DB 0AH, 0DH, " Enter your password: $" 13 | PWD_WRONG DB 0AH, 0AH, 0DH, " Invalid password$" 14 | PWD DB "test1234$" 15 | PWD_LEN DW $-(OFFSET PWD)-1 16 | ENTERED_PWD_LEN DW 0H 17 | 18 | ;Menu options 19 | WEL_MSG DB 0AH, 0AH, 0AH, 0DH, "************************** Welcome to your account ***************************$" 20 | BAL_MENU DB 0AH, 0AH, 0DH, " 1. Check your balance$" 21 | WITH_MENU DB 0AH, 0DH, " 2. Withdraw money$" 22 | DEP_MENU DB 0AH, 0DH, " 3. Deposit money$" 23 | CHANGE_PWD_MENU DB 0AH, 0DH, " 4. Change password$" 24 | EXIT_MENU DB 0AH, 0DH, " 5. Exit$" 25 | 26 | ;Messages 27 | THANK DB 0AH, 0AH, 0AH, 0DH, " Thank you for banking with us!$" 28 | INVALID DB 0AH, 0AH, 0DH, " Invalid input. Please choose a different option.$" 29 | CHOOSE DB 0AH, 0AH, 0DH, " Enter option: $" 30 | SUCCESS DB 0AH, 0AH, 0DH, " Transaction successful$" 31 | LIM_EXCEED DB 0AH, 0AH, 0DH, " Limit exceeded (Maximum amount = Rs. 5000)$" 32 | 33 | ;Balance 34 | CUR_BAL DW 20000 35 | CUR_BAL_MSG DB 0AH, 0AH, 0DH, " Current balance = Rs. $" 36 | 37 | ;Withdraw 38 | WITH_PROMPT DB 0AH, 0AH, 0DH, " Enter amount to withdraw: Rs. $" 39 | WITH_AMT DW 0H 40 | BAL_LOW DB 0AH, 0AH, 0DH, " Insufficient balance$" 41 | 42 | ;Deposit 43 | DEP_PROMPT DB 0AH, 0AH, 0DH, " Enter amount to deposit: Rs. $" 44 | DEP_AMT DW 0H 45 | 46 | ;Change password 47 | REENTER DB 0AH, 0AH, 0DH, " Re-enter your password: $" 48 | NEW_PWD_PROMPT DB 0AH, 0DH, " Enter new password: $" 49 | NEW_PWD DB 0AH, 0AH, 0DH, " Password has been changed to $" 50 | RESTRICT DB 0AH, 0AH, 0DH, " Password restricted to 8 characters.$" 51 | 52 | ;Amount options 53 | ABOVE1000 DB 0AH, 0AH, 0DH, " 1. Rs.1000 - Rs.5000$" 54 | ABOVE100 DB 0AH, 0DH, " 2. Rs.100 - Rs.999$" 55 | MAX_LIM DW 5000 56 | MIN_LIM DW 100 57 | 58 | ;Digit place 59 | TH DW 1000 60 | H DB 100 61 | T DB 10 62 | 63 | 64 | 65 | .CODE 66 | 67 | MAIN PROC 68 | MOV AX, DATA 69 | MOV DS, AX 70 | 71 | ;Check account number 72 | LEA SI, ACC_NUM ;Store offset of existing account number in SI 73 | MOV CX, ACC_LEN ;Loop ACC_LEN times as account number is ACC_LEN characters long 74 | 75 | MOV AH, 09H 76 | LEA DX, ACC_PROMPT 77 | INT 21H 78 | 79 | VERIFY_ACC: MOV AH, 01H 80 | INT 21H 81 | 82 | CMP AL, 0DH 83 | JE BREAKA 84 | 85 | INC ENTERED_ACC_LEN 86 | CMP AL, [SI] ;Compare with actual account number 87 | JNE SET_ACC_FLAG 88 | JMP CONTA 89 | 90 | SET_ACC_FLAG: MOV BL, 01H 91 | 92 | CONTA: INC SI 93 | JMP VERIFY_ACC 94 | 95 | ;checking acc num 96 | BREAKA: CMP CX, ENTERED_ACC_LEN 97 | JL ACC_FAIL 98 | JG ACC_FAIL 99 | 100 | CMP BL, 01H 101 | JE ACC_FAIL 102 | JNE RETURNA 103 | 104 | ACC_FAIL: LEA DX, ACC_WRONG 105 | JMP WRONG 106 | 107 | RETURNA: 108 | 109 | 110 | ;Check password 111 | MOV AH, 09H 112 | LEA DX, PWD_PROMPT 113 | INT 21H 114 | 115 | CALL CHECK_PWD 116 | JMP MENU 117 | 118 | 119 | ;Incorrect verification handling 120 | WRONG: MOV AH, 09H 121 | INT 21H 122 | ;exiting the program 123 | MOV AH, 4CH 124 | INT 21H 125 | 126 | 127 | 128 | ;Display the menu 129 | MENU: MOV AH, 09H 130 | LEA DX, WEL_MSG 131 | INT 21H 132 | 133 | MOV AH, 09H 134 | LEA DX, BAL_MENU 135 | INT 21H 136 | 137 | MOV AH, 09H 138 | LEA DX, WITH_MENU 139 | INT 21H 140 | 141 | MOV AH, 09H 142 | LEA DX, DEP_MENU 143 | INT 21H 144 | 145 | MOV AH, 09H 146 | LEA DX, CHANGE_PWD_MENU 147 | INT 21H 148 | 149 | MOV AH, 09H 150 | LEA DX, EXIT_MENU 151 | INT 21H 152 | 153 | 154 | CHOOSE_OPTION: 155 | 156 | MOV AH, 09H 157 | LEA DX, CHOOSE 158 | INT 21H 159 | 160 | 161 | MOV AH, 01H 162 | INT 21H 163 | 164 | ;Comparing with ASCII code of decimal numbers 165 | CMP AL, 49 166 | JE BALANCE 167 | 168 | CMP AL, 50 169 | JE WITHDRAW 170 | 171 | CMP AL, 51 172 | JE DEPOSIT 173 | 174 | CMP AL, 52 175 | JE CHANGE_PWD 176 | 177 | CMP AL, 53 178 | JE EXIT 179 | 180 | JMP INP_ERROR 181 | 182 | 183 | 184 | ;Display the current balance 185 | BALANCE: MOV AH, 0H ;To check for a keystroke like press any key to continue. 186 | INT 16H 187 | 188 | MOV AH, 09H 189 | LEA DX, CUR_BAL_MSG 190 | INT 21H 191 | 192 | XOR AX, AX 193 | MOV AX, CUR_BAL 194 | CALL DISPLAY_NUM 195 | 196 | JMP CHOOSE_OPTION 197 | 198 | 199 | 200 | ;Withdraw money from account 201 | WITHDRAW: MOV AH, 0H 202 | INT 16H 203 | 204 | MOV AH, 09H 205 | LEA DX, ABOVE1000 206 | INT 21H 207 | 208 | MOV AH, 09H 209 | LEA DX, ABOVE100 210 | INT 21H 211 | 212 | MOV AH, 09H 213 | LEA DX, CHOOSE 214 | INT 21H 215 | 216 | MOV AH, 01H 217 | INT 21H 218 | 219 | ;Check withdrawal amount option 220 | CMP AL, 49 221 | JE WITH_ABOVE1000 222 | CMP AL, 50 223 | JE WITH_ABOVE100 224 | JMP INP_ERROR 225 | 226 | 227 | ;If withdrawal amount is between Rs.1000 and Rs.5000 228 | WITH_ABOVE1000: MOV AH, 09H 229 | LEA DX, WITH_PROMPT 230 | INT 21H 231 | 232 | CALL INPUT_4DIGIT_NUM 233 | MOV WITH_AMT, BX 234 | 235 | CMP BX, MAX_LIM 236 | JG EXCEED_ERROR 237 | JMP WITH_TRANSACT 238 | 239 | 240 | ;If withdrawal amount is between Rs.100 and Rs.999 241 | WITH_ABOVE100: MOV AH, 09H 242 | LEA DX, WITH_PROMPT 243 | INT 21H 244 | 245 | CALL INPUT_3DIGIT_NUM 246 | MOV WITH_AMT, BX 247 | 248 | JMP WITH_TRANSACT 249 | 250 | 251 | ;Start the withdrawal transaction 252 | WITH_TRANSACT: CMP BX, CUR_BAL 253 | JG BAL_LOW_ERROR 254 | 255 | MOV BX, CUR_BAL 256 | SUB BX, WITH_AMT 257 | MOV CUR_BAL, BX 258 | 259 | MOV AH, 0H 260 | INT 16H 261 | CALL SUCCESS_MSG 262 | JMP BACK 263 | 264 | 265 | ;If the current balance is lower than the withdrawal amount 266 | BAL_LOW_ERROR: MOV AH, 0H 267 | INT 16H 268 | MOV AH, 09H 269 | LEA DX, BAL_LOW 270 | INT 21H 271 | JMP BACK 272 | 273 | 274 | 275 | ;Deposit money to account 276 | DEPOSIT: MOV AH, 0H 277 | INT 16H 278 | 279 | MOV AH, 09H 280 | LEA DX, ABOVE1000 281 | INT 21H 282 | 283 | MOV AH, 09H 284 | LEA DX, ABOVE100 285 | INT 21H 286 | 287 | MOV AH, 09H 288 | LEA DX, CHOOSE 289 | INT 21H 290 | 291 | MOV AH, 01H 292 | INT 21H 293 | 294 | ;Check deposit amount option 295 | CMP AL, 49 296 | JE DEP_ABOVE1000 297 | CMP AL, 50 298 | JE DEP_ABOVE100 299 | JMP INP_ERROR 300 | 301 | 302 | ;If deposit amount is between Rs.1000 and Rs.5000 303 | DEP_ABOVE1000: MOV AH, 09H 304 | LEA DX, DEP_PROMPT 305 | INT 21H 306 | 307 | CALL INPUT_4DIGIT_NUM 308 | MOV DEP_AMT, BX 309 | 310 | CMP BX, MAX_LIM 311 | JG EXCEED_ERROR 312 | JMP DEP_TRANSACT 313 | 314 | 315 | ;If deposit amount is between Rs.100 and Rs.999 316 | DEP_ABOVE100: MOV AH, 09H 317 | LEA DX, DEP_PROMPT 318 | INT 21H 319 | 320 | CALL INPUT_3DIGIT_NUM 321 | MOV DEP_AMT, BX 322 | 323 | JMP DEP_TRANSACT 324 | 325 | 326 | ;Start the deposit transaction 327 | DEP_TRANSACT: MOV BX, CUR_BAL 328 | ADD BX, DEP_AMT 329 | MOV CUR_BAL, BX 330 | 331 | MOV AH, 0H 332 | INT 16H 333 | CALL SUCCESS_MSG 334 | JMP BACK 335 | 336 | 337 | 338 | ;Change password 339 | CHANGE_PWD: 340 | 341 | MOV AH, 09H 342 | LEA DX, REENTER 343 | INT 21H 344 | 345 | CALL CHECK_PWD 346 | 347 | MOV AH, 09H 348 | LEA DX, NEW_PWD_PROMPT 349 | INT 21H 350 | 351 | LEA SI, PWD 352 | XOR BX, BX 353 | 354 | CHANGE_LOOP: MOV AH, 08H 355 | INT 21H 356 | 357 | CMP AL, 0DH 358 | JE BREAKC 359 | 360 | INC BX 361 | CMP BX, 08H 362 | JG EXCEED 363 | MOV [SI], AL 364 | 365 | MOV AH, 02H 366 | MOV DL, 23H 367 | INT 21H 368 | 369 | INC SI 370 | JMP CHANGE_LOOP 371 | 372 | EXCEED: MOV AH, 09H 373 | LEA DX, RESTRICT 374 | INT 21H 375 | DEC BX 376 | 377 | BREAKC: MOV [SI], "$" 378 | MOV PWD_LEN, BX 379 | 380 | MOV AH, 09H 381 | LEA DX, NEW_PWD 382 | INT 21H 383 | 384 | MOV AH, 09H 385 | LEA DX, PWD 386 | INT 21H 387 | 388 | JMP BACK 389 | 390 | 391 | 392 | ;Exit the application 393 | EXIT: MOV AH, 0H 394 | INT 16H 395 | 396 | MOV AH, 09H 397 | LEA DX, THANK 398 | INT 21H 399 | 400 | MOV AH, 4CH 401 | INT 21H 402 | 403 | 404 | 405 | ;If user enters incorrect option 406 | INP_ERROR: MOV AH, 09H 407 | LEA DX, INVALID 408 | INT 21H 409 | JMP BACK 410 | 411 | 412 | 413 | ;If amount exceeds specified limit 414 | EXCEED_ERROR: MOV AH, 0H 415 | INT 16H 416 | MOV AH, 09H 417 | LEA DX, LIM_EXCEED 418 | INT 21H 419 | JMP BACK 420 | 421 | 422 | 423 | ;Return to main menu 424 | BACK: MOV AH, 0H 425 | INT 16H ;waiting for enter any key 426 | 427 | MOV AH, 0H 428 | MOV AL, 03H 429 | INT 10H ;clear the screen 430 | 431 | JMP MENU 432 | 433 | MAIN ENDP 434 | 435 | ;Procedure to input a 4digit decimal number 436 | INPUT_4DIGIT_NUM PROC NEAR 437 | MOV AH, 01H 438 | INT 21H 439 | 440 | ;Check whether character is a digit 441 | CMP AL, 30H 442 | JL INP_ERROR 443 | CMP AL, 39H 444 | JG INP_ERROR 445 | 446 | SUB AL, 30H 447 | MOV AH, 0 448 | MUL TH ;1st digit 449 | MOV BX, AX 450 | 451 | MOV AH, 01H 452 | INT 21H 453 | 454 | ;Check whether character is a digit 455 | CMP AL, 30H 456 | JL INP_ERROR 457 | CMP AL, 39H 458 | JG INP_ERROR 459 | 460 | SUB AL, 30H 461 | MUL H ;2nd digit 462 | ADD BX, AX 463 | 464 | MOV AH, 01H 465 | INT 21H 466 | 467 | ;Check whether character is a digit 468 | CMP AL, 30H 469 | JL INP_ERROR 470 | CMP AL, 39H 471 | JG INP_ERROR 472 | 473 | SUB AL, 30H 474 | MUL T ;3rd digit 475 | ADD BX, AX 476 | 477 | MOV AH, 01H 478 | INT 21H 479 | 480 | ;Check whether character is a digit 481 | CMP AL, 30H 482 | JL INP_ERROR 483 | CMP AL, 39H 484 | JG INP_ERROR 485 | 486 | SUB AL, 30H ;4th digit 487 | MOV AH, 0 488 | ADD BX, AX 489 | 490 | RET 491 | 492 | 493 | ;Procedure to input a 3digit decimal number 494 | INPUT_3DIGIT_NUM PROC NEAR 495 | MOV AH, 01H 496 | INT 21H 497 | 498 | ;Check whether character is a digit 499 | CMP AL, 30H 500 | JL INP_ERROR 501 | CMP AL, 39H 502 | JG INP_ERROR 503 | 504 | SUB AL, 30H 505 | MOV AH, 0 506 | MUL H ;1st digit 507 | MOV BX, AX 508 | 509 | MOV AH, 01H 510 | INT 21H 511 | 512 | ;Check whether character is a digit 513 | CMP AL, 30H 514 | JL INP_ERROR 515 | CMP AL, 39H 516 | JG INP_ERROR 517 | 518 | SUB AL, 30H 519 | MUL T ;2nd digit 520 | ADD BX, AX 521 | 522 | MOV AH, 01H 523 | INT 21H 524 | 525 | ;Check whether character is a digit 526 | CMP AL, 30H 527 | JL INP_ERROR 528 | CMP AL, 39H 529 | JG INP_ERROR 530 | 531 | SUB AL, 30H ;3rd digit 532 | MOV AH, 0 533 | ADD BX, AX 534 | 535 | RET 536 | 537 | 538 | ;Procedure to display a 16bit decimal number 539 | DISPLAY_NUM PROC NEAR 540 | XOR CX, CX ;To count the digits 541 | MOV BX, 10 ;Fixed divider 542 | 543 | DIGITS: 544 | XOR DX, DX ;Zero DX for word division 545 | DIV BX 546 | PUSH DX ;Remainder (0,9) 547 | INC CX 548 | TEST AX, AX 549 | JNZ DIGITS ;Continue until AX is empty 550 | 551 | NEXT: 552 | POP DX 553 | ADD DL, 30H 554 | MOV AH, 02H 555 | INT 21H 556 | LOOP NEXT 557 | 558 | RET 559 | 560 | 561 | ;Procedure to display a successful transaction message 562 | SUCCESS_MSG PROC NEAR 563 | MOV AH, 09H 564 | LEA DX, SUCCESS 565 | INT 21H 566 | 567 | MOV AH, 09H 568 | LEA DX, CUR_BAL_MSG 569 | INT 21H 570 | 571 | XOR AX, AX 572 | MOV AX, CUR_BAL 573 | CALL DISPLAY_NUM 574 | 575 | RET 576 | 577 | 578 | ;Procedure to verify password 579 | CHECK_PWD PROC ;NEAR 580 | MOV ENTERED_PWD_LEN, 0H 581 | MOV BL, 0H ;Flag stored in BL 582 | LEA SI, PWD ;Store offset of correct password in SI 583 | MOV CX, PWD_LEN ;Length of entered password has to be compard with actual password length. 584 | 585 | VERIFY_PWD: MOV AH, 08H ;Character input without echo to output device. 586 | INT 21H 587 | 588 | CMP AL, 0DH ;Break if user presses enter key. 589 | JE BREAKP 590 | 591 | INC ENTERED_PWD_LEN 592 | CMP AL, [SI] ;Compare with actual password. 593 | JNE SET_PWD_FLAG 594 | JE CONTP 595 | 596 | SET_PWD_FLAG: MOV BL, 01H 597 | 598 | CONTP: MOV AH, 02H 599 | MOV DL, 23H ;Hide password characters with *. 600 | INT 21H 601 | 602 | INC SI 603 | JMP VERIFY_PWD 604 | 605 | BREAKP: CMP CX, ENTERED_PWD_LEN 606 | JL PWD_FAIL 607 | JG PWD_FAIL 608 | 609 | CMP BL, 01H 610 | JE PWD_FAIL 611 | JNE RETURNP 612 | 613 | PWD_FAIL: LEA DX, PWD_WRONG 614 | JMP WRONG 615 | 616 | RETURNP: RET 617 | 618 | 619 | END MAIN --------------------------------------------------------------------------------