Advertisement
Artychenal

Untitled

May 2nd, 2025 (edited)
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
6502 TASM/64TASS 9.09 KB | Source Code | 0 0
  1. DATA SEGMENT
  2.     msg_input       DB "Enter value (from -32768 to 65488): $"    ; Повідомлення для введення числа
  3.     input_buffer    DB 7,?, 7 DUP (" ")                           ; Буфер для введення даних
  4.     msg_output      DB "Result (input value + 47): $"             ; Повідомлення для виводу результату
  5.     newline         DB 0Dh,0Ah,"$"                                ; Символ нового рядка
  6.     msg_error       DB "Invalid input!$"                          ; Повідомлення про помилку
  7.     msg_range_error DB "Value is out of range!$"                  ; Повідомлення про вихід за межі
  8.     number          DW ?                                          ; Змінна для збереження числа
  9.     is_negative     DB 0                                          ; Флаг знаку (0 - додатне, 1 - від'ємне)
  10. DATA ENDS
  11.  
  12. STACK_SEG SEGMENT PARA STACK "STACK"
  13.               DB 64 DUP("STACK")
  14. STACK_SEG ENDS
  15.  
  16. CODE SEGMENT
  17.                           ASSUME CS:CODE, DS:DATA, SS:STACK_SEG
  18.  
  19.     START:                
  20.                           MOV    AX, DATA
  21.                           MOV    DS, AX
  22.  
  23.                           CALL   PRINT_PROMPT                      ; Вивід повідомлення для введення
  24.                           CALL   VALIDATE_INPUT                    ; Перевірка коректності введеного числа
  25.  
  26.                           MOV    SI, OFFSET input_buffer + 2
  27.                           XOR    BX, BX                            ; Обнуляємо BX для збереження числа
  28.                           XOR    DX, DX                            ; Обнуляємо DX
  29.                           CLD                                      ; Скидаємо прапор напрямку
  30.                           MOV    is_negative, 0                    ; Ініціалізуємо флаг знаку
  31.  
  32.                           MOV    AL, [SI]
  33.                           CMP    AL, '-'
  34.                           JNE    CONVERT_TO_NUMBER
  35.                           MOV    is_negative, 1                    ; Позначаємо число як від'ємне
  36.                           INC    SI                                ; Пропускаємо знак мінус
  37.  
  38.     CONVERT_TO_NUMBER:    
  39.                           MOV    AL, [SI]
  40.                           CMP    AL, '0'
  41.                           JB     END_CONVERSION                    ; Якщо символ менший за '0', вихід
  42.                           CMP    AL, '9'
  43.                           JA     END_CONVERSION                    ; Якщо символ більший за '9', вихід
  44.  
  45.                           SUB    AL, '0'                           ; Перетворення ASCII в число
  46.                           MOV    AH, 0
  47.  
  48.                           PUSH   AX
  49.                           MOV    AX, BX
  50.                           MOV    CX, 10
  51.                           MUL    CX
  52.                           CMP    DX, 0
  53.                           JNE    OVERFLOW_ERROR                    ; Перевірка переповнення
  54.                           MOV    BX, AX
  55.                           POP    AX                                ; Відновлюємо цифру
  56.                           ADD    BX, AX
  57.  
  58.                           INC    SI
  59.                           JMP    CONVERT_TO_NUMBER
  60.  
  61.     OVERFLOW_ERROR:      
  62.                           CALL   PRINT_NEWLINE
  63.                           MOV    DX, OFFSET msg_range_error
  64.                           MOV    AH, 9
  65.                           INT    21h
  66.                           JMP    START
  67.  
  68.     END_CONVERSION:      
  69.                           MOV    number, BX
  70.                           CMP    is_negative, 1
  71.                           JNE    ADD_OFFSET
  72.                           CALL   CHECK_RANGE
  73.                           NEG    number                            ; Робимо число від'ємним
  74.  
  75.     ADD_OFFSET:          
  76.                           ADD    number, 47                        ; Додаємо зміщення
  77.                           JC     OVERFLOW_ERROR
  78.                           CMP    number, -1
  79.                           JLE    PRINT_RESULT
  80.                           CALL   RESET_SIGN_FLAG
  81.  
  82.     PRINT_RESULT:        
  83.                           CALL   PRINT_NEWLINE
  84.                           MOV    DX, OFFSET msg_output
  85.                           MOV    AH, 9
  86.                           INT    21h
  87.  
  88.                           CMP    is_negative, 0
  89.                           JNE    PRINT_NEGATIVE
  90.                           CMP    number, 0
  91.                           JAE    PRINT_NUMBER
  92.  
  93.     PRINT_NEGATIVE:      
  94.                           MOV    DL, '-'
  95.                           MOV    AH, 2
  96.                           INT    21h
  97.                           NEG    number
  98.  
  99.     PRINT_NUMBER:        
  100.                           MOV    AX, number
  101.                           CALL   DISPLAY_NUMBER
  102.  
  103.                           MOV    AH, 4Ch
  104.                           INT    21h
  105.  
  106. RESET_SIGN_FLAG PROC
  107.                           MOV    is_negative, 0
  108.                           RET
  109. RESET_SIGN_FLAG ENDP
  110.  
  111. DISPLAY_NUMBER PROC
  112.                           PUSH   number
  113.                           PUSH   CX
  114.                           PUSH   DX
  115.                           XOR    CX, CX
  116.                           MOV    number, 10
  117.  
  118.     TO_STRING:            
  119.                           XOR    DX, DX
  120.                           DIV    number
  121.                           ADD    DL, '0'
  122.                           PUSH   DX
  123.                           INC    CX
  124.                           TEST   AX, AX
  125.                           JNZ    TO_STRING
  126.  
  127.     PRINT_DIGITS:        
  128.                           POP    DX
  129.                           MOV    AH, 2
  130.                           INT    21h
  131.                           LOOP   PRINT_DIGITS
  132.  
  133.                           POP    DX
  134.                           POP    CX
  135.                           POP    number
  136.                           RET
  137. DISPLAY_NUMBER ENDP
  138.  
  139. VALIDATE_INPUT PROC
  140.                           MOV    SI, OFFSET input_buffer + 2
  141.                           MOV    CL, [input_buffer + 1]
  142.                           MOV    BL, 0
  143.                           MOV    AL, [SI]
  144.                           CMP    AL, '-'
  145.                           JNE    CHECK_NUMBERS
  146.                           INC    SI
  147.                           DEC    CX
  148.                           JZ     INPUT_ERROR
  149.  
  150.     CHECK_NUMBERS:        
  151.                           MOV    AL, [SI]
  152.                           CMP    CX, 0
  153.                           JZ     END_VALIDATION
  154.  
  155.     CHECK_LOOP:          
  156.                           MOV    AL, [SI]
  157.                           CMP    AL, '0'
  158.                           JB     INPUT_ERROR
  159.                           CMP    AL, '9'
  160.                           JA     INPUT_ERROR
  161.  
  162.                           INC    BL
  163.                           INC    SI
  164.                           DEC    CX
  165.                           JNZ    CHECK_LOOP
  166.  
  167.                           CMP    BL, 0
  168.                           JZ     INPUT_ERROR
  169.                           JMP    END_VALIDATION
  170.  
  171.     INPUT_ERROR:          
  172.                           MOV    DX, OFFSET msg_error
  173.                           MOV    AH, 9
  174.                           INT    21h
  175.                           JMP    ERROR_EXIT
  176.  
  177.     ERROR_EXIT:          
  178.                           JMP    START
  179.  
  180.     END_VALIDATION:      
  181.                           RET
  182. VALIDATE_INPUT ENDP
  183.  
  184. CHECK_RANGE PROC
  185.                           MOV    AX, number
  186.                           CMP    is_negative, 0
  187.                           JB     CHECK_POSITIVE_LIMITS
  188.                           CMP    AX, -32768
  189.                           JA     RANGE_ERROR
  190.                           CMP    AX, 32721
  191.                           JG     RANGE_ERROR
  192.                           RET
  193.  
  194.     CHECK_POSITIVE_LIMITS:
  195.                           CMP    AX, 0
  196.                           JL     RANGE_ERROR
  197.                           CMP    AX, 65488
  198.                           JA     RANGE_ERROR
  199.                           RET
  200.  
  201.     RANGE_ERROR:          
  202.                           CALL   PRINT_NEWLINE
  203.                           MOV    DX, OFFSET msg_range_error
  204.                           MOV    AH, 9
  205.                           INT    21h
  206.                           JMP    START
  207. CHECK_RANGE ENDP
  208.  
  209. PRINT_PROMPT PROC
  210.                           MOV    DX, OFFSET msg_input
  211.                           MOV    AH, 9
  212.                           INT    21h
  213.  
  214.                           MOV    DX, OFFSET input_buffer
  215.                           MOV    AH, 10
  216.                           INT    21h
  217.                           RET
  218. PRINT_PROMPT ENDP
  219.  
  220. PRINT_NEWLINE PROC
  221.                           MOV    DX, OFFSET newline
  222.                           MOV    AH, 9
  223.                           INT    21h
  224.                           RET
  225. PRINT_NEWLINE ENDP
  226.  
  227. CODE ENDS
  228. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement