bartek27210

Untitled

Jan 9th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ifndef  ??version
  2. ?debug  macro
  3.     endm
  4. publicdll macro name
  5.     public  name
  6.     endm
  7.     endif
  8.     ?debug  V 300h
  9.     ?debug  S "LAB5.C"
  10.     ?debug  C E92D13993B064C4142352E43
  11.     ?debug  C E94019CA1814433A5C4243335C494E434C5544455C444F532E48
  12.     ?debug  C E94019CA1816433A5C4243335C494E434C5544455C5F444546532E+
  13.     ?debug  C 48
  14. LAB5_TEXT   segment byte public 'CODE'
  15. LAB5_TEXT   ends
  16. DGROUP  group   _DATA,_BSS
  17.     assume  cs:LAB5_TEXT,ds:DGROUP
  18. _DATA   segment word public 'DATA'
  19. d@  label   byte
  20. d@w label   word
  21. _DATA   ends
  22. _BSS    segment word public 'BSS'
  23. b@  label   byte
  24. b@w label   word
  25. _BSS    ends
  26. LAB5_TEXT   segment byte public 'CODE'
  27.     ?debug  C E801064C4142352E432D13993B
  28.    ;   
  29.    ;    void napiszZnak(unsigned char strona, unsigned char znak,
  30.    ;
  31. ^ Funkcja służąca do wyświetlania znaków na ekranie.   Do wypisywania znaków na ekranie można też wykorzystać funkcję BIOSu (nr.9) w ramach przerwania 10H.
  32.     ?debug  L 10
  33.     assume  cs:LAB5_TEXT
  34. _napiszZnak proc    far
  35.     ?debug  B
  36.     push    bp
  37.     mov bp,sp
  38.     ?debug  C E603696C650A0A0C00000761747279627574080A+
  39.     ?debug  C 0A0000047A6E616B080A080000067374726F6E61+
  40.     ?debug  C 080A060000
  41.     ?debug  B
  42.    ;   
  43.    ;         unsigned char atrybut, unsigned int ile)
  44.    ;    {
  45.    ;            regs.h.ah = 9;
  46.    ;
  47. ^ 'regs' jest unią zawierającą rejestry. Pole regs.h z kolei zawiera same rejestry 8-bitowe (regs.x rejestry 16-bitowe). Powyżej przypisujemy '9' do AH.    
  48.     ?debug  L 13
  49.     mov byte ptr DGROUP:_regs+1,9
  50.    ;   
  51.    ;            regs.h.al = znak;
  52.    ;
  53. ^ Do AL (młodsza część) wpisujemy wartość 'znak', na początku 'regs'.   
  54.     ?debug  L 14
  55.     mov al,byte ptr [bp+8]
  56.     mov byte ptr DGROUP:_regs,al
  57.    ;   
  58.    ;            regs.h.bh = strona;
  59.    ;   
  60. ^ Do pola BH wpisujemy wartość 'strona' (w unii regs).
  61.     ?debug  L 15
  62.     mov al,byte ptr [bp+6]
  63.     mov byte ptr DGROUP:_regs+3,al
  64.    ;   
  65.    ;            regs.h.bl = atrybut;
  66.    ;
  67. ^ Do pola BL wpisujemy wartość 'atrybut' (w unii regs).
  68.     ?debug  L 16
  69.     mov al,byte ptr [bp+10]
  70.     mov byte ptr DGROUP:_regs+2,al
  71.    ;   
  72.    ;            regs.x.cx = ile;
  73.    ;
  74. ^ Do pola CX wpisujemy wartość 'ile' (w unii regs), określającą ile razy znak ma być powtórzony.
  75.     ?debug  L 17
  76.     mov ax,word ptr [bp+12]
  77.     mov word ptr DGROUP:_regs+4,ax
  78.    ;   
  79.    ;            int86(0x10, &regs, &regs);
  80.    ;
  81. ^ Funkcja DOS wywołująca przerwanie 0x10. Do AX idzie offset unii regs, po czym zapisujemy na stosie z pozostałymi rejestrami i parametrami. Wywołana zostaje daleka funkcja _int86. Wracając z niej zwiększamy wskaźnik stosu o 10, ustawiając go na pole przed zapisywaniem stosu.   
  82.     ?debug  L 18
  83.     push    ds
  84.     mov ax,offset DGROUP:_regs
  85.     push    ax
  86.     push    ds
  87.     push    ax
  88.     mov ax,16
  89.     push    ax
  90.     call    far ptr _int86
  91.     add sp,10
  92.    ;   
  93.    ;    }
  94.    ;   
  95. ^ Powrót z funkcji wyświetlającej znak na ekranie
  96.     ?debug  L 19
  97.     pop bp
  98.     ret
  99.     ?debug  C E6067374726F6E61080A060000047A6E616B080A+
  100.     ?debug  C 0800000761747279627574080A0A000003696C65+
  101.     ?debug  C 0A0A0C0000
  102.     ?debug  E
  103.     ?debug  E
  104. _napiszZnak endp
  105.    ;   
  106.    ;    void interrupt new_1c(void)
  107.    ;
  108. ^ Funkcja obsługi przerwania. Na stosie kładzione są wszystkie rejestry w celu ich zabezpieczenia.  
  109.     ?debug  L 21
  110.     assume  cs:LAB5_TEXT
  111. _new_1c proc    far
  112.     ?debug  B
  113.     push    ax
  114.     push    bx
  115.     push    cx
  116.     push    dx
  117.     push    es
  118.     push    ds
  119.     push    si
  120.     push    di
  121.     push    bp
  122.     mov bp,DGROUP
  123.     mov ds,bp
  124.     ?debug  B
  125.    ;   
  126.    ;    {
  127.    ;            i++;
  128.    ;   
  129. ^ Inkrementacja zmiennej 'i'.
  130.     ?debug  L 23
  131.     inc word ptr DGROUP:_i
  132.    ;   
  133.    ;            znak=(i%10)+'0';
  134.    ;
  135. ^ Ustawienie wartości 'znak'. Do AX przypisujemy 'i', do BX wpisujemy 10. Konwertujemy AX do pary rejestrów DX:AX (convert word to double), następnie dzielimy AX przez BX, dodajemy do DL (młodsza część DX) wartość 48 (ASCII – '0'), i do znaku przypisujemy zawartość DL.
  136.     ?debug  L 24
  137.     mov ax,word ptr DGROUP:_i
  138.     mov bx,10
  139.     cwd
  140.     idiv    bx
  141.     add dl,48
  142.     mov byte ptr DGROUP:_znak,dl
  143.    ;   
  144.    ;            ptr=MK_FP(0xB800,0);
  145.    ;
  146. ^ Ustawienie wskaźnika na początek pamięci obrazu. Pamięć ekranu w trybie
  147. tekstowym rozpoczyna się pod adresem B800:0000.     Wpisanie do starszej części ptr wartości -18432 (czyli wartości 0xB800), a do młodszej części wartości 0. Następnie do AX wpisujemy wartość 0x1F00. Kładziemy AX na stosie. Następnie zmienna znak zostaje przeniesiona do AL, który zostaje rozszerzony do AX (convert byte to word). Zdjęcie DX ze stosu, suma logiczna DX z AX, oraz przypisanie DX do CX, oraz skok bezwarunkowy do etykiety.
  148.     ?debug  L 25
  149.     mov word ptr DGROUP:_ptr+2,-18432
  150.     mov word ptr DGROUP:_ptr,0
  151.     mov ax,7936
  152.     push    ax
  153.     mov al,byte ptr DGROUP:_znak
  154.     cbw
  155.     pop dx
  156.     or  dx,ax
  157.     mov cx,dx
  158.     jmp short @2@114
  159. @2@86:
  160.    ;   
  161.    ;            while(x++<5)
  162.    ;            {
  163.    ;                    ptr[x]=0x1F00|znak;
  164.    ;
  165. ^ Funkcja odpowiadająca za wypisanie znaku bezpośrednio do pamięci ekranu. Do rejestru AX przypisane zostaje 'x', a następnie rejestr AX zostaje przesunięty w lewo o 1. Następnie BX zostaje rozszerzony do pary rejestrów ES:BX, oraz przypisany zostaje do niego ptr. Następuje dodanie AX do BX, oraz wpisanie do ES:BX wartości CX. Następnie zostaje sprawdzone wyrażenie x++<5. Jeżeli jest mniejsze od 5, następuje skok do etykiety.  
  166.     ?debug  L 28
  167.     mov ax,word ptr DGROUP:_x
  168.     shl ax,1
  169.     les bx,dword ptr DGROUP:_ptr
  170.     add bx,ax
  171.     mov word ptr es:[bx],cx
  172. @2@114:
  173.     ?debug  L 26
  174.     mov ax,word ptr DGROUP:_x
  175.     inc word ptr DGROUP:_x
  176.     cmp ax,5
  177.     jl  short @2@86
  178.    ;   
  179.    ;            }
  180.    ;            //napiszZnak(0,znak,0,5);
  181.    ;            old_1c();
  182.    ;
  183. ^ pushf odkłada na stos zawartość rejestrów znaczników. Wykonuje się wywołanie funkcji obsługi przerwania old_1c.
  184.     ?debug  L 31
  185.     pushf  
  186.     call    dword ptr DGROUP:_old_1c
  187.    ;   
  188.    ;    }
  189.    ;
  190. ^ Następuje zdjęcie wszystkich rejestrów ze stosu (w kolejności odwrotnej niż były kładzione).  
  191.     ?debug  L 32
  192.     pop bp
  193.     pop di
  194.     pop si
  195.     pop ds
  196.     pop es
  197.     pop dx
  198.     pop cx
  199.     pop bx
  200.     pop ax
  201.     iret   
  202.     ?debug  E
  203.     ?debug  E
  204. _new_1c endp
  205.    ;   
  206.    ;    void main(void)
  207.    ;
  208. ^ Funkcja main().  
  209.     ?debug  L 34
  210.     assume  cs:LAB5_TEXT
  211. _main   proc    far
  212.     ?debug  B
  213.     ?debug  B
  214.    ;   
  215.    ;    {
  216.    ;            old_1c = getvect(0x1c);
  217.    ;   
  218. ^ Linijka odpowiadająca za pobranie wektora przerwań za pomocą funkcji DOS. Do AX zostaje przypisana wartość 28, oraz rejestr wędruje na stos. Wywołana zostaje funkcja getvect. Po powrocie z niej wskaźnik stosu zostaje zwiększony o 2 (przed AX). Funkcja getvect zwraca wartość do AX. Wartość ta zostaje przypisana do młodszej części zmiennej old_1c.
  219.     ?debug  L 36
  220.     mov ax,28
  221.     push    ax
  222.     call    far ptr _getvect
  223.     add sp,2
  224.     mov word ptr DGROUP:_old_1c+2,dx
  225.     mov word ptr DGROUP:_old_1c,ax
  226.    ;   
  227.    ;            setvect(0x1c,new_1c);
  228.    ;
  229. ^ Funkcja setvect ustawiająca wektor przerwań. Kopiujemy segment new_1c (nazwa naszej funkcji obsługi przerwań) do AX, i kładziemy AX na stos. Podajemy wartość przesunięcia względem początku segmentu new_1c do AX i kładziemy AX na stos. Przypisujemy do AX wartość 28, i AX ponownie wędruje na stos. Następnie zostaje wywołana funkcja DOS setvect, ustawiająca wektor przerwań. Wracając z niej zwiększmy wskaźnik stosu o 6, przesuwając go przed położone wcześniej na stosie zawartości AX.
  230.     ?debug  L 37
  231.     mov ax,seg _new_1c
  232.     push    ax
  233.     mov ax,offset _new_1c
  234.     push    ax
  235.     mov ax,28
  236.     push    ax
  237.     call    far ptr _setvect
  238.     add sp,6
  239.    ;   
  240.    ;            keep(0,8192/16);
  241.    ;
  242. ^ Kończymy program, zostawiając go 'rezydentem'. Przypisujemy do AX wartość 512, i kładziemy na stos. Przypisujemy do AL '0' i AX ponownie na stos. Następnie wykonuje się wywołanie funkcji DOS-owej 'keep'. Wracając z funkcji wskaźnik stosu zostaje zwiększony o 4.  
  243.     ?debug  L 38
  244.     mov ax,512
  245.     push    ax
  246.     mov al,0
  247.     push    ax
  248.     call    far ptr _keep
  249.     add sp,4
  250.    ;   
  251.    ;    }
  252.    ;   
  253.     ?debug  L 39
  254.     ret
  255.     ?debug  E
  256.     ?debug  E
  257. _main   endp
  258. LAB5_TEXT   ends
  259. _BSS    segment word public 'BSS'
  260. _regs   label   word
  261.     db  16 dup (?)
  262. _znak   label   byte
  263.     db  1 dup (?)
  264. _ptr    label   dword
  265.     db  4 dup (?)
  266. _x  label   word
  267.     db  2 dup (?)
  268. _i  label   word
  269.     db  2 dup (?)
  270. _old_1c label   dword
  271.     db  4 dup (?)
  272.     ?debug  C E9
  273.     ?debug  C FA09000000
  274. _BSS    ends
  275. _DATA   segment word public 'DATA'
  276. s@  label   byte
  277. _DATA   ends
  278. LAB5_TEXT   segment byte public 'CODE'
  279. LAB5_TEXT   ends
  280.     public  _main
  281.     public  _new_1c
  282.     public  _napiszZnak
  283.     public  _regs
  284.     public  _znak
  285.     public  _ptr
  286.     public  _x
  287.     public  _i
  288.     public  _old_1c
  289.     extrn   _setvect:far
  290.     extrn   _getvect:far
  291.     extrn   _keep:far
  292.     extrn   _int86:far
  293. _s@ equ s@
  294.     ?debug  C EA010C
  295.     ?debug  C E31800000023010400
  296.     ?debug  C EC055F6D61696E181800
  297.     ?debug  C E31900000023010700
  298.     ?debug  C EC075F6E65775F3163199800
  299.     ?debug  C E31A00000023010400
  300.     ?debug  C EC0B5F6E617069737A5A6E616B1A1800
  301.     ?debug  C E31B045245475310001F01
  302.     ?debug  C E31C08574F52445245475310001E04
  303.     ?debug  C E31D08425954455245475308001E0D
  304.     ?debug  C EC055F726567731B0000
  305.     ?debug  C EC055F7A6E616B020000
  306.     ?debug  C E31E000400160400
  307.     ?debug  C EC045F7074721E0000
  308.     ?debug  C EC025F78040000
  309.     ?debug  C EC025F69040000
  310.     ?debug  C E32000000023010700
  311.     ?debug  C E31F000400162000
  312.     ?debug  C EC075F6F6C645F31631F0000
  313.     ?debug  C E32100000023010400
  314.     ?debug  C EB085F736574766563742100
  315.     ?debug  C E32400000023010700
  316.     ?debug  C E323000400162400
  317.     ?debug  C E32200000023230400
  318.     ?debug  C EB085F676574766563742200
  319.     ?debug  C E32500000023010400
  320.     ?debug  C EB055F6B6565702500
  321.     ?debug  C E32600000023040400
  322.     ?debug  C EB065F696E7438362600
  323.     ?debug  C E604524547531B07000842595445524547531D07+
  324.     ?debug  C 0008574F5244524547531C0700
  325.     ?debug  C E20001781C0001681DC010000000
  326.     ?debug  C E2000261780A000262780A000263780A00026478+
  327.     ?debug  C 0A000273690A000264690A000563666C61670A00+
  328.     ?debug  C 05666C6167730AC010000000
  329.     ?debug  C E20002616C0800026168080002626C0800026268+
  330.     ?debug  C 080002636C0800026368080002646C0800026468+
  331.     ?debug  C 08C008000000
  332.     end
Add Comment
Please, Sign In to add comment