Little_hobbit

dos x86 input int array

Sep 23rd, 2020 (edited)
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. model small
  2. dataseg
  3.     ERROR   DB  'Overflow', 0Dh, 0Ah, '$'
  4.     INPUT   db  'Input your integer array:', 0Dh, 0Ah, '$'
  5.     INBUF   db  252, ?, 254 dup(?)
  6.     ARR dw  126 dup(0h)
  7. codeseg
  8.     startupcode
  9.    
  10.     mov AX, @DATA   ; Setting start of dataseg
  11.     mov DS, AX      ; to registers DS and ES
  12.     mov ES, AX
  13.     xor AX, AX
  14.  
  15.     ; Output INPUT message
  16.     lea DX, INPUT  
  17.     mov AH, 009h
  18.     int 21h
  19.    
  20.     ; Input buffer
  21.     lea DX, INBUF   ; Move address of inbuf to DX
  22.     mov AH, 0Ah     ; Set num of input programm to AH
  23.     int 21h     ; Call input
  24.    
  25.     xor CX, CX      ; CX = 0
  26.     mov CL, INBUF+1 ; CL = size of inbuf
  27.     mov AL, ' '     ; its for jumping spaces by scasb
  28.     cld         ; Set diraction flag (DF) to 0 (forward)
  29.     lea DI, INBUF+2 ; Set adress of input string to DI
  30.     xor SI, SI      ; Set SI to zero
  31.  
  32. bufprs: repe    scasb       ; Jump all spaces
  33.     inc CX
  34.     jcxz    exit        ; if it's end of buf - end '   +2'
  35.  
  36.     xor AH, AH      ; Set AH to zero
  37.     dec DI      ; After jumping we can stay after sign or digit
  38.     mov CH, [DI]    ; Move symbol to CH
  39.     cmp CH, '-'     ;
  40.     jne plus        ; if CH = '-', then
  41.     mov AH, 001h    ; then set AH flag for negative value
  42.     dec CX
  43.     inc DI      ; and jump this symbol
  44.     jmp signe       ;
  45. plus:   cmp CH, '+'     ; if there '+'
  46.     jne signe       ;
  47.     inc DI      ; jump this symbol
  48.     dec CX
  49.  
  50.  
  51. signe:  xor BX, BX      ; BX = 0. '  +2'
  52.  
  53. iprs:   mov CH, [DI]    ; Move symbol to CH (again, if there was sign symb)
  54.     cmp CH, '0'     ;
  55.     jl  cont        ; if CH isn't digit
  56.     cmp CH, '9'     ; move BX to array (in the 'cont')
  57.     jnle    cont        ;
  58.    
  59.     mov DX, BX      ; DX = BX
  60.     sal BX, 3       ; BX = 8*BX
  61.     sal DX, 1       ; DX = 2*BX
  62.     add BX, DX      ; BX = 10*BX
  63.     sub CH, '0'     ; Get digit from CH
  64.     xor DX, DX      ; Dx = 0
  65.     mov DL, CH      ; DX = CH (it's inpossible to do add BX, CH)
  66.     add BX, DX      ; BX = 10*BX + CH (CH here its DX)
  67.     inc DI      ; Move DI forward
  68.     xor CH, CH      ; Set CH to zero
  69.     loop    iprs
  70.  
  71. cont:   cmp AH, 1       ; if there negative flag
  72.     jl  setv        ;
  73.     neg BX      ; set negative BX
  74.  
  75. setv:   mov ARR[SI], BX ; move BX to array
  76.     add SI, 2       ; incerment index of 'arr' array
  77.     xor CH, CH      ; Clear CH
  78.     inc CL      ; return extra decremented 1
  79.     loop    bufprs     
  80.    
  81. exit:   mov AX, 04Ch
  82.     int 21h
  83. end
Add Comment
Please, Sign In to add comment