Miten noilla Int 21h:n muistinvarausfunktioilla saa varattua paljon (64000 tavua ja enemmänkin) muistia COM-tyyppisissä ohjelmissa? Ilmeisesti jotain pitäisi muuttaa 4Ah funktiolla.
Ai niin.. Kieli on Assembly ja DOS:lle ollaan ohjelmoimassa.
Ja Ongelma on se, että sotkeeko varaukset pinoa tms? Käsitykseni mukaan COM ohjelmissa segmenttiosoitteet ovat samat ja kaikki ohjelman koodi, data, pino yms. täytyy mahtua samaan muistisegmenttiin.
Kirjoitin tuossa yhden pätkän, mutta sotkeeko tuo sitten jotain?
Ohjelma piirtää puskuriin viivoja ja kopioi puskurin näytölle. Anteeksi vähäinen kommentointi.
.model tiny, stdcall .386 .code option casemap:none org 100h alku: mov ah, 4Ah ;muutetaan lohkon kokoa mov bx, 1000h int 21h jc bbbb mov ah, 48h ;varataan muisti mov bx, 0FA0h int 21h jc aaaa push ax push ds mov ds, ax mov es, ax mov ax, 0013h int 10h mov ax, 000Fh ;piirretään xor di, di mov cx, 7D00h cld rep stosw mov ax, 0A000h ;kopioidaan näytölle mov es, ax xor di, di mov si, di mov cx, 7D00h cld rep movsw pop ds mov ah, 49h ;vapautetaan muisti pop es int 21h mov ah, 08h int 21h mov ah, 09h mov dx, offset str3 int 21h mov ah, 4Ch int 21h aaaa: mov ah, 09h mov dx, offset str1 int 21h mov ah, 4Ch int 21h bbbb: mov ah, 09h mov dx, offset str2 int 21h mov ah, 4Ch int 21h str1 db "MUITIN VARAUS EPÄONNISTUI.","$" str2 db "MUISTILOHKON MUUTOS EPÄONNISTUI.","$" str3 db "ONNISTUI.","$" end alku
Siis toimiiko tuo / jättääkö toimimatta? Ei muistinvaraus mitenkään "pinoa sotke", voit ihan hyvillä mielin varailla muistia niin paljon kuin tarvitset (ja perusmuisti antaa myöten).
Kyllä tuo toimii, mutta mistä kohti muistia funktio varaa tuon 64000 tavua? Kun ohjelman 64 kt pitäisi sopia koodi, grafiikat sekä muu data ja tuon puskurin pitäisi tulla vasta niiden jälkeen. Eli:
Koodi + Data n. 64 kt.
Puskurimuisti n. 64 kt.
Niin ja tulikin vielä mieleeni toinenkin muistinvaraukseen liittyvä kysysmys: Miten assemblyssä varataan taulukolle tilaa?
Seuraavassahan on muuttuja "palikka", jolle annetaan arvoksi 128, mutta olen nähnyt että tuommoista käytetään taulukkona.
palikka db 128
Se 64000 tavua varataan ihan perusmuistista, siihen ei COM-tiedostojen yhden segmentin rajoitus mitään vaikuta.
Mitähän tarkoitat tuolla, että yhtä tavua käytetään taulukkona? :-) Olisikohan kyseessä ollut seuraavanlainen pätkä?
palikka db 128 dup(0)
Muisitn väärin..
Juuri noin. Eli miten tuo nyt sitten eroaa tuosta edellisestä?
palikka db 128
Määrittelee yhden tavun, ja sille arvon 128.
palikka db 128 dup(0)
Määrittelee 128 peräkkäistä 0-tavua.
Täytyy myöntää, että tuo nimeämistapa on ehkä hieman vaikeaselkoinen ja epälooginen.
Kiitos. Kyllä nyt asiat alkaa taas luistaa eteenpäin. :-)
Aihe on jo aika vanha, joten et voi enää vastata siihen.