Advertisement
madopew

laba3_2

Mar 15th, 2020
449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     include 'MACRO\PROC32.INC' ;for PROC-ENDP
  2.  
  3.     org 100h
  4.  
  5.     NL_ equ 0dh, 0ah ;const
  6.  
  7.     mov ah, 09h ;output - helloStr
  8.     mov dx, helloStr_
  9.     int 21h
  10.  
  11.     mov dx, inputStr_ ;output - inputStr
  12.     int 21h
  13.  
  14.     mov ah, 0ah ;input to buff
  15.     mov dx, buffNum
  16.     int 21h
  17.  
  18.     add dx, 2 ;dx to the first char of number
  19.     call str_to_int_ ;input dx - string that ends on 0dh, output al - 8 bit number
  20.     mov [num1_], al ;mov first number to num1_
  21.  
  22.     mov ah, 02h ;output - new line
  23.     mov dx, 0d0ah
  24.     int 21h
  25.  
  26.     mov ah, 09h ;output - inputStr
  27.     mov dx, inputStr_
  28.     int 21h
  29.  
  30.     mov ah, 0ah ;input to buff
  31.     mov dx, buffNum
  32.     int 21h
  33.  
  34.     add dx, 2 ;get second number
  35.     call str_to_int_
  36.  
  37.     mov [num2_], al ;move second number to num2_
  38.  
  39.     call task_ ;input num1_ & num2_ - two numbers, output numAns_ - 16 bit number
  40.    
  41.     mov ax, [numAns_]
  42.     mov dx, buffAns
  43.     call int_to_str_ ;input ax - 16 bit number, dx - 6 byte buffer; output - string representation of number in buff that ends with $
  44.  
  45.     mov ah, 09h ;output - resultStr
  46.     mov dx, resultStr_
  47.     int 21h
  48.  
  49.     mov dx, buffAns ;output - buffAns
  50.     int 21h
  51.  
  52.     mov dx, byeStr_ ;output - byeStr
  53.     int 21h
  54.  
  55.     mov ah, 08h ;wait for input
  56.     int 21h
  57.     ret
  58.  
  59. proc str_to_int_ ;input dx - string that ends on 0dh; output al - 8bit number
  60.     push dx ;save
  61.     push ax ;save
  62.     push bx ;save
  63.     mov bx, dx ;memory accessible only from bx
  64.     xor dx, dx ;clear dx
  65.     next_digit_:
  66.         mov ax, 10 ;10 to ax
  67.         mul dh ;multiplied by 1 byte; result ah:al
  68.         mov dh, al ;move result of multiolication to dh
  69.         mov dl, byte [bx] ;move one SYMBOL to dl
  70.         sub dl, '0' ;convert SYMBOL to NUMBER 0-9
  71.         add dh, dl ;add dl to dh
  72.         inc bx ;move to next symbol
  73.         cmp byte [bx], 0dh ;are we at the last symbol?
  74.         jne next_digit_ ;if no then there're still numbers to convert left
  75.     pop bx ;retrieve
  76.     pop ax ;retrieve
  77.     mov al, dh ;save 8bit answer to al
  78.     pop dx ;retrieve
  79.     ret ;go back
  80.     endp
  81.  
  82. proc int_to_str_ ;input ax - 16 bit number, dx - 6 byte buffer; output - string representation of number in buff that ends with $
  83.     push ax ;save ...
  84.     push dx
  85.     push bx
  86.     push si ;memory is also accessible at bx+si
  87.     push bp
  88.     mov bp, sp ;move sp to bp
  89.     sub sp, 5 ;reserve 5byte of stack
  90.     mov word [bp-2], dx ;save address of buff
  91.     mov word [bp-4], 10 ;in first two byte save constant 10
  92.     mov byte [bp-5], 1 ;in third byte save AMOUNT of letters in the number, as it at least has '$' counter starts from 1
  93.     xor dx, dx
  94.     mov bx, word [bp-2] ;memory accessible from bx only...
  95.     mov byte [bx], '$' ;this is the first letter
  96.     next_letter_:
  97.         inc bx ;move to next letter
  98.         add byte [bp-5], 1 ;increment AMOUNT of letters
  99.         div word [bp-4] ;divide dx:ax by 16bit number; result dx-remainder, ax-quotient
  100.         add dl, '0' ;convert to ascii number
  101.         mov [bx], dl ;save that letter
  102.         xor dx, dx ;clear dx
  103.         cmp ax, 0 ;have we converted whole number?
  104.         jne next_letter_ ;if no there're still number to convert
  105.     xor si, si ;clear si
  106.     mov si, [bp-5] ;move two bytes of reserved stack to si: lowest - [bp-3], highest - [bp-2] (little-endian)
  107.     and si, 00ffh ;clear highest byte, only AMOUNT left in si
  108.     dec si ;get offset to the LAST letter from FIRST
  109.     mov al, [bp-5] ;amount to al, ah is zero
  110.     shr ax, 1 ;divide by 2 as integer (for i = 0 to i / 2), "i/2" - integer division, so we get amount of swaps needed to reverse a string
  111.     mov [bp-5], al ;save that number to [bp-2]
  112.     mov bx, [bp-2] ;restore position of the FIRST letter
  113.     next_switch_:
  114.         mov ah, [bx] ;swap two letters using ax...
  115.         mov al, [bx + si]
  116.         mov [bx], al
  117.         mov [bx+si], ah
  118.         inc bx ;move to next letter
  119.         sub si, 2 ;as si is OFFSET to last letter, not index, subtract 2 to get OFFSET to (last-1) letter
  120.         sub byte [bp-5], 1 ;amount of swaps - 1
  121.         cmp byte [bp-5], 0 ;have we finished?
  122.         jne next_switch_ ;no? go back!
  123.     mov sp, bp ;return stack pointer to its original state
  124.     pop bp ;retrieve data...
  125.     pop si
  126.     pop bx
  127.     pop dx
  128.     pop ax
  129.     ret ;go back
  130.     endp
  131.  
  132. proc task_ ;input dh:dl - two numbers, output ax - 16 bit number
  133.     push ax ;save
  134.     mov al, [num1_] ;num1_ to al...
  135.     mul [num2_] ;...multiplied by second, 8bit*8bit=16bit => result in ax
  136.     shl ax, 1 ;multiply by 2
  137.     sub ax, 3 ;subtract 3
  138.     mov [numAns_], ax ;move answer to numAns_
  139.     pop ax ;retrieve
  140.     ret ;go back
  141.     endp
  142.  
  143. helloStr_ db "This program calculates the result of 2*x*y-3", NL_, "Using global var type procedure", NL_, "$"
  144. inputStr_ db "Input number in range from 0 to 254:", NL_, "$"
  145. resultStr_ db NL_, "Result:", NL_, "$"
  146. byeStr_ db NL_, "The program has now terminated. Press anything to continue...$"
  147. buffNum db 4, 0, 4 dup(?)
  148. num1_ db 0
  149. num2_ db 0
  150. numAns_ dw 0
  151. buffAns db 6 dup (?)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement