assembler


SUBMITTED BY: Erathan

DATE: April 5, 2016, 4:55 p.m.

FORMAT: Text only

SIZE: 2.3 kB

HITS: 87028

  1. ;*********** WINDLX Ex.1: Read a positive integer number *************
  2. ;*********** (c) 1991 Günther Raidl *************
  3. ;*********** Modified 1992 Maziar Khosravipour *************
  4. ;-----------------------------------------------------------------------------
  5. ;Subprogram call by symbol "InputUnsigned"
  6. ;expect the address of a zero-terminated prompt string in R1
  7. ;returns the read value in R1
  8. ;changes the contents of registers R1,R13,R14
  9. ;-----------------------------------------------------------------------------
  10. .data
  11. ;*** Data for Read-Trap
  12. ReadBuffer: .space 80
  13. ReadPar: .word 0,ReadBuffer,80
  14. ;*** Data for Printf-Trap
  15. PrintfPar: .space 4
  16. SaveR2: .space 4
  17. SaveR3: .space 4
  18. SaveR4: .space 4
  19. SaveR5: .space 4
  20. .text
  21. .global InputSigned
  22. InputSigned:
  23. ;*** save register contents
  24. sw SaveR2,r2
  25. sw SaveR3,r3
  26. sw SaveR4,r4
  27. sw SaveR5,r5
  28. ;*** Prompt
  29. sw PrintfPar,r1
  30. addi r14,r0,PrintfPar
  31. trap 5
  32. ;*** call Trap-3 to read line
  33. addi r14,r0,ReadPar
  34. trap 3
  35. ;*** determine value
  36. addi r2,r0,ReadBuffer
  37. addi r1,r0,0
  38. addi r4,r0,10 ;Decimal system
  39. petla: ;*** reads digits to end of line
  40. lbu r3,0(r2)
  41. ;odczytujemy jaki znak stoi na 1 miejscu +,-,czy moze liczba bez znaku
  42. snei r5, r3, #45 ;jezeli - to do znakminus
  43. beqz r5, minus
  44. snei r5, r3, #43 ;i jesli sa rowne to ustawi sie na 0
  45. beqz r5, plus
  46. snei r5,r3,#10 ;LF -> Exit jak wczyta entera to zkaonczy wczytywanie tego ciagu
  47. beqz r5,Finish
  48. subi r3,r3,#48 ;´0´
  49. multu r1,r1,r4 ;Shift decimal
  50. add r1,r1,r3
  51. addi r2,r2,#1 ;increment pointer
  52. snei r5,r3,#10 ;LF -> Exit
  53. beqz r5,Finish
  54. j petla
  55. minus:
  56. addi r6,r0,#-1 ;zaznaczamy że liczba ujemna
  57. addi r2,r2,#1 ;zwiekszamy increment pointer
  58. j petla
  59. plus:
  60. addi r2,r2,1 ;zwiekszamy increment pointer
  61. j petla
  62. ujemna:
  63. addi r7,r7,#-1 ;ladujemy do r7 -1
  64. mult r1,r1,r7 ;mnożymy r1 razy -1 zeby otrzymac liczbe ujemna
  65. addi r6,r0,#0 ;zeruje r6
  66. addi r7,r0,#0 ;zeruje r7
  67. Finish: ;*** restore old register contents
  68. bnez r6,ujemna
  69. lw r2,SaveR2
  70. lw r3,SaveR3
  71. lw r4,SaveR4
  72. lw r5,SaveR5
  73. jr r31

comments powered by Disqus