Advertisement
dlarubia

Questão3.asm

Sep 18th, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.06 KB | None | 0 0
  1. ; Programa para o primeiro trabalho de programação no SimuS
  2. ; Alunos: Daniel La Rubia Rolim
  3. ; Leonardo Ventura
  4. ; Maria Eduarda Lucena
  5. ;
  6. ; Grupo B
  7. ;-------------------------------------------------------------
  8.  
  9. ; A ideia principal do programa é subtrair um número do outro
  10. ; usando primeiro a parte alta de cada um
  11. ; se a parte alta for maior de algum dos lados
  12. ; já sabemos qual número é maior
  13. ; senão, teremos que comparar a parte baixa
  14. ; Para o exercício 3 do trabalho, devemos receber um vetor e
  15. ; utilizar a lógica do exercício 2 para resolver a comparação
  16.  
  17. ;-------- variaveis da subrotina Compara
  18. ORG 1000
  19. OP1: DW 0
  20. OP2: DW 0
  21.  
  22. ORG 900
  23. Compara:
  24. ; começo lendo os valores e salvando nas variaveis declaradas acima
  25. POP
  26. STA OP1+1 ; salvo parte BAIXA em OP1+1
  27. POP
  28. STA OP1 ; salvo parte ALTA em OP1
  29.  
  30. POP
  31. STA OP2+1 ; salvo parte BAIXA em OP2+1
  32. POP
  33. STA OP2 ; salvo parte ALTA em OP2
  34.  
  35. LDA OP1+1 ; comparo as partes altas
  36. SUB OP2+1 ; usando subtração
  37. JP POSITIVO ; op1 > op2
  38. JN NEGATIVO ; op2 > op1
  39.  
  40. LDA OP2 ; carregando parte baixa de OP2 no acumulador
  41. NOT ; complemento
  42. STA OP2 ; salvo em OP2
  43. LDA OP1 ; coloco parte baixa de op1 no acumulador
  44. ADD OP2 ; faço OP1 + ~OP2
  45. ADD #1 ; somo 1 para o complemento à 2
  46. JP POSITIVO
  47. JN NEGATIVO
  48. ; operando 1 = operando 2, retornamos 0
  49. LDA #0
  50. JMP CALLBACK_Compara
  51.  
  52. POSITIVO: ; operando 1 > operando 2
  53. LDA #1 ; retornando 1
  54. JMP CALLBACK_Compara
  55. NEGATIVO: ; operando 2 > operando 1
  56. LDA OP2+1
  57. LDA #-1 ; retornando -1
  58. JMP CALLBACK_Compara
  59.  
  60. ;---------- variaveis da subrotina PercorreVetor
  61. ORG 700
  62. VSIZE: DB 0
  63. POINTER: DW 0
  64. ITERATOR: DB 0
  65. MAIOR: DW 0
  66. INDEX: DB 0
  67. CURR: DW 0
  68.  
  69. ;---------- subrotina PercorreVetor
  70. ORG 400
  71. PercorreVetor:
  72. SHL ; como tenho valor em 16 bits, preciso multiplicar por 2
  73. STA VSIZE ; salvando em VSIZE o tamanho do vetor * 2
  74. POP ; pegando a parte alta do endereço de V[0]
  75. STA POINTER
  76. POP
  77. STA POINTER
  78. LDS POINTER ; aponto pra V[0]
  79. POP ;
  80. STA CURR ; curr = parte (alta|baixa) de V[0]
  81. STA MAIOR ;
  82. POP ;
  83. STA CURR+1 ; curr = parte (alta|baixa) de V[0]
  84. STA MAIOR+1 ; maior = V[0]
  85. STS POINTER ; salvo sp em pointer
  86. LDA #0 ; acc = 0
  87. STA ITERATOR ; iterator = 0
  88. LOOP:
  89. ; incrementando iterator
  90. LDA ITERATOR
  91. ADD #2
  92. STA ITERATOR
  93. LDA VSIZE ; carrega VSIZE no acc
  94. SUB ITERATOR ; comparo com tamanho do ITERATOR
  95. JZ FIM ; se VSIZE - ITERATOR = 0, termino
  96. LDS POINTER
  97. POP
  98. STA CURR
  99. POP
  100. STA CURR+1
  101. STS POINTER ; salvando apontador de pilha em POINTER
  102. LDS #0FF00H ; indo para um endereço de memória nao utilizado para realizar a rotina
  103. LDA MAIOR ; coloca parte baixa de MAIOR no acc
  104. PUSH ; coloca parte baixa de MAIOR na pilha
  105. LDA MAIOR+1 ; coloca parte alta de maior no acc
  106. PUSH ; coloca parte alta de MAIOR na pilha
  107. LDA CURR ; coloco parte baixa de maior na pilha
  108. PUSH
  109. LDA CURR+1 ; coloco parte alta de maior na pilha
  110. PUSH
  111. JMP Compara ; chama rotina Compara
  112. CALLBACK_Compara:
  113. ; após comparação, devo decidir se achei um número maior do que já tenho ou não
  114. XOR #1 ; comparo com 1
  115. JNZ LOOP ; se não for igual a 1, volta pro início do loop
  116. ; se for igual a 1, achei um novo maior, atualizo
  117. LDA CURR
  118. STA MAIOR
  119. LDA CURR+1
  120. STA MAIOR+1
  121. LDA ITERATOR ; e por fim
  122. STA INDEX ; salvo o index dele em INDEX
  123. JMP LOOP ; e volto pro inicio do loop
  124.  
  125. FIM: ; no final do programa, devo colocar INDEX no acumulador e sair
  126. LDA INDEX
  127. JMP CALLBACK_MAIN
  128.  
  129.  
  130. ;--------- variaveis da Main
  131. ORG 100
  132. PT: DW VETOR
  133. ; VETOR: DW -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  134. VETOR: DW 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
  135. SIZE: DB 20
  136.  
  137. ;--------- main
  138. ORG 0
  139. MAIN:
  140. OUT CLEARBANNER
  141. LDA PT
  142. PUSH
  143. LDA PT+1
  144. PUSH
  145. LDA SIZE
  146. JMP PercorreVetor
  147. CALLBACK_MAIN:
  148. ADD PT ; somado ao index, tenho o endereço de onde está a maior variavel do vetor
  149. ADD #1
  150. STA PT
  151. LDA @PT
  152. JSR Print
  153. LDA PT
  154. SUB #1
  155. STA PT
  156. LDA @PT
  157. JSR Print
  158. HLT
  159.  
  160. ORG 1100
  161. X: DB 0
  162. Y: DB 0
  163.  
  164. ORG 1200
  165. Print:
  166. STA Y ; salvo número em Y
  167. AND #0F0H ; pego a parte alta do número (1111 0000)
  168. SHR
  169. SHR
  170. SHR
  171. SHR ; e dou shift 4 vezes pra colocar a parte alta na parte baixa
  172. JSR GetAscii ; desvio pra rotina GetAscii
  173. LDA Y ; carrego Y no acumulador
  174. AND #0FH ; pego a parte baixa
  175. JSR GetAscii ; chamo rotina GetAscii
  176. RET ; retorno
  177. GetAscii:
  178. STA X ; salvo número em X
  179. ADD #0F7H ; comparo com complemento à 2 de 9 (0000 1001): (1111 0110) + 1
  180. JN Numero ; se nao for negativo, é numero
  181. Letra:
  182. ADD #40H ; somo o que ficou no acumulador com #40H para chegar na posição da tabela onde ficam as letras
  183. JMP PBanner ; coloco no banner
  184. Numero:
  185. LDA X ; carrego X no acumulador
  186. ADD #30H ; usando macete da tabela ascii
  187. PBanner:
  188. OUT BANNER
  189. RET
  190.  
  191.  
  192. ;------------------------------------------------------
  193. ; constantes de hardware
  194. CLEARBANNER EQU 3
  195. BANNER EQU 2
  196. STATUS EQU 1
  197. ; constantes de trap
  198. CONSOLEWRITE EQU 2
  199. ;------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement