Assembler - wyświetlenie pamięci RAM

0

Witam. Jestem początkujący w posługiwaniu się assemblerem i napotkałem na następujący problem. Mam stworzony program, który przekształca kod binarny 16-bitowy, tzn odczytuje z niego kolejne bity i efektem całego programu jest wyświetlenie urządzeń w komputerze ( jest lub nie ma) Problem dotyczy wyświetlenia pamięci RAM. Wyswietla mi sie tylko, że jest a potrzebuję aby wyświetliło mi ilość pamięci RAM. Wysyłam program i proszę o pomoc.

Progr           segment
                assume  cs:Progr, ds:dane, ss:stosik

start:          mov     ax,dane
                mov     ds,ax
                mov     ax,stosik
                mov     ss,ax
                mov     sp,offset szczyt

                int 11h
                AND AX,0000000000000001b
                JZ zero
                mov dx, offset napis1
                mov ah,09h
                int 21h
                jmp dalej
zero:           mov dx,offset napis2
                mov ah,09h
                int 21h

dalej:
                int 11h
                AND AX,0000000000000010b
                ror ax,1
                JZ zero1
                mov dx, offset napis3
                mov ah,09h
                int 21h
                jmp dalej1
zero1:           mov dx,offset napis4
                mov ah,09h
                int 21h

dalej1:
              **  int 11h
                and ax,0000000000001100b
                ror ax,2
                add al,'0'
                mov [napis6],al
                mov dx,offset napis5
                mov ah,09h
                int 21h
                jmp dalej2                
                mov     ah,4ch
                mov         al,0
                int         21h**

dalej2:
                int 11h
                and ax,0000000000110000b
                ror ax,4
                add al,'0'
                mov [napis8],al
                mov dx,offset napis7
                mov ah,09h
                int 21h
                jmp dalej3
                mov     ah,4ch
                mov         al,0
                int         21h

dalej3:
                int 11h
                and ax,0000000011000000b
                ror ax,6
                add al,'0'
                mov [napis10],al
                mov dx,offset napis9
                mov ah,09h
                int 21h
                jmp dalej4
                mov     ah,4ch
                mov         al,0
                int         21h

dalej4:
                int 11h
                AND AX,0000000100000000b
                ror ax,8
                JZ zero2
                mov dx, offset napis11
                mov ah,09h
                int 21h
                jmp dalej5
zero2:           mov dx,offset napis12
                mov ah,09h
                int 21h

dalej5:
                int 11h
                and ax,0000111000000000b
                ror ax,9
                add al,'0'
                mov [napis14],al
                mov dx,offset napis13
                mov ah,09h
                int 21h
                jmp dalej6
                mov     ah,4ch
                mov         al,0
                int         21h

dalej6:
                int 11h
                AND AX,0001000000000000b
                ror ax,12
                JZ zero3
                mov dx, offset napis15
                mov ah,09h
                int 21h
                jmp dalej7
zero3:           mov dx,offset napis16
                mov ah,09h
                int 21h

dalej7:
                int 11h
                AND AX,0010000000000000b
                ror ax,13
                JZ zero4
                mov dx, offset napis17
                mov ah,09h
                int 21h
                jmp dalej8
zero4:           mov dx,offset napis18
                mov ah,09h
                int 21h

dalej8:
                int 11h
                and ax,1100000000000000b
                ror ax,14
                add al,'0'
                mov [napis20],al
                mov dx,offset napis19
                mov ah,09h
                int 21h
                mov     ah,4ch
                mov         al,0
                int         21h

Progr           ends

dane            segment
napis1 db 'Wykryto obecność dyskietki',10,13,'$'
napis2 db 'nie wykryto obecności dyskietki',10,13,'$'
napis3 db 'Jest koprocesor',10,13,'$'
napis4 db 'Brak koprocesora',10,13,'$'
napis5 db 'RAM:'
napis6 db 0,10,13, '$'
napis7 db 'Tryb video:'
napis8 db 0,10,13, '$'
napis9 db 'Liczba napedow dyskietek:'
napis10 db 0,10,13, '$'
napis11 db 'Jest DMA',10,13,'$'
napis12 db 'Brak DMA',10,13,'$'
napis13 db 'Liczba portow RS-232:'
napis14 db 0,10,13, '$'
napis15 db 'Jest joystick',10,13,'$'
napis16 db 'Brak joysticka',10,13,'$'
napis17 db 'Jest drukarka',10,13,'$'
napis18 db 'Brak drukarki',10,13,'$'
napis19 db 'Liczba portow rownoleglych:'
napis20 db 0,10,13, '$'

dane            ends

stosik          segment
                dw    100h dup(0)
szczyt          Label word
stosik          ends

end start
0
  1. Takiego copy-paste to wstydziłbym się nawet w asemblerze.
  2. Nie raczyłeś napisać co dokładnie nie działa. Źle podaje ilość tego ramu? Wysypuje się?
0

Program podaje dobrze ilosc Ram ale chodzi o to aby przeszktalcic ten jeden fragment dotyczacy wyswietlania Ram tak, aby wyswietlal go w kb

1

No to się zdecyduj!

Wyswietla mi sie tylko, że jest a potrzebuję aby wyświetliło mi ilość pamięci RAM

Program podaje dobrze ilosc Ram

WTF?

Poza tym z tego co widzę w dokumentacji to na ten RAM masz przeznaczone 2 bity i to jest informacja o tym ile wielokrotności 16kb jest zainstalowane, tzn
0 [00] -> 16k
1 [01]-> 32k
2 [10]-> 48k
3 [11]-> 64k+
I więcej to ty z tego nie wyczytasz.

0

Okej, okej masz racje. Właśnie o takie mi cos chodzi. A pomogł byś mi jak to zrobić?

0

wyczytałem ze int 12h jest przerwaniem, które do akumulatora ax wprowadza dane o RAM. i tym tropem mam isc?

0

To co napisałem to juz masz w tym kodzie zrobione pod dalej1 bodajże.
To z int 12h nie jest jakoś specjalnie skomplikowane z tego co widzę. Do AX załaduje ci rozmiar ramu, ale z ograniczeniem do 640k ;) Ale jeśli ci to wystarczy to czemu nie :P Musisz sobie tylko potem tą liczbę skonwertować oczywiście do stringa / wypisywać znak po znaku

0

wyczytałem ze int 12h jest przerwaniem, które do akumulatora ax wprowadza dane o RAM. i tym tropem mam isc?
Sposobów na wykrycie ilości pamięci jest fafnaście, bo pytanie "ile jest pamięci" jest nieprecyzyjne ("jakiej pamięci?") a odpowiedź niejednoznaczna ("zależy jak liczyć").

http://wiki.osdev.org/Detecting_Memory_(x86)

0

Przerwania DOSowe i Assembler na poziomie 286. Jak to uruchamiasz na Win 7 ? DOSbox?
Szkoda twojego czasu.

Sprobuj moze wstawiac te makra w funkcje C++ lub Pascal - zaoszczedzisz duzo czasu.

0

tak, w DosBox. Niestety musiałem wykonać to w asm.

Podaje teraz dla ciekawych fragment kodu jak powinien wyglądać i rzeczywiście wyświetla maksymalnie 640Kb. Dziekuję za pomoc. Temat do zamknięcia.

;ODCZYT ILOSCI PAMIECI RAM
odczytRam:
		xor dx,dx
		xor ax,ax
		xor bx,bx
		int 12h	                                         
                                                    
                                                       

dzielenie:      
		cmp bx,4                                 
                jz wyjdz                           
		
		div dzielnik                             
                mov dzielna,dx                           
                mov dx,ax                                

                add dx,48                                
                xor ax,ax                                
                mov ah,02h                               
                int 21h                                  

                xor dx,dx                                
                xor ax,ax                                

                mov ax,dzielnik                          
                div dziesiec                             
                mov dzielnik,ax                          

                xor ax,ax                                
                mov ax,dzielna                           

                inc bx                                   
		jmp dzielenie
wyjdz:                
		ret
*
dzielnik        dw 100
dzielna         dw 0
dziesiec        dw 10

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