Advertisement
skalarr

Asembler_sov

Jun 10th, 2022
1,287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 12.40 KB | None | 0 0
  1. .section .data
  2. punos:      .ascii "Unesite string: \0"
  3. punos_len=.-punos
  4. str1: .fill 30,1,0
  5. str1_len: .long 31
  6. pgreska:    .ascii "Doslo je do greske u izvrsavanju programa!\n\0"
  7. pgreska_len=.-pgreska
  8. psuma:      .ascii "Suma elemenata niza je: \0"
  9. psuma_len=.-psuma
  10. str2: .fill 10,1,0
  11. str2_len=.-str2
  12. pbroj_oktalnih: .ascii "\nBroj oktalnih elemenata u nizu: \0"
  13. pbrojo_len=.-pbroj_oktalnih
  14. str3: .fill 10,1,0
  15. str3_len=.-str3
  16. pbroj_decimalnih: .ascii "\nBroj decimalnih elemenata u nizu: \0"
  17. pbrojd_len=.-pbroj_decimalnih
  18. str4: .fill 10,1,0
  19. str4_len=.-str4
  20. pnovi_red:  .ascii "\n\0"
  21. p_len=.-pnovi_red
  22.  
  23. suma: .long 0
  24. brojo: .long 0
  25. brojd: .long 0
  26. baza1: .long 10 # za dekadne
  27. baza2: .long 8  # za oktalne
  28. privremena: .long 0
  29. privremena1: .long 0
  30. privremena2: .long 0
  31. #  0 1 1234567899999
  32. .section .text
  33. .globl main
  34. main:
  35. movl $4, %eax
  36. movl $1, %ebx
  37. movl $punos, %ecx
  38. movl $punos_len, %edx
  39. int $0x80
  40.  
  41. movl $3, %eax
  42. movl $0, %ebx
  43. movl $str1, %ecx    # %ecx nam kupi adresu stringa str1
  44. movl str1_len, %edx
  45. int $0x80
  46.  
  47. movl $0, %eax
  48. movl $0, %ebx
  49. movl $0, %edx
  50. movl $0, %esi
  51.  
  52. petlja:
  53.     movb (%ecx), %bl
  54.     cmpb $'\n' , %bl
  55.     je dalje
  56.     cmpb $'0' , %bl
  57.     jb greska1
  58.     cmpb $'9' , %bl
  59.     ja greska1
  60.     cmpb $' ' , %bl
  61.     je sledeci
  62.     cmpb $'0' , %bl
  63.     je oktalniprovera
  64.     jne dekadni1
  65. sledeci:
  66.     incl %ecx
  67.     jmp petlja
  68.    
  69. oktalniprovera:
  70.     incl %ecx
  71.     movb (%ecx), %bl
  72.     cmpb $' ' , %bl
  73.     je smanji
  74.     decl %ecx
  75.     jmp oktalni1
  76.  
  77. smanji:
  78.     decl %ecx
  79.     movb (%ecx), %bl
  80.     jmp dekadni1
  81.  
  82. oktalni1:
  83.     movb (%ecx), %bl
  84.  
  85. oktalni:
  86.     cmpb $'\n' , %bl
  87.     je sacuvaj1
  88.     cmpb $' ' , %bl
  89.     je sacuvaj1
  90.     cmpb $'0' , %bl
  91.     jb greska1
  92.     cmpb $'9' , %bl
  93.     ja greska1
  94.     subb $'0' , %bl
  95.     movl $0, %edx
  96.     mull baza2
  97.     jc greska3
  98.     addl %ebx, %eax
  99.     jc greska3
  100.     incl %ecx
  101.     movb (%ecx), %bl
  102.     jmp oktalni
  103.  
  104. dekadni1:
  105.     cmpb $'\n' , %bl
  106.     je sacuvaj2
  107.     cmpb $' ' , %bl
  108.     je sacuvaj2
  109.     cmpb $'0' , %bl
  110.     jb greska1
  111.     cmpb $'9' , %bl
  112.     ja greska1
  113.     subb $'0' , %bl
  114.     movl $0, %edx
  115.     mull baza1
  116.     jc greska3
  117.     addl %ebx, %eax
  118.     jc greska3
  119.     incl %ecx
  120.     movb (%ecx), %bl
  121.     jmp dekadni1
  122.  
  123. sacuvaj1:
  124.     incl brojo
  125.     jmp sacuvaj
  126.  
  127. sacuvaj2:
  128.     incl brojd
  129.     jmp sacuvaj
  130.  
  131. sacuvaj:    # sabiramo clanove niza
  132.     addl %eax, suma
  133.     jc greska4
  134.     incl %ecx
  135.     movl $0, %eax
  136.     cmpb $'\n' ,%bl
  137.     je dalje
  138.     jmp petlja
  139.  
  140. dalje:
  141.     movl $0, %eax
  142.     movl $0, %ebx
  143.     movl $0, %edx
  144.     movl $str2, %ecx
  145.     movl suma, %eax
  146.     movl %ecx, %ebx
  147.     cmpl $0, %eax
  148.     je nula
  149.  
  150. suma1:  # sumu konvertujemo iz dekadnog u znakovni oblik
  151.     cmpl $0, %eax
  152.     je obrni1
  153.     movl $0, %edx
  154.     divl baza1
  155.     addb $'0' , %dl
  156.     movb %dl, (%ecx)
  157.     incl %ecx
  158.     jmp suma1
  159.  
  160. obrni1:
  161.     decl %ecx
  162.  
  163. obrni:
  164.     movb (%ecx), %dl
  165.     movb (%ebx), %dh
  166.     movb %dh,(%ecx)
  167.     movb %dl, (%ebx)
  168.     incl %ebx
  169.     decl %ecx
  170.     cmpl %ecx, %ebx
  171.     jb obrni
  172.     jmp dalje1
  173.    
  174. nula:
  175.     movl $'0' ,(%ecx)
  176.    
  177. dalje1:
  178.     movl $0, %eax
  179.     movl $0, %ebx
  180.     movl $0, %edx
  181.     movl $str3, %ecx
  182.     movl brojo, %eax
  183.     movl %ecx, %ebx
  184.     cmpl $0, %eax
  185.     je nula1
  186.    
  187. brojo1:
  188.     cmpl $0, %eax
  189.     je obrni2
  190.     movl $0, %edx
  191.     divl baza1
  192.     addb $'0' , %dl
  193.     movb %dl, (%ecx)
  194.     incl %ecx
  195.     jmp brojo1
  196.    
  197. obrni2:
  198.     decl %ecx
  199.    
  200. obrni3:
  201.     movb (%ecx), %dl
  202.     movb (%ebx), %dh
  203.     movb %dh,(%ecx)
  204.     movb %dl, (%ebx)
  205.     incl %ebx
  206.     decl %ecx
  207.     cmpl %ecx, %ebx
  208.     jb obrni3
  209.     jmp dalje2
  210. nula1:
  211.     movl $'0' ,(%ecx)
  212.  
  213. dalje2:
  214.     movl $0, %eax
  215.     movl $0, %ebx
  216.     movl $0, %edx
  217.     movl $str4, %ecx
  218.     movl brojd, %eax
  219.     movl %ecx, %ebx
  220.     cmpl $0, %eax
  221.     je nula2
  222. brojd1:
  223.     cmpl $0, %eax
  224.     je obrni4
  225.     movl $0, %edx
  226.     divl baza1
  227.     addb $'0' , %dl
  228.     movb %dl, (%ecx)
  229.     incl %ecx
  230.     jmp brojd1
  231. obrni4:
  232.     #movb $'\n' ,(%ecx)
  233.     decl %ecx
  234. obrni5:
  235.     movb (%ecx), %dl
  236.     movb (%ebx), %dh
  237.     movb %dh,(%ecx)
  238.     movb %dl, (%ebx)
  239.     incl %ebx
  240.     decl %ecx
  241.     cmpl %ecx, %ebx
  242.     jb obrni5
  243.     jmp ispis
  244. nula2:
  245.     movl $'0' ,(%ecx)
  246.  
  247. ispis:
  248.     movl $4, %eax
  249.     movl $1, %ebx
  250.     movl $psuma, %ecx
  251.     movl $psuma_len, %edx
  252.     int $0x80
  253.  
  254.     movl $4, %eax
  255.     movl $1, %ebx
  256.     movl $str2, %ecx
  257.     movl $str2_len, %edx
  258.     int $0x80
  259.    
  260.     movl $4, %eax
  261.     movl $1, %ebx
  262.     movl $pbroj_oktalnih, %ecx
  263.     movl $pbrojo_len, %edx
  264.     int $0x80
  265.  
  266.     movl $4, %eax
  267.     movl $1, %ebx
  268.     movl $str3, %ecx
  269.     movl $str3_len, %edx
  270.     int $0x80
  271.    
  272.     movl $4, %eax
  273.     movl $1, %ebx
  274.     movl $pbroj_decimalnih, %ecx
  275.     movl $pbrojd_len, %edx
  276.     int $0x80
  277.  
  278.     movl $4, %eax
  279.     movl $1, %ebx
  280.     movl $str4, %ecx
  281.     movl $str4_len, %edx
  282.     int $0x80
  283.    
  284.     movl $4, %eax
  285.     movl $1, %ebx
  286.     movl $pnovi_red, %ecx
  287.     movl $p_len, %edx
  288.     int $0x80
  289.     movl $0, %ebx
  290.  
  291. kraj:
  292.     movl $1, %eax
  293.     int $0x80
  294.    
  295. greska1:
  296.     movl $4, %eax
  297.     movl $1, %ebx
  298.     movl $pgreska, %ecx
  299.     movl $pgreska_len, %edx
  300.     int $0x80
  301.     movl $1, %ebx
  302.     jmp kraj
  303. greska3:    #jc
  304.     movl $4, %eax
  305.     movl $1, %ebx
  306.     movl $pgreska, %ecx
  307.     movl $pgreska_len, %edx
  308.     int $0x80
  309.     movl $2, %ebx
  310.     jmp kraj
  311. greska4:
  312.     movl $4, %eax
  313.     movl $1, %ebx
  314.     movl $pgreska, %ecx
  315.     movl $pgreska_len, %edx
  316.     int $0x80
  317.     movl $3, %ebx
  318.     jmp kraj
  319.  
  320. ################################testiraj.sh
  321.  
  322.  
  323. #!/bin/bash
  324. # testiranje rešenja zadatka sa unapred definisanim ulazima
  325.  
  326. #   Copyright 2017 Žarko Živanov
  327. #
  328. #   This program is free software: you can redistribute it and/or modify
  329. #   it under the terms of the GNU General Public License as published by
  330. #   the Free Software Foundation, either version 3 of the License, or
  331. #   (at your option) any later version.
  332. #
  333. #   This program is distributed in the hope that it will be useful,
  334. #   but WITHOUT ANY WARRANTY; without even the implied warranty of
  335. #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  336. #   GNU General Public License for more details.
  337. #
  338. #   You should have received a copy of the GNU General Public License
  339. #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
  340.  
  341. # exit 0 - stiglo se do testova
  342. # exit 1 - greška u kompajliranju
  343. # exit 2 - nije nađen fajl
  344.  
  345. TESTS=(01 02 03 04 05 06 07)
  346. EXITS=(0 0 0 1 2 3 1)
  347. EMPTY="#"
  348. QUIET=0
  349. KEEP=0
  350. SIG=""
  351.  
  352. TEST01=$(cat <<EOL
  353. 0 00 01 1 2 014 14
  354. EOL
  355. )
  356.  
  357. OUTP01=$(cat <<EOL
  358. Unesite string: 0 00 01 1 2 014 14
  359. Suma elemenata niza je: 30
  360. Broj oktalnih elemenata u nizu: 3
  361. Broj decimalnih elemenata u nizu: 4
  362. EOL
  363. )
  364.  
  365. TEST02=$(cat <<EOL
  366. 00 01 02 03 04 05 06 07
  367. EOL
  368. )
  369.  
  370. OUTP02=$(cat <<EOL
  371. Unesite string: 00 01 02 03 04 05 06 07
  372. Suma elemenata niza je: 28
  373. Broj oktalnih elemenata u nizu: 8
  374. Broj decimalnih elemenata u nizu: 0
  375. EOL
  376. )
  377.  
  378. TEST03=$(cat <<EOL
  379. 0 1 2 3 4 5 6 7 8 9
  380. EOL
  381. )
  382.  
  383. OUTP03=$(cat <<EOL
  384. Unesite string: 0 1 2 3 4 5 6 7 8 9
  385. Suma elemenata niza je: 45
  386. Broj oktalnih elemenata u nizu: 0
  387. Broj decimalnih elemenata u nizu: 10
  388. EOL
  389. )
  390.  
  391. TEST04=$(cat <<EOL
  392. 0 01 1 , 2 02 14 f
  393. EOL
  394. )
  395.  
  396. OUTP04=$(cat <<EOL
  397. Unesite string: 0 01 1 , 2 02 14 f
  398. Doslo je do greske u izvrsavanju programa!
  399. EOL
  400. )
  401.  
  402. TEST05=$(cat <<EOL
  403.  0 1 1234567899999
  404. EOL
  405. )
  406.  
  407. OUTP05=$(cat <<EOL
  408. Unesite string:  0 1 1234567899999
  409. Doslo je do greske u izvrsavanju programa!
  410. EOL
  411. )
  412.  
  413. TEST06=$(cat <<EOL
  414. 5 0789 4294967294
  415. EOL
  416. )
  417.  
  418. OUTP06=$(cat <<EOL
  419. Unesite string: 5 0789 4294967294
  420. Doslo je do greske u izvrsavanju programa!
  421. EOL
  422. )
  423.  
  424. TEST07=$(cat <<EOL
  425. 5 f 0789 4294967294
  426. EOL
  427. )
  428.  
  429. OUTP07=$(cat <<EOL
  430. Unesite string: 5 f 0789 4294967294
  431. Doslo je do greske u izvrsavanju programa!
  432. EOL
  433. )
  434.  
  435. function echoq {
  436.     if [ $QUIET -eq 0 ]; then
  437.         echo "$@"
  438.     fi
  439. }
  440.  
  441. if [ "$1" == "-q" ]; then
  442.     QUIET=1
  443.     shift
  444. fi
  445. if [ "$1" \> "00" ] && [ "$1" \< "99" ]; then
  446.     TESTS=($1)
  447.     KEEP=1
  448.     shift
  449. fi
  450.  
  451. if [ "$1" != "" ] && [ -f "$1" ]; then
  452.     echoq -e "\n\e[01;32mKompajliranje...\e[00m"
  453.     grep ".text" $1 1>/dev/null 2>/dev/null && (grep ".globl" $1 1>/dev/null 2>/dev/null || grep ".global" $1 1>/dev/null 2>/dev/null)
  454.     if [ $? -ne 0 ]; then
  455.         echoq -e "\e[01;31m\n\nNije asemblerski program!\e[00m\n"
  456.         exit 1
  457.     fi
  458.     GLAVNI=""
  459.     if [ $(grep -c "main:" $1) == "0" ]; then
  460.         if [ -f glavni.c ]; then
  461.             GLAVNI=glavni.c
  462.         else
  463.             echoq -e "\e[01;31m\n\nNije nađen glavni.c!\e[00m\n"
  464.         fi
  465.     fi
  466.     #nalaženje fajlova od kojih se sastoji rešenje
  467.     zfiles=$(grep -E "^[[:space:]]*#[[:space:]]*fajlovi[[:space:]]*:" $1)
  468.     if [ "$zfiles" != "" ]; then
  469.         zfiles=${zfiles#*:}
  470.     else
  471.         zfiles="$@"
  472.     fi
  473.     gcc -g -m32 -o zad $GLAVNI $zfiles 1>out1 2>&1
  474.     if [ $? -ne 0 ]; then
  475.         echoq -e "\e[01;31m\n\nGreška u kompajliranju!\e[00m\n"
  476.         if [ $QUIET -eq 0 ]; then
  477.             cat out1
  478.         else
  479.             echo "0"
  480.         fi
  481.         rm -f out1
  482.         exit 1
  483.     fi
  484. else
  485.     if [ "$1" != "" ]; then
  486.         echoq -e "\e[01;31mFajl \"$1\" nije nađen!\e[00m"
  487.     fi
  488.     lasttest=${TESTS[${#TESTS[@]}-1]}
  489.     echoq -e "\n\e[01;32mUpotreba:\e[00m"
  490.     echoq -e "\e[01;34m$0 [-q] [TT] \e[01;32mime_programa.S\e[00m"
  491.     echoq -e "Opcija -q ispisuje samo procenat uspešnih testova"
  492.     echoq -e "Opcija TT (01<=TT<=$lasttest) pokreće samo zadati test i ispisuje diff izlaz za njega\n"
  493.     if [ $QUIET -ne 0 ]; then
  494.         echo "0"
  495.     fi
  496.     exit 2
  497. fi
  498.  
  499. cat >./run <<EOL
  500. spawn -noecho [lindex \$argv 0]
  501. for {set i 1} {\$i < [llength \$argv]} {incr i 1} {
  502.     sleep 0.05
  503.     send -- "[lindex \$argv \$i]"
  504.     send "\r"
  505. }
  506. expect eof
  507. catch wait reason
  508. set sig [lindex \$reason 5]
  509. if {\$sig == ""} {
  510.     set code [lindex \$reason 3]
  511. } elseif {\$sig == "SIGFPE"} {
  512.     set code [expr 128+8]
  513. } elseif {\$sig == "SIGSEGV"} {
  514.     set code [expr 128+11]
  515. } elseif {\$sig == "SIGINT"} {
  516.     set code [expr 128+2]
  517. } elseif {\$sig == "SIGILL"} {
  518.     set code [expr 128+4]
  519. } elseif {\$sig == "SIGKILL"} {
  520.     set code [expr 128+9]
  521. } else {
  522.     set code [expr 128+1]
  523. }
  524. exit \$code
  525. EOL
  526.  
  527. passed=0
  528. total=0
  529. nn=0
  530. for n in "${TESTS[@]}"; do
  531.     echoq -e "\n\n\e[01;34m-----------------------------------"
  532.     echoq "TEST $n"
  533.     echoq -e "-----------------------------------\e[00m"
  534.     tcode=${EXITS[$nn]}
  535.     cor="OUTP$n"
  536.     eval cor="\$$cor"
  537.     echo -e "$cor" > out2
  538.     echoq -e "\e[01;32mTAČAN IZLAZ:\e[00m"
  539.     if [ $QUIET -eq 0 ]; then
  540.         cat out2
  541.     fi
  542.     echoq -e "Izlazni kod: \e[01;32m$tcode\e[00m"
  543.     tst="TEST$n"
  544.     eval tst=\$$tst
  545.     oldIFS="$IFS"; IFS=$'\n'
  546.     tst=($tst)
  547.     IFS="$oldIFS"
  548.     lin=${#tst[*]}
  549.     for ((l=0; l<lin; l++ )); do
  550.         if [ "${tst[$l]}" == "$EMPTY" ]; then
  551.             eval tst[$l]=""
  552.         fi
  553.     done
  554.     ok=1
  555.     expect run ./zad "${tst[@]}" 1>out1 2>&1
  556.     code=$?
  557.     sed -i -e '$a\' out1
  558.    sed -i 's/\x0//g' out1
  559.     sed -i 's/\xd//g' out1
  560.     sed -i '/^$/d' out1
  561.     sed -i 's/\x0//g' out1
  562.     for ((i=1; i<32; i++)); do
  563.         if [ $i -ne 9 ] && [ $i -ne 10 ] && [ $i -ne 13 ]; then
  564.             hex=$(printf '%X' $i)
  565.             sed -i "s/\x$hex/[0x$hex]/g" out1
  566.         fi
  567.     done
  568.     for ((i=128; i<256; i++)); do
  569.         hex=$(printf '%X' $i)
  570.         sed -i "s/\x$hex/[0x$hex]/g" out1
  571.     done
  572.     echoq -e "\e[01;34m\nVAŠ IZLAZ:\e[00m"
  573.     if [ $QUIET -eq 0 ]; then
  574.         cat out1
  575.     fi
  576.     diff -q -a -w out1 out2 1>/dev/null 2>/dev/null
  577.     if [ $? -eq 0 ]; then
  578.         echoq -e "\e[01;32m\nIzlazi se poklapaju.\e[00m"
  579.     else
  580.         echoq -e "\e[01;31m\nIzlazi se NE poklapaju!\e[00m"
  581.         ok=0
  582.     fi
  583.     if [ $code -gt 127 ]; then
  584.         code=$((code-128))
  585.         sig=""
  586.         if [ $code -eq 8 ]; then sig=" (SIGFPE - Floating point exception)"; fi
  587.         if [ $code -eq 11 ]; then sig=" (SIGSEGV - Invalid memory segment access)"; fi
  588.         echoq -e "\n\e[01;31mProgram je vratio Fatal error signal $code$sig!\e[00m"
  589.         ok=0
  590.         SIG="(zbog \e[01;31mexception\e[00m-a) "
  591.     elif [ $code -eq $tcode ]; then
  592.         echoq -e "\nIzlazni kod: \e[01;32m$code\e[00m"
  593.     else
  594.         echoq -e "\n\e[01;31mPogrešan izlazni kod: $code\e[00m"
  595.         ok=0
  596.     fi
  597.     total=$((total + 1))
  598.     if [ $ok -eq 1 ]; then
  599.         passed=$((passed + 1))
  600.     fi
  601.     nn=$((nn+1))
  602. done
  603. percent=$((passed * 100 / total))
  604. if [ "$SIG" != "" ]; then
  605.     percent=0
  606. fi
  607. echoq -e "\n\n\e[01;34m-----------------------------------"
  608. echoq "Ukupan rezultat"
  609. echoq -e "-----------------------------------\e[00m"
  610. if [ $passed -eq $total ]; then
  611.     col="\e[01;32m"
  612. else
  613.     col="\e[01;31m"
  614. fi
  615. echoq -e "Prošlo je ${col}${passed}\e[00m od \e[01;32m${total}\e[00m automatskih testova, odnosno ${SIG}${col}${percent}%.\e[00m\n"
  616. if [ $KEEP -eq 0 ]; then
  617.     rm -f zad run out1 out2 1>/dev/null 2>/dev/null
  618. else
  619.     rm -f run 1>/dev/null 2>/dev/null
  620.     #diff -u -a -w out1 out2
  621. fi
  622. if [ $QUIET -ne 0 ]; then
  623.     echo $percent
  624. fi
  625. if [ "$SIG" != "" ]; then
  626.     exit 3
  627. else
  628.     exit 0
  629. fi
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement