ASM - 64KB

0

Hmm mam malego problema, chcialbym napisac programik ktory jednak potrzebuje tablicy o rozmiarze dokladnie 64000 bajtow. Oczywiscie najprostsza deklaracja dziala, jednak najprawdopodobniej jezeli kod programu wraz z ta tablica przekroczy rozmiar segmentu to wszystko sie posypie.
Czy da sie zrobic COM'a ktory jednoczesnie bedzie malutki rozmiarowo (dynamiczna alokacja tablicy), i bedzie dzialal mimo tego ze kod programu wraz z ta tablica przekroszy 64kB ??
PS. Staram sie uzyc NASM'a tak wiec fajnie jakby to bylo pod jego skladnie :)

0

Obrazek 320x200x8 ? :)
Może to?

INT 21 - DOS 2+ - ALLOCATE MEMORY
AH = 48h
BX = number of paragraphs to allocate
Return: CF clear if successful
AX = segment of allocated block
CF set on error
AX = error code (07h,08h) (see #1020 at AH=59h/BX=0000h)
BX = size of largest available block
Notes: DOS 2.1-6.0 coalesces free blocks while scanning for a block to
allocate
.COM programs are initially allocated the largest available memory
block, and should free some memory with AH=49h before attempting any
allocations

0

hmm, po alokacji, aby sprawdzic czy wszystko poszlo ok moge uzyc JZ ?? Bo to niby kasuje flage CF wiec jak CF=0 wtedy JZ dupa , ale nie jestem pewny :-|

0

Dla flagi C używa się skoku JC(gdy CF=1) lub JNC(CF =0)

0

qrna daj ktos kod jak pobrac wskaznik do tej pamieci do zmiennej DW (lub innej) bo mnie zara trafi... juz z 2h siedze i pare razy mi kompa zacielo bo niby zaalokowalo a jednak dupa. Czy aby korzystac z tej pamieci to moge zrobic cos takiego:

buf DW 0 ;zmienna ktora ma byc numerem segmentu tej pamieci

mov ah,48h
mov bx,4000 ; 64000B / 16
int 21h
mov [buf],ax

czy to zadziala ?? to znaczy czy <ort>puzniej </ort>aby zapisac cos w tej pamieci bede mugl uzyc czegos takiego:

mov es,[buf]
mov [es:di],10

jak nie tak to jak to zrobic [glowa] [glowa] [glowa]

0

mov es,[buf]

Dlaczego przepisujesz wartość buf do ES ?

0

heh jeblo mi sie :)

hmm poradzilem sobie juz, wskaznik 4 bajtowy, zapisuje w nim adres normalnie jak do zmiennej a puzniej aby odczytac uzywam LES lub LDS itp...

0

Witam.
Odgrzebuję stary temat bo sam mam problem z alokacją [rotfl]

Kodzik:

	MOV AH,48H
	MOV BX,MEM_SIZE
	SHR BX,4
	INC BX
	INT 21H

Z tym że, otrzymuję błąd numer 8 (brak pamięci) :-|

(wydruk z MS DEBUG)

AX=4800 BX=0022 CX=0000 DX=0000 SP=007E BP=0000 SI=0000 DI=0000
DS=1CDE ES=1CDE SS=1D7C CS=1C9F IP=010C NV UP EI PL NZ NA PE NC
1C9F:010C CD21 INT 21
-P

AX=0008 BX=0000 CX=0000 DX=0000 SP=007E BP=0000 SI=0000 DI=0000
DS=1CDE ES=1CDE SS=1D7C CS=1C9F IP=010E NV UP EI PL NZ NA PE CY
1C9F:010E A37109 MOV [0971],AX DS:0971=0000

A może odpowiedź jest wyżej a ja jej ślepy nie widzę? [???]
pozdrawiam, gronki

0

Przed przydzielaiem pamięci musisz ją najpierw zwolnić =]

0

uzyj funkcji 4ah na poczatku progza

1 użytkowników online, w tym zalogowanych: 0, gości: 1