Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;-----Mazas disasemblerio prototipas
  2.  
  3. ;Programa disasemblina tris asembleriniu komandu atvejus:
  4. ;   0100 0reg - INC registras (zodinis)
  5. ;   0101 1reg - POP registras (zodinis)
  6. ;   1100 1101 bojb - INT bojb (vieno baito betarpiskas operandas)
  7.  
  8. ;   Programoje mazdaug padarytas 2 formatu atpazinimas:
  9. ;   Nr. 0 - neatpazinta komanda
  10. ;   Nr. 1 - xxxx xreg - KOM registras (zodinis)
  11. ;   Nr. 2 - xxxx xxxx bojb - Vieno baito OPK, vieno baito konstanta (betarp.op.)
  12.  
  13.  
  14. ;   Masininis kodas - imama 15 baitu is duomenu segmento ir bando atpazinti.
  15. ;   Darbo rezultatus spausdina ekrane
  16. ;   Programa padaryta taip, kad prasant 16-to baito reiksmes, ji tiesiog uzbaigia darba
  17.  
  18. ;   Programa ne visiskai parodo kaip veiktu pilnai parasytas disasembleris
  19. ;   Kodas skirtas bendrai esmei apie disasm'a suvokti
  20. ;   T.y. darant realu lengviau rasyti is naujo, nei naudotis kazkuo is cia :)
  21. ;   Jis daugiau skirtas veiksmu eiliskumui parodyti
  22.  
  23. ;   Iskart ispeju, kad siais atvejais prefiksu nebuna, tai neaprasiau ju apdorojimo
  24. ;   Skirtingai nuo realaus disasmo nerenku informacijos is failo
  25. ;   Ir neisvedu rezultatu i faila
  26.    
  27. ;   Cia tik demonstracine mokomuoju tikslu rasyta programa :)
  28.  
  29. .model small
  30. .stack 100h
  31. .data
  32. ;-----------------
  33.     enteris db 13,10,'$'
  34.  
  35.  
  36. ;---------------MASININIS KODAS (penkiolika baitu)
  37.       Mas_kodas db 0ABh,41h, 42h, 43h, 59h
  38.                 db  0h,0ECh, 0CDh,21h, 12h
  39.                 db 26h,74h, 5Ch, 5Fh, 13h
  40.                
  41. ;----------------DARBINIAI KINTAMIEJI
  42.       reg_dalis db ?   ;pasidedam reg dali
  43.       bojb_baitas db ? ;pasidedam bojb baita
  44.       pirmas_baitas db ? ;pasidedam pirma komandos baita
  45.      
  46.       dabar_frm db ? ;dabartines komandos formato numeris
  47.      
  48. ;---------------SPAUSDINAMU KOMANDU VARDAI
  49.     k_INC db 'INC $'
  50.     k_POP db 'POP $'
  51.     k_INT db 'INT $'
  52.  
  53. ;---------------SPAUSDINAMU REGISTRU VARDAI
  54.     r_AX db 'ax$'
  55.     r_CX db 'cx$'
  56.     r_DX db 'dx$'
  57.     r_BX db 'bx$'
  58.     r_SP db 'sp$'
  59.     r_BP db 'bp$'
  60.     r_SI db 'si$'
  61.     r_DI db 'di$'
  62.  
  63. ;-------------Kiti pranesimai:
  64.     neatp_pradzia db 'db $'
  65.     neatp_pabaiga db ' ;Neatpazinau komandos$'
  66.  
  67. .code
  68.    mov ax, @data
  69.    mov ds, ax
  70.    
  71.    mov si, offset Mas_kodas ;pasizymim kur mas_kodas prasideda
  72.    mov di, offset Mas_kodas+15 ;pasizymim kur mas_kodas baigiasi
  73.  
  74. ;sukam pagrindini cikla, kiekvienam ciklo prasukime bandom atpazint kazkokia komanda  
  75. pagr_ciklas:
  76.     call get_byte ;bandom gauti pirma baita (cia gali pasitaikyt koks prefiksas, siuo atveju to visai neapdoroju)
  77.     mov byte ptr[pirmas_baitas], al
  78.    
  79.     call surink_informacija ;procedura, kuri surenka informacija apie komanda is jos masininio kodo (nuskaito pozymius)
  80.     call print_kodoeilute   ;spausdina asemblerinio kodo eilute i ekrana
  81.         mov ah, 9 ;spausdinam enteri, einam i kita eilute
  82.         mov dx, offset enteris
  83.         int 21h
  84.     jmp pagr_ciklas
  85.  
  86.     ;Gauna sekancio baito reiksme i AL registra
  87.     ;Jei prasoma 16-to baito, nukillina programa
  88. get_byte:
  89.     mov al,[si]
  90.     inc si
  91.     cmp si, di  ;si>di? juk DI laikem, kur baigesi, vadinas skaitom eileje 16-taji baita
  92.    
  93.     ja gb_uzdarymo_tarpinis ;issisuku is padeties del tolimo salyginio jmp
  94.     jmp get_byte_baigti
  95.    
  96.     gb_uzdarymo_tarpinis:
  97.     jmp uzdarymas
  98.    
  99.     get_byte_baigti:
  100.     RET
  101.  
  102.  
  103. ;Procedura surenkanti komandos detales (tarkim d,w,reg,mod,r/m ir kt reiksmes)  
  104. surink_informacija:
  105.     call gauk_formato_nr ;pagal pirma baita, koks formato_nr?
  106.    
  107.     cmp byte ptr[dabar_frm], 1 ;jei formato numeris 1
  108.     je domisi_pirmu
  109.     cmp byte ptr[dabar_frm], 2 ;jei formato numeris 2
  110.     je domisi_antru
  111.     jmp domisi_nuliniu ;kai netiko ne vienas atvejis
  112.    
  113. RET    
  114.        
  115. ;Procedura, pagal pirmo baito reiksme padeta duomenu segmente pirmas_baitas vietoje
  116. ;nustato kurio numerio cia formatas
  117. ;rezultata iraso duomenu_segmente i baita (dabar_frm)
  118. gauk_formato_nr:
  119.        
  120.     cmp byte ptr[pirmas_baitas], 40h
  121.     jb gal_antras
  122.     cmp byte ptr[pirmas_baitas], 5Fh
  123.     ja gal_antras
  124.    
  125.     ;patekom i intervala 40h-5Fh
  126.     ;reiskia pirmas formatas
  127.     mov byte ptr[dabar_frm], 1
  128.     RET ;griztam jau dabar, toliau sios proceduros nevykdom
  129.    
  130.     gal_antras:
  131.     cmp byte ptr[pirmas_baitas], 0CDh ;ar antras formatas, jo pirmas baitas CD
  132.     je taip_antras
  133.     jmp neatpazintas
  134.    
  135.     taip_antras:
  136.     mov byte ptr[dabar_frm], 2
  137.     RET ;griztam jau dabar toliau nevykdom
  138.    
  139.     neatpazintas:
  140.     mov byte ptr[dabar_frm], 0 ;vis tik nei pirmas, nei antras    
  141. RET
  142.  
  143. ;Surenka detales apie pirma formata (xxxx xreg) - reikalinga REG dalis ir pirmas baitas
  144. ;Pirma baita jau turim is pagr_ciklo
  145. ;I reg_dalis baita duom.segmente pasiimame reg'o reiksme
  146. ;(pasinaudodami pirmo baito reiksme)
  147. domisi_pirmu:
  148.     push ax
  149.         mov al, byte ptr[pirmas_baitas]
  150.         and al, 111b
  151.         mov byte ptr[reg_dalis], al
  152.     pop ax
  153. RET
  154.  
  155. ;Surenka detales apie antra formata (CD numeris - kur numeris vieno baito betarp.op)
  156. domisi_antru:
  157.    push ax
  158.         call get_byte ;gaunam i AL antro baito reiksme
  159.         mov byte ptr[bojb_baitas], al ;pasidedam i pacio disasmo duom segmenta bet.op. baito reiksme
  160.    pop ax
  161. RET
  162.  
  163. ;Surenka detales apie nulini formata (neatpazinta komanda)
  164. domisi_nuliniu:
  165.     ;nera ka gaut, pirma baita turim, kvieciu tik siaip sau del bendros tvarkos
  166. RET  
  167.  
  168.  
  169. ;Procedura, kuri rupinasi asemblerines komandos spausdinimu, kai jau zino formata
  170. ;Realiai ji tik paziuri kuris formatas ir pagal ta spausdina
  171. print_kodoeilute:
  172.     ;pasiziurim, koks dabartines komandos formato numeris buvo nustatytas
  173.     ;pagal tai kvieciam atitinkama procedura
  174.     cmp byte ptr[dabar_frm], 1
  175.     je pr_kod_kviesk1
  176.     cmp byte ptr[dabar_frm], 2
  177.     je pr_kod_kviesk2
  178.     jmp pr_kod_kviesk0
  179.    
  180.     pr_kod_kviesk1:
  181.         call print_formatui1
  182.         RET
  183.     pr_kod_kviesk2:
  184.         call print_formatui2
  185.         RET
  186.     pr_kod_kviesk0:
  187.         call print_formatui0
  188.         RET
  189.        
  190. ;Spausdina komandos varda pagal pirma baita (bendru atveju pirma baita ir galbut antra, arba antro reg dali)
  191. spausdink_varda:
  192.     push ax ;procedura panaudoje nenorim sugadint registru reiksmiu, issisaugom
  193.     push bx
  194.     push cx
  195.     push dx
  196.    
  197.     ;spejam, kad cia INC (pirmas baitas is intervalo 40-47h)
  198.     cmp byte ptr[pirmas_baitas], 40h
  199.     jb gal_komanda_pop
  200.     cmp byte ptr[pirmas_baitas], 47h
  201.     ja gal_komanda_pop
  202.         ;vis tik cia INC
  203.         mov bx, offset k_INC
  204.         jmp vardo_spausdinimas
  205.    
  206.     ;spejam, kad cia POP (pirmas baitas is intervalo 58-5Fh)
  207.     gal_komanda_pop:
  208.     cmp byte ptr[pirmas_baitas], 58h
  209.     jb gal_komanda_int
  210.     cmp byte ptr[pirmas_baitas], 5Fh
  211.     ja gal_komanda_int
  212.         ;vis tik cia POP
  213.         mov bx, offset k_POP
  214.         jmp vardo_spausdinimas
  215.                            
  216.     gal_komanda_int:
  217.     cmp byte ptr[pirmas_baitas], 0CDh
  218.     jne returnfrom_vardo_spausd ;griztam is vardo spausdinimo, nes nepazistam komandos
  219.         mov bx, offset k_INT
  220.    
  221.     vardo_spausdinimas:
  222.     mov ah,9
  223.     mov dx, bx
  224.     int 21h
  225.     returnfrom_vardo_spausd:
  226.     pop dx
  227.     pop cx
  228.     pop bx
  229.     pop ax
  230. RET
  231.  
  232. print_formatui1:
  233.     push ax
  234.     call spausdink_varda
  235.     mov al, byte ptr[reg_dalis]
  236.     call print_reg_w1
  237.     pop ax
  238. RET
  239.  
  240. print_formatui2:
  241.     push ax
  242.     call spausdink_varda
  243.     mov al, byte ptr[bojb_baitas]
  244.     call print_baita_hexu
  245.     pop ax
  246. RET
  247.  
  248. print_formatui0:
  249.     push ax
  250.     push bx
  251.     push cx
  252.     push dx
  253.         mov ah, 9
  254.         mov dx, offset neatp_pradzia
  255.         int 21h
  256.             mov al, byte ptr[pirmas_baitas] ;Argumentas sekanciai procedurai (parametras)
  257.             call print_baita_hexu
  258.         mov ah, 9
  259.         mov dx, offset neatp_pabaiga
  260.         int 21h
  261.     pop dx
  262.     pop cx
  263.     pop bx
  264.     pop ax
  265. RET    
  266.  
  267. ;spausdina konstantos baita sesioliktaine sistema, su h raide po jo
  268. ;ir nuliu priekyj (nes skaicius negali prasidet raide, paprastumo delei nuli priekyj)
  269. ;prirasau visais atvejais, ir kai raide ir kai skaicius
  270. ;ENTRY: AL (AL spausdina AL padeta 16taini skaiciu)
  271. ;Naudojantis loginiu funkciju savybem nedarau konversijos su dalyba :)
  272. print_baita_hexu:    
  273.    push ax
  274.    push bx
  275.    push cx
  276.    push dx
  277.         push ax
  278.             mov dl, '0' ;spausdina 0 priekyj
  279.             mov ah, 2
  280.             int 21h
  281.         pop ax
  282.        
  283.         push ax
  284.             and al, 11110000b
  285.                 mov cl, 4
  286.                 shr al, cl ;stumiam al bitus i desine per 4 vietas (prireike CL)
  287.                             ;nes SHR antras operandas tik is aibes {1,CL}
  288.                 call print_hex_skaitmuo
  289.         pop ax
  290.        
  291.         push ax
  292.             and al, 00001111b
  293.             call print_hex_skaitmuo
  294.         pop ax
  295.        
  296.         mov ah, 2
  297.         mov dl, 'h'
  298.         int 21h
  299.    pop dx
  300.    pop cx
  301.    pop bx
  302.    pop ax
  303. RET
  304.  
  305. ;Spausdina i ekrana nurodyta sesioliktaini skaitmeni
  306. ;(ta skaitmeni randa jaunesniam AL pusbaityj)
  307. print_hex_skaitmuo:
  308.     push ax
  309.     push dx
  310.         and al, 00001111b  ;isvalom vyresni pusbaiti jis musu nedomins
  311.         cmp al, 9
  312.         ja print_hex_raidyte
  313.         jmp print_hex_skaiciukas
  314.        
  315.         print_hex_raidyte:
  316.         push ax
  317.         sub al, 0Ah
  318.         add al, 'A'
  319.         mov ah, 2
  320.         mov dl, al
  321.         int 21h
  322.         pop ax
  323.         jmp grizti_is_pr_hex_sk
  324.        
  325.         print_hex_skaiciukas:
  326.         push ax
  327.         add al, 30h
  328.         mov ah, 2
  329.         mov dl, al
  330.         int 21h
  331.         pop ax
  332.         jmp grizti_is_pr_hex_sk
  333.        
  334.     grizti_is_pr_hex_sk:    
  335.     pop dx
  336.     pop ax
  337. RET
  338.  
  339. ;spausdina zodini registra i ekrana
  340. ;koks tas registras pasakom AL baite (addr. baito lentoj r/m=000-111, mod=11, w=1)
  341. print_reg_w1:
  342.     push ax
  343.     push bx
  344.     push cx
  345.     push dx
  346.    
  347.     test al, 100b
  348.     je pr_reg_w1_0xx
  349.     jmp pr_reg_w1_1xx
  350.    
  351.         pr_reg_w1_0xx:
  352.         test al, 10b
  353.         je pr_reg_w1_00x
  354.         jmp pr_reg_w1_01x
  355.        
  356.         pr_reg_w1_1xx:
  357.         test al, 10b
  358.         je pr_reg_w1_10x
  359.         jmp pr_reg_w1_11x
  360.        
  361.             pr_reg_w1_00x:
  362.             test al, 1b
  363.             je pr_reg_w1_000
  364.             jmp pr_reg_w1_001
  365.            
  366.             pr_reg_w1_01x:
  367.             test al, 1b
  368.             je pr_reg_w1_010
  369.             jmp pr_reg_w1_011
  370.            
  371.             pr_reg_w1_10x:
  372.             test al, 1b
  373.             je pr_reg_w1_100
  374.             jmp pr_reg_w1_101
  375.            
  376.             pr_reg_w1_11x:
  377.             test al, 1b
  378.             je pr_reg_w1_110
  379.             jmp pr_reg_w1_111
  380.            
  381.                 pr_reg_w1_000:
  382.                 mov bx, offset r_AX
  383.                 jmp reg_w1_spausd
  384.                
  385.                 pr_reg_w1_001:
  386.                 mov bx, offset r_CX
  387.                 jmp reg_w1_spausd
  388.                
  389.                 pr_reg_w1_010:
  390.                 mov bx, offset r_DX
  391.                 jmp reg_w1_spausd
  392.                
  393.                 pr_reg_w1_011:
  394.                 mov bx, offset r_BX
  395.                 jmp reg_w1_spausd
  396.                 ;----
  397.                 pr_reg_w1_100:
  398.                 mov bx, offset r_SP
  399.                 jmp reg_w1_spausd
  400.                
  401.                 pr_reg_w1_101:
  402.                 mov bx, offset r_BP
  403.                 jmp reg_w1_spausd
  404.                
  405.                 pr_reg_w1_110:
  406.                 mov bx, offset r_SI
  407.                 jmp reg_w1_spausd
  408.                
  409.                 pr_reg_w1_111:
  410.                 mov bx, offset r_DI
  411.                 jmp reg_w1_spausd
  412.                
  413.     reg_w1_spausd:
  414.     mov ah, 9
  415.     mov dx, bx
  416.     int 21h
  417.    
  418.     pop dx
  419.     pop cx
  420.     pop bx
  421.     pop ax
  422. RET  
  423.    
  424. uzdarymas:
  425.     mov ah, 9
  426.     mov dx, offset enteris
  427.     int 21h
  428.  
  429.     mov ah, 4Ch
  430.     int 21h
  431. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement