Little_hobbit

mop lab4 var4

Sep 23rd, 2020 (edited)
830
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; x86 tasm
  2. ; Gataullin Ruslan
  3. ; Taganrog
  4. model small
  5. dataseg
  6.     ERROR   DB  0Dh, 0Ah,'Overflow', 0Dh, 0Ah, '$'
  7.     INPUT   db  'Input your integer array:', 0Dh, 0Ah, '$'
  8.     INBUF   db  252, ?, 254 dup(?)
  9.     ARR dw  126 dup(0h)
  10.     OUTPUT  db  0Dh, 0Ah, 'Answer is: $'
  11.     OUTBUF  db  5 dup(' '), 0Dh, 0Ah, '$'
  12.    
  13. codeseg
  14.     startupcode
  15.    
  16.     mov AX, @DATA   ; Setting start of dataseg
  17.     mov DS, AX      ; to registers DS and ES
  18.     mov ES, AX
  19.     xor AX, AX
  20.  
  21.     ; Output INPUT message
  22.     lea DX, INPUT  
  23.     mov AH, 009h
  24.     int 21h
  25.    
  26.     ; Input buffer
  27.     lea DX, INBUF   ; Move address of inbuf to DX
  28.     mov AH, 0Ah     ; Set num of input programm to AH
  29.     int 21h     ; Call input
  30.    
  31.     xor CX, CX      ; CX = 0
  32.     mov CL, INBUF+1 ; CL = size of inbuf
  33.     mov AL, ' '     ; its for jumping spaces by scasb
  34.     cld         ; Set diraction flag (DF) to 0 (forward)
  35.     lea DI, INBUF+2 ; Set adress of input string to DI
  36.     xor SI, SI      ; Set SI to zero
  37.  
  38. bufprs: repe    scasb       ; Jump all spaces
  39.     je  endl        ; if it's end of buf
  40.     inc CX
  41.     xor AH, AH      ; Set AH to zero
  42.     dec DI      ; After jumping we can stay after sign or digit
  43.     mov CH, [DI]    ; Move symbol to CH
  44.     cmp CH, '-'     ;
  45.     jne plus        ; if CH = '-', then
  46.     mov AH, 001h    ; then set AH flag for negative value
  47.     dec CX
  48.     inc DI      ; and jump this symbol
  49.     jmp signe       ;
  50. plus:   cmp CH, '+'     ; if there '+'
  51.     jne signe       ;
  52.     inc DI      ; jump this symbol
  53.     dec CX
  54.  
  55.  
  56. signe:  xor BX, BX      ; BX = 0. '  +2'
  57.  
  58. iprs:   mov CH, [DI]    ; Move symbol to CH (again, if there was sign symb)
  59.     cmp CH, '0'     ;
  60.     jl  cont        ; if CH isn't digit
  61.     cmp CH, '9'     ; move BX to array (in the 'cont')
  62.     jnle    cont        ;
  63.    
  64.     mov DX, BX      ; DX = BX
  65.     sal BX, 3       ; BX = 8*BX
  66.     jo  over        ; check overflow
  67.     sal DX, 1       ; DX = 2*BX
  68.     add BX, DX      ; BX = 10*BX
  69.     jo  over        ; check overflow
  70.     sub CH, '0'     ; Get digit from CH
  71.     xor DX, DX      ; Dx = 0
  72.     mov DL, CH      ; DX = CH (it's inpossible to do add BX, CH)
  73.     add BX, DX      ; BX = 10*BX + CH (CH here its DX)
  74.     inc DI      ; Move DI forward
  75.     xor CH, CH      ; Set CH to zero
  76.     loop    iprs
  77.     jmp cont
  78.  
  79. over:   lea DX, ERROR  
  80.     mov AH, 009h
  81.     int 21h
  82.     mov AL, 001h
  83.     jmp exit   
  84.  
  85. cont:   cmp AH, 1       ; if there negative flag
  86.     jl  setv        ;
  87.     neg BX      ; set negative BX
  88.  
  89. setv:   mov ARR[SI], BX ; move BX to array
  90.     add SI, 2       ; incerment index of 'arr' array
  91.     xor CH, CH      ; Clear CH
  92.     inc CL      ; return extra decremented 1
  93.     loop    bufprs     
  94.  
  95. endl:   xor BX, BX      ; end of making int array
  96.     xor AX, AX      ; Set BX and AX = 0
  97.     lea DI, ARR     ; Get address of int array
  98.     sar SI, 1       ; Get size of array
  99.     mov CX, SI      ; and move it to CX
  100.  
  101.     cmp CX, 1       ; If it's array of one elem
  102.     je  sout        ; write 0
  103.     mov BX, [DI]
  104.     add DI, 2
  105.     dec CX
  106.    
  107. fmax:   cmp BX, [DI]    ; account elements, whose more than first
  108.     jnl lgo
  109.     inc AX
  110. lgo:    add DI, 2
  111.     loop    fmax
  112.  
  113. sout:   mov SI, 4       ; Make OUT
  114.     mov BL, 0Ah
  115. out:    div BL
  116.     add AH, '0'
  117.     mov OUTBUF[SI], AH
  118.     dec SI
  119.     xor AH, AH
  120.     jnz out
  121.  
  122.        
  123.     ; Output OUTPUT message
  124.     lea DX, OUTPUT 
  125.     mov AH, 009h
  126.     int 21h
  127.     ; Output OUTBUF  message
  128.     lea DX, OUTBUF 
  129.     mov AH, 009h
  130.     int 21h
  131.  
  132.  
  133.    
  134.  
  135.     mov AL, 000h
  136. exit:   mov AH, 04Ch
  137.     int 21h
  138. end
RAW Paste Data