Guest User

asm_project

a guest
Dec 10th, 2024
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .MODEL SMALL
  2.     Space EQU " " ;Szóköz karakter
  3. .STACK
  4. .DATA
  5.     prompt_disk DB 'Enter disk number (0=A, 1=B, 2=C, ...):', CR, LF, 0
  6.     prompt_segment DB 'Enter starting segment:', CR, LF, 0
  7.     border_char DB '*'
  8.     border_attr DB 4Eh ; piros hatter karakter
  9. .DATA?
  10.     block DB 512 DUP (?) ;1 blokknyi terület kijelölése
  11.     disk_number DB ?
  12.     start_segment DW ?
  13. .CODE
  14. main proc
  15.     MOV AX, @DATA ;DS beállítása
  16.     MOV DS, AX
  17.  
  18.     ; disk number
  19.     MOV DX, offset prompt_disk
  20.     LEA BX, prompt_disk
  21.     CALL write_string
  22.     CALL cr_lf
  23.     CALL read_decimal
  24.     MOV disk_number, DL
  25.  
  26.     ; kezdo segment
  27.     MOV DX, offset prompt_segment
  28.     LEA BX, prompt_segment
  29.     CALL write_string
  30.     CALL cr_lf
  31.     CALL read_decimal
  32.     MOV start_segment, AX
  33.  
  34.     LEA BX, block ;DS:BX memóriacímre tölti a blokkot
  35.     MOV AL, disk_number ;Lemezmeghajtó száma (A:0, B:1, C:2, stb.)
  36.     MOV CX, 1 ;Egyszerre beolvasott blokkok száma
  37.     MOV DX, start_segment ;Lemezolvasás kezdőblokkja
  38.     INT 25h ;Olvasás
  39.     POPF ;A veremben tárolt jelzőbitek törlése
  40.     XOR DX, DX ;Kiírandó adatok kezdőcíme DS:DX
  41.     CALL write_block ;Egy blokk kiírása
  42.  
  43.     ; also es felso border
  44.     MOV AX, 0B800h
  45.     MOV ES, AX
  46.     MOV CX, 80
  47.     MOV DI, 0
  48.     CALL draw_horizontal_border
  49.  
  50.     MOV DI, 160 * 24
  51.     CALL draw_horizontal_border
  52.  
  53.     ; bal és jobb border
  54.     MOV CX, 25
  55.     MOV DI, 0
  56.     CALL draw_vertical_border
  57.  
  58.     MOV DI, 158
  59.     CALL draw_vertical_border
  60.  
  61.     MOV AH, 4Ch ; Kilépés a programból
  62.     INT 21h
  63. main endp
  64.  
  65.  
  66. write_string proc ;BX-ben címzett karaktersorozat kiírása 0 kódig.
  67.     PUSH DX ;DX mentése a verembe
  68.     PUSH BX ;BX mentése a verembe
  69.     write_string_new:
  70.     MOV DL, [BX] ;DL-be egy karakter betöltése
  71.     OR DL, DL ;DL vizsgálata
  72.     JZ write_string_end ;0 esetén kilépés
  73.     CALL write_char ;Karakter kiírása
  74.     INC BX ;BX a következő karakterre mutat
  75.     JMP write_string_new ;A következő karakter betöltése
  76.     write_string_end:
  77.     POP BX ;BX visszaállítása
  78.     POP DX ;DX visszaállítása
  79.     RET ;Visszatérés
  80. write_string endp
  81.  
  82. write_block proc ;Egy blokk kiírása a képernyőre
  83.     PUSH CX ;CX mentése
  84.     PUSH DX ;DX mentése
  85.     MOV CX, 32 ;Kiírandó sorok száma CX-be
  86. write_block_new:
  87.     CALL out_line ;Egy sor kiírása
  88.     CALL cr_lf ;Soremelés
  89.     ADD DX, 16 ;Következő sor adatainak kezdőcíme;
  90.     LOOP write_block_new ;Új sor
  91.     POP DX ;DX visszaállítása
  92.     POP CX ;CX visszaállítása
  93.     RET
  94. write_block endp
  95.  
  96. out_line proc
  97.     PUSH BX ;BX mentése
  98.     PUSH CX ;CX mentése
  99.     PUSH DX ;DX mentése
  100.     MOV BX,DX ;Sor adatainak kezdőcíme BX-be
  101.     PUSH BX ;Mentés a karakteres kiíráshoz
  102.     MOV CX, 16 ;Egy sorban 16 hexadecimális karakter
  103.  
  104. hexa_out:
  105.     MOV DL, Block[BX] ;Egy bájt betöltése
  106.     CALL write_hexa ;Kiírás hexadecimális formában
  107.     MOV DL,Space ;Szóköz kiírása a hexa kódok között
  108.     CALL write_char
  109.     INC BX ;Következő adatbájt címe
  110.     LOOP hexa_out ;Következő bájt
  111.     MOV DL, Space ;Szóköz kiírása a kétféle mód között
  112.     CALL write_char
  113.     MOV CX, 16 ;Egy sorban 16 karakter
  114.     POP BX ;Adatok kezdőcímének beállítása
  115. ascii_out:
  116.     MOV DL, Block[BX] ;Egy bájt betöltése
  117.     CMP DL, Space ;Vezérlőkarakterek kiszűrése
  118.     JA visible ;Ugrás, ha látható karakter
  119.     MOV DL, Space ;Nem látható karakterek cseréje szóközre
  120. visible:
  121.     CALL write_char ;Karakter kiírása
  122.     INC BX ;Következő adatbájt címe
  123.     LOOP ascii_out ;Következő bájt
  124.     POP DX ;DX visszaállítása
  125.     POP CX ;CX visszaállítása
  126.     POP BX ;BX visszaállítása
  127.     RET ;Vissza a hívó programba
  128. out_line endp
  129.  
  130. write_hexa proc ;A DL-ben levo ket hexa szamjegy kiirasa
  131.     PUSH CX ;CX mentese a verembe
  132.     PUSH DX ;DX mentese a verembe
  133.     MOV DH, DL ;DL mentese
  134.     MOV CL, 4 ;Shift-eles szama CX-be
  135.     SHR DL, CL ;DL shift-elese 4 hellyel jobbra
  136.     CALL write_hexa_digit ;Hexadecimalis digit kiirasa
  137.     MOV DL, DH ;Az eredeti ertek visszatoltese DL-be
  138.     AND DL, 0Fh ;A felso negy bit torlese
  139.     CALL write_hexa_digit ;Hexadecimalis digit kiirasa
  140.     POP DX ;DX visszaallitasa
  141.     POP CX ;CX visszaallitasa
  142.     RET ;Visszateres a hivo rutinba
  143. write_hexa endp
  144. write_hexa_digit proc
  145.     PUSH DX ;DX mentese a verembe
  146.     CMP DL, 10 ;DL osszehasonlitasa 10-zel
  147.     JB non_hexa_letter ;Ugras, ha kisebb 10-nel
  148.     ADD DL, "A"-"0"-10 ;A – F betűt kell kiirni
  149.     non_hexa_letter:
  150.     ADD DL, "0" ;Az ASCII kod megadasa
  151.     CALL write_char ;A karakter kiirasa
  152.     POP DX ;DX visszaallitasa
  153.     RET ;Visszateres a hivo rutinba
  154. write_hexa_digit endp
  155.  
  156.  
  157. CR EQU 13
  158. LF EQU 10
  159. cr_lf proc
  160.     PUSH DX
  161.     MOV DL,CR
  162.     CALL write_char
  163.     MOV DL,LF
  164.     CALL write_char
  165.     POP DX
  166.     RET
  167. cr_lf endp
  168. read_char proc
  169.     PUSH AX
  170.     MOV AH,1
  171.     INT 21h
  172.     MOV DL,AL
  173.     POP AX
  174.     RET
  175. read_char endp
  176. write_char proc
  177.     PUSH AX
  178.     MOV AH,2
  179.     INT 21h
  180.     POP AX
  181.     RET
  182. write_char endp
  183. write_binary proc ;kiirando adat a DL-ben
  184.     PUSH BX ;BX mentese a verembe
  185.     PUSH CX ;CX mentese a verembe
  186.     PUSH DX ;DX mentese a verembe
  187.     MOV BL, DL ;DL masolasa BL-be
  188.     MOV CX, 8 ;Ciklusvaltozo (CX) beallitasa
  189. binary_digit:
  190.     XOR DL, DL ;DL torlese
  191.     RCL BL, 1 ;Rotalas balra eggyel, kilepo bit a CF-be
  192.     ADC DL, "0" ;DL = DL + 48 + CF
  193.     CALL write_char ;Binaris digit kiirasa
  194.     LOOP binary_digit ;Vissza a ciklus elejere
  195.     POP DX ;DX visszaallitasa
  196.     POP CX ;CX visszaallitasa
  197.     POP BX ;BX visszaallitasa
  198.     RET ;Visszateres a hivo rutinba
  199. write_binary endp
  200.  
  201. write_decimal proc
  202.     PUSH AX ;AX mentese a verembe
  203.     PUSH CX ;CX mentese a verembe
  204.     PUSH DX ;DX mentese a verembe
  205.     PUSH SI ;SI mentese a verembe
  206.     XOR DH, DH ;DH torlese
  207.     MOV AX, DX ;AX-be a szam
  208.     MOV SI, 10 ;SI-ba az oszto
  209.     XOR CX, CX ;CX-be kerul az osztasok szama
  210. decimal_non_zero:
  211.     XOR DX, DX ;DX torlese
  212.     DIV SI ;DX:AX 32 bites szam osztasa SI-vel, az eredmeny AXbe, a maradek DX-be kerul
  213.     PUSH DX ;DX mentese a verembe
  214.     INC CX ;Szamlalo novelese
  215.     OR AX, AX ;Statuszbitek beallitasa AX-nek megfeleloen
  216.     JNE decimal_non_zero ;Vissza, ha az eredmeny meg nem nulla
  217. decimal_loop:
  218.     POP DX ;Az elmentett maradek visszahivasa
  219.     CALL write_hexa_digit ;Egy decimalis digit kiirasa
  220.     LOOP decimal_loop
  221.     POP SI ;SI visszaallitasa
  222.     POP DX ;DX visszaallitasa
  223.     POP CX ;CX visszaallitasa
  224.     POP AX ;AX visszaallitasa
  225.     RET ;Visszateres a hivo rutinba
  226. write_decimal endp
  227.  
  228. read_decimal proc
  229.     PUSH AX ;AX mentese a verembe
  230.     PUSH BX ;BX mentese a verembe
  231.     MOV BL, 10 ;BX-be a szamrendszer alapszama, ezzel szorzunk
  232.     XOR AX, AX ;AX torlese
  233. read_decimal_new:
  234.     CALL read_char ;Egy karakter beolvasasa
  235.     CMP DL, CR ;ENTER ellenorzese
  236.     JE read_decimal_end ;Vege, ha ENTER volt az utolso karakter
  237.     SUB DL, "0" ;Karakterkod minusz "0" kodja
  238.     MUL BL ;AX szorzasa 10-zel
  239.     ADD AL, DL ;A kovetkezo helyi ertek hozzaadasa
  240.     JMP read_decimal_new ;A kovetkezo karakter beolvasasa
  241. read_decimal_end:
  242.     MOV DL, AL ;DL-be a beirt szam
  243.     POP BX ;AB visszaallitasa
  244.     POP AX ;AX visszaallitasa
  245.     RET ;Visszateres a hivo rutinba
  246. read_decimal endp
  247.  
  248.  
  249. ;for borders
  250. draw_horizontal_border proc
  251.     PUSH AX
  252.     PUSH CX
  253.     PUSH DI
  254.     MOV AL, border_char
  255.     MOV AH, border_attr
  256. draw_horizontal_loop:
  257.     MOV ES:[DI], AX
  258.     ADD DI, 2
  259.     LOOP draw_horizontal_loop
  260.     POP DI
  261.     POP CX
  262.     POP AX
  263.     RET
  264. draw_horizontal_border endp
  265.  
  266. draw_vertical_border proc
  267.     PUSH AX
  268.     PUSH CX
  269.     PUSH DI
  270.     MOV AL, border_char
  271.     MOV AH, border_attr
  272. draw_vertical_loop:
  273.     MOV ES:[DI], AX
  274.     ADD DI, 160
  275.     LOOP draw_vertical_loop
  276.     POP DI
  277.     POP CX
  278.     POP AX
  279.     RET
  280. draw_vertical_border endp
  281.  
  282. END main
  283.  
Advertisement
Add Comment
Please, Sign In to add comment