Advertisement
entwastaken

qqq

Jan 13th, 2023
2,435
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2. .stack 200h
  3.  
  4. .data
  5.     msg1 db "Introduceti trei numere pozitive, separate prin tasta ENTER:$", 0
  6.     msg1alt db "Introduceti alte trei numere pozitive, separate prin tasta ENTER:$", 0
  7.     msg2 db "Aria triunghiului este:$", 0
  8.     msg3 db "Aceste trei numere nu pot fi laturile unui triunghi.$", 0
  9.     msg4 db "Suma a oricaror doua laturi trebuie sa fie mai mare decat a treia latura.$", 0
  10.     msgPointer dw 0
  11.  
  12.     latura1 dw 0
  13.     latura2 dw 0
  14.     latura3 dw 0
  15.     semiPerimetru dw 0
  16.     nrcifre dw 0
  17.  
  18.     babylonGuess dw 2
  19.     babylonResult dw 2
  20.  
  21.     arieTriunghi dw 0
  22.     ariePreHeron dw 0
  23. .code
  24.     ;proceduri
  25.  
  26.     p_printMsg PROC
  27.         mov ah, 09h
  28.         int 21h
  29.         ret
  30.     p_printMsg ENDP
  31.  
  32.     p_printNewLine PROC
  33.         mov ah, 02h
  34.         mov dx, 10
  35.         int 21h
  36.  
  37.         mov dx, 13
  38.         int 21h
  39.         ret
  40.     p_printNewLine ENDP
  41.  
  42.     ;main
  43.  
  44.     main:
  45.         mov ax, @data
  46.         mov ds, ax
  47.  
  48.         ;macro-uri
  49.  
  50.         m_printMessage MACRO mesaj
  51.             mov msgPointer, offset mesaj
  52.             mov dx, msgPointer
  53.             call p_printMsg
  54.             call p_printNewLine
  55.         ENDM
  56.  
  57.         m_citireNumar MACRO numar
  58.             local construireNumar
  59.             local endMacro ;declaram doua etichete locale deoarece, daca sunt declarate global, macro-ul va functiona o singura data (etichetele vor fi deja definite in memorie)
  60.  
  61.             construireNumar:
  62.                 mov bx, 0
  63.                 mov cx, 10
  64.                 mov ah, 01h
  65.                 int 21h
  66.  
  67.                 cmp al, 13
  68.                 je endMacro
  69.  
  70.                 sub al, 48
  71.                 mov bl, al
  72.                 mov ax, numar
  73.                 mul cx
  74.                 add ax, bx
  75.  
  76.                 mov numar, ax
  77.             jmp construireNumar
  78.  
  79.             endMacro: ;folosit pentru a iesi din macro
  80.         ENDM
  81.  
  82.         m_checkTriunghi MACRO a, b, c
  83.             mov ax, a
  84.             mov bx, b
  85.             add ax, bx ;calculam suma a doua laturi
  86.             mov bx, c
  87.             cmp ax, c ;comparam suma cu a treia latura
  88.             jng nuEsteTriunghi ;daca suma nu este strict mai mare, programul sare la eticheta "nuEsteTriunghi"
  89.         ENDM
  90.  
  91.         m_heronCalc MACRO s, l
  92.             mov bx, s
  93.             sub bx, l ;in BX avem (semiPerimetru - latura)
  94.             mul bx ;inmultim registrul AX cu BX
  95.         ENDM
  96.  
  97.         ;program
  98.  
  99.         m_printMessage msg1 ;"Introduceti trei numere pozitive, separate prin tasta ENTER:"
  100.  
  101.         citireLaturi: ;citim valorile celor trei laturi utilizand macro-ul m_citireNumar
  102.             m_citireNumar latura1
  103.             m_citireNumar latura2
  104.             m_citireNumar latura3
  105.  
  106.         verificareTriunghi: ;verificam daca cele trei valori introduse pot fi laturile unui triunghi utilizand macro-ul m_checkTriunghi
  107.             m_checkTriunghi latura1, latura2, latura3
  108.             m_checkTriunghi latura1, latura3, latura2
  109.             m_checkTriunghi latura3, latura2, latura1
  110.         jmp calculareSemiP ;cele trei laturi pot forma un triunghi - continuam
  111.  
  112.         nuEsteTriunghi:
  113.             m_printMessage msg3 ;"Aceste trei numere nu pot fi laturile unui triunghi."
  114.             m_printMessage msg4 ;"Suma a oricaror doua laturi trebuie sa fie mai mare decat a treia latura."
  115.             m_printMessage msg1alt ;"Introduceti alte trei numere pozitive, separate prin tasta ENTER:"
  116.             mov latura1, 0
  117.             mov latura2, 0
  118.             mov latura3, 0
  119.             jmp citireLaturi
  120.  
  121.         calculareSemiP:
  122.             mov ax, latura1
  123.             mov bx, latura2
  124.             add ax, bx
  125.             mov bx, latura3
  126.             add ax, bx ;in AX se afla perimetrul triunghiului
  127.             mov semiPerimetru, ax
  128.             shr semiPerimetru, 1 ;shiftare la dreapta cu 1 bit = impartire la 2 - perimetrul devine semiperimetru
  129.        
  130.         heron:
  131.             mov ax, semiPerimetru ;AX=s
  132.             m_heronCalc semiPerimetru, latura1 ;AX=s(s-a)
  133.             m_heronCalc semiPerimetru, latura2 ;AX=s(s-a)(s-b)
  134.             m_heronCalc semiPerimetru, latura3 ;AX=s(s-a)(s-b)(s-c)
  135.             mov ariePreHeron, ax ;in ariePreHeron avem s(s-a)(s-b)(s-c) - ramane de calculat sqrt(ariePreHeron) = arieTriunghi
  136.  
  137.  
  138.         mov bx, babylonGuess ;prima valoare estimata pentru radacina patrata va fi 2
  139.         mov cx, 10 ;cx va fi folosit pentru a itera metoda babyloniana - in cazul acesta, 10 iteratii sunt suficiente pentru orice n<65536
  140.  
  141.         babylonRoot: ;metoda babyloniana pentru radacina patrata
  142.             mov ax, ariePreHeron
  143.             mov dx, 0
  144.             div bx
  145.  
  146.             add ax, bx
  147.             shr ax, 1
  148.             mov bx, ax ;pregatim noua valoare estimata pentru urmatoarea iteratie
  149.  
  150.             mov babylonResult, ax ;la finalul iteratiilor, in babylonResult vom avea estimarea radacinii patrate a numarului din ariePreHeron - babylonResult este aria triunghiului
  151.  
  152.             dec cx
  153.             jnz babylonRoot ;cat timp cx != 0, continuam sa iteram metoda babyloniana
  154.  
  155.         mov ax, babylonResult
  156.         mov arieTriunghi, ax
  157.  
  158.         ;aria a fost calculata si va fi afisata pe ecran
  159.  
  160.         m_printMessage msg2 ;"Aria triunghiului este:"
  161.         mov cx, 10
  162.  
  163.         descompunereNumar:
  164.             mov ax, arieTriunghi
  165.             mov dx, 0
  166.             div cx
  167.             push dx
  168.  
  169.             inc [nrcifre]
  170.             cmp ax, 0
  171.             je afisareNumar
  172.  
  173.             mov arieTriunghi, ax
  174.         jmp descompunereNumar
  175.  
  176.         afisareNumar:
  177.             mov dx, 0
  178.             pop dx
  179.             add dl, 48
  180.             mov ah, 02h
  181.             int 21h
  182.  
  183.             dec [nrcifre]
  184.             cmp nrcifre, 0
  185.             je final
  186.         jmp afisareNumar
  187.  
  188.         final:
  189.             mov ah, 4ch
  190.             int 21h
  191.     end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement