Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.52 KB | None | 0 0
  1. ;Atpazistamas komandos atvejis 1011wreg bojb [bovb]
  2. ;MOV registras, betarpiskas operandas
  3.  
  4. ;Konkreciau - programoje parodytas tik 10111011 bobj bovb
  5. ;MOV bx, bovb bojb
  6. ;Pvz.: BB 12 34 => MOV bx, 03412h
  7.  
  8. ;Prefiksai sioje pavyzdineje programoje nenagrinejami todel, kad
  9. ;si komanda nedirba su atmintim (registrai yra ne atmintyje, o procesoriuje)
  10. ;ir nera eilutine
  11.  
  12. .model small
  13. .stack 100h
  14. .data
  15. senasIP dw ?
  16. senasCS dw ?
  17.  
  18. regAX dw ?
  19. regBX dw ?
  20. regCX dw ?
  21. regDX dw ?
  22. regSP dw ?
  23. regBP dw ?
  24. regSI dw ?
  25. regDI dw ?
  26.  
  27. baitas1 db ?
  28. baitas2 db ?
  29. baitas3 db ?
  30. baitas4 db ?
  31. baitas5 db ?
  32. baitas6 db ?
  33.  
  34. zingsn_pranesimas db "Zingsninis pertraukimas: $"
  35. mov_bx_kabl db "MOV bx, $"
  36. bx_lygu db "bx=$"
  37. enteris db 13,10,"$"
  38. .code
  39. mov ax, @data
  40. mov ds, ax
  41.  
  42. ;<<<<Cia turetu buti help parametra /? apdorojantis kodas>>>>>
  43.  
  44. ;============ISSISAUGOME SENUS PERTRAUKIMO CS,IP============
  45. ;Zingsninis pertraukimas yra INT 1
  46. ;Vektoriu lentele prasideda adresu 00000
  47. ;N-tojo pertraukimo (INT n), adresu 4n
  48. ;Pirmojo: INT 1 adresu 00004
  49. ;IP zodis padetas: 00004, 00005 (jaun, vyr)
  50. ;CS zodis padetas: 00006, 00007 (jaun, vyr)
  51. ;Pertraukimo apdorojimo proceduros AA=CS*10h+IP
  52. mov ax, 0
  53. mov es, ax ;Extra segmentas prasides ten pat kur vektoriu lentele
  54. ;To reikia, kad galetume prieiti prie vektoriu lenteles baitu reiksmiu
  55.  
  56. mov ax, es:[4]
  57. mov bx, es:[6]
  58. mov senasCS, bx
  59. mov senasIP, ax ;neisikeliam tiesiai, nes nera perdavimo is atminties i atminti (butina panaudoti registrus, isimtis eilutines komandos, bet jas panaudoti butu sudetingiau)
  60.  
  61. ;===================PERIMAME PERTRAUKIMA==========================
  62. ;Pertraukimo CS reiksme imame tokia, kokia ji yra sioje programos vietoje
  63. ;Pertraukimo IP reiksme imama offset pertraukimas
  64. ;t.y. "pertraukimas" proceduros poslinkis nuo kodo segmento pradzios
  65. mov ax, cs
  66. mov bx, offset pertraukimas
  67.  
  68. mov es:[4], bx
  69. mov es:[6], ax
  70.  
  71. ;=================AKTYVUOJAME ZINGSNINI REZIMA===================
  72. ;Tam reikia nustatyti status flag registre pozymi TF vienetu
  73. ;Su SF registru galime "bendrauti" tik per steka (noredami keisti TF pozymi)
  74. pushf ;PUSH SF
  75. pop ax
  76. or ax, 100h ;0000 0001 0000 0000 (TF=1, kiti lieka kokie buvo)
  77. push ax
  78. popf ;POP SF ;>Zingsninis rezimas ijungiamas po sios komandos ivykdymo - ivykdzius kiekviena sekancia komanda ivyks zingsninis pertraukimas
  79.  
  80. ;==================BELEKOKIOS KOMANDOS====================
  81. ;Testinis gabaliukas, kur vykdomos komandos, kurias pertraukimas
  82. ;Zingsninis vykdomas PO kiekvienos komandos bandys atpazinti
  83. ;Pirmoji komanda siame bloke nebus atpazinta todel, kad zingsninis pertraukimas
  84. ;Ivykes po pirmosios komandos ivykdymo gauna CS,IP reiksmes, kurios rodo
  85. ;i sekancia, o ne einamaja komanda
  86.  
  87. mov bx, 9854h
  88. mov bx, 7897h
  89. inc bx
  90. mov bx, 1234h
  91. ;==================ISJUNGIAME ZINGSNINI REZIMA======================
  92. pushf
  93. pop ax
  94. and ax, 0FEFFh ;1111 1110 1111 1111 (nuliukas priekyj F, nes skaiciai privalo prasideti skaitmeniu, ne raide) - TF=0, visi kiti liks nepakeisti
  95. push ax
  96. popf ;>Zingsninis rezimas isjungiamas po sios komandos ivykdymo
  97. ;===================ATSTATOME PERTRAUKIMO CS, IP===================
  98. ;Kaip reikia uzdaryti failus, taip ir kai pertraukimas nereikalingas
  99. ;butina atstatyti vektoriu lenteleje ankstesni jo adresa
  100. ;Principas - "kaip radom taip ir paliekam"
  101. mov ax, senasIP
  102. mov bx, senasCS
  103. mov es:[4], ax
  104. mov es:[6], bx
  105.  
  106. uzdaryti_programa:
  107. mov ah, 4Ch
  108. int 21h
  109.  
  110.  
  111.  
  112.  
  113.  
  114. ;==================================================================
  115. ;Pertraukimo apdorojimo procedura
  116. ;==================================================================
  117. pertraukimas:
  118. ;issisaugom registru reiksmes, nes pertraukime ketiname su jom dirbti, o pertraukimas
  119. ;turetu ivykti nepaveikdamas programos darbo (ir senu registru reiksmiu)
  120. ;be to gali tekti vietomis spausdinti iskvieciant pertraukima esancias registru reiksmes :]
  121. mov regAX, ax
  122. mov regBX, bx
  123. mov regCX, cx
  124. mov regDX, dx
  125. mov regSP, sp
  126. mov regBP, bp
  127. mov regSI, si
  128. mov regDI, di
  129.  
  130. ;Sie veiksmai reikalingi norint gauti komandos poslinki nuo kodo segmento pradzios i SI registra (kad galetume prieiti prie tu baitu reiksmiu)
  131. pop si ;pasiimam IP reiksme (kvieciant pertraukima ji buvo i steka padeta paskutine)
  132. pop di ;pasiimam CS reiksme
  133. push di ;padedam CS reiksme
  134. push si ;vel padedam atgal - nagrinejama komanda esancia CS:IP (naudosime DI:SI)
  135.  
  136. ;Susidedam masininio kodo baitus i atminti
  137. mov ax, cs:[si]
  138. mov bx, cs:[si+2]
  139. mov cx, cs:[si+4]
  140.  
  141. mov baitas1, al
  142. mov baitas2, ah
  143. mov baitas3, bl
  144. mov baitas4, bh
  145. mov baitas5, cl
  146. mov baitas6, ch
  147.  
  148. ;Siame formate niekada nebuna segmento keitimo prefiksu, ju neapdorosime
  149. ;Jei pirmas baitas yra BB reiskia apdorojam ta komandos atveji, jei ne iseinam
  150. cmp al, 0BBh
  151. jne grizti_is_pertraukimo
  152.  
  153. mov ah, 9 ;Spausdinam pranesima apie zingsnini pertraukima
  154. mov dx, offset zingsn_pranesimas
  155. int 21h
  156.  
  157. ;Spausdinam "CS:IP"
  158. mov ax, di ;spausdinam CS
  159. call printAX
  160.  
  161. mov ah, 2
  162. mov dl, ":"
  163. int 21h ;spausdinam dvitaski
  164.  
  165. mov ax, si ;spausdinam IP
  166. call printAX
  167.  
  168. call printSpace
  169.  
  170. ;Spausdinam masininio kodo baitus (musu atveju butinai trys)
  171. mov ah, baitas1
  172. mov al, baitas2
  173. call printAX
  174. mov al, baitas3
  175. call printAL
  176.  
  177. call printSpace
  178. call printSpace
  179.  
  180. ;Spausdinam komandos mnemonika (asemblerini uzrasa)
  181. mov ah, 9
  182. mov dx, offset mov_bx_kabl ;MOV bx,
  183. int 21h
  184.  
  185. mov ah, 2 ;nulio simbolis, nes kai priekyj raide butina prirasyt nuli (konstantu uzrasymo taisykles)
  186. ;T.y. MOV bx, FFFFh nekompiliuos, o MOV bx, 0FFFFh kompiliuos
  187. mov dl, "0"
  188. int 21h
  189.  
  190.  
  191. ;spausdinam betarpiska operanda (operanda konstanta)
  192. mov ah, baitas3
  193. mov al, baitas2
  194. call printAX
  195.  
  196. mov ah, 2 ;h raide prie sesioliktainio skaiciaus (butina rasant asemblerines komandas)
  197. mov dl, "h"
  198. int 21h
  199.  
  200. call printSpace
  201. call printSpace
  202.  
  203. mov ah, 2 ;Spausdinam kabliataski
  204. mov dl, ";"
  205. int 21h
  206. call printSpace
  207.  
  208. mov ah, 9
  209. mov dx, offset bx_lygu
  210. int 21h
  211.  
  212. ;Spausdiname bx reiksme esancia PRIES EINAMOSIOS KOMANDOS VYKDYMA
  213. mov ax, regBX
  214. call printAX
  215.  
  216. ;Spausdinam enteri
  217. mov ah, 9
  218. mov dx, offset enteris
  219. int 21h
  220.  
  221. grizti_is_pertraukimo:
  222. mov ax, regAX
  223. mov bx, regBX
  224. mov cx, regCX
  225. mov dx, regDX
  226. mov sp, regSP
  227. mov bp, regBP
  228. mov si, regSI
  229. mov di, regDI
  230. IRET ;grizimas is pertraukimo apdorojimo proceduros
  231.  
  232. ;===================PAGALBINES pertraukime naudojamos proceduros================
  233.  
  234. ;>>>Spausdinti AX reiksme
  235. printAX:
  236. push ax
  237. mov al, ah
  238. call printAL
  239. pop ax
  240. call printAL
  241. RET
  242.  
  243. ;>>>>Spausdink tarpa
  244. printSpace:
  245. push ax
  246. push dx
  247. mov ah, 2
  248. mov dl, " "
  249. int 21h
  250. pop dx
  251. pop ax
  252. RET
  253.  
  254. ;>>>Spausdinti AL reiksme
  255. printAL:
  256. push ax
  257. push cx
  258. push ax
  259. mov cl, 4
  260. shr al, cl
  261. call printHexSkaitmuo
  262. pop ax
  263. call printHexSkaitmuo
  264. pop cx
  265. pop ax
  266. RET
  267.  
  268. ;>>>Spausdina hex skaitmeni pagal AL jaunesniji pusbaiti (4 jaunesnieji bitai - > AL=72, tai 0010)
  269. printHexSkaitmuo:
  270. push ax
  271. push dx
  272.  
  273. and al, 0Fh ;nunulinam vyresniji pusbaiti AND al, 00001111b
  274. cmp al, 9
  275. jbe PrintHexSkaitmuo_0_9
  276. jmp PrintHexSkaitmuo_A_F
  277.  
  278. PrintHexSkaitmuo_A_F:
  279. sub al, 10 ;10-15 ===> 0-5
  280. add al, 41h
  281. mov dl, al
  282. mov ah, 2; spausdiname simboli (A-F) is DL'o
  283. int 21h
  284. jmp PrintHexSkaitmuo_grizti
  285.  
  286.  
  287. PrintHexSkaitmuo_0_9: ;0-9
  288. mov dl, al
  289. add dl, 30h
  290. mov ah, 2 ;spausdiname simboli (0-9) is DL'o
  291. int 21h
  292. jmp printHexSkaitmuo_grizti
  293.  
  294. printHexSkaitmuo_grizti:
  295. pop dx
  296. pop ax
  297. RET
  298.  
  299. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement