Объясните пожалуйста код и как проверить что по адресу F000-FFFF реально находиться BIOS - Assembler

Узнай цену своей работы

Формулировка задачи:

У меня есть код рабочий на Turbo Pascal которые выводит на экран в виде таблицы адресное пространство ЭВМ Мне дали задание проверить реально ли по адресу F000-FFFF находиться BIOS(пройтись с меньшим шагом и вывести на экран так же коды которые содержаться этому адресу) Я без понятия как это сделать Помогите пожалуйста
program EVM;
 
uses crt,dos;
const  Reg: word=$0000;
       mMem: word=$0000;
      Segm: word=$0000;
      kl: string[16]='0123456789ABCDEF';
var m,n,p,d:longint;
mt:byte;
 b, o,i, f,h1,m1,s1,t1,h2,m2,s2,t2:word;
   e,r,q,w,s,v:string;
    num,qe,j:integer;
a:byte;
count:longint;
begin
clrscr;
writeln('KAPTA PACnPEDEJIEHU9 nAM9TU');
readln;
while m<983040 do begin
gettime(h1,m1,s1,t1);
asm
mov cx,25
@1:
mov bx,9000
@2:
mov ax,Segm
push ds
mov ds,ax
mov [mMem],0050h
mov ax, [mMem]
pop ds
cmp ax,0050h
je @ozu
cmp ax,0
je @net
mov f,2
jmp @ex
@ozu:
mov f,0
jmp @ex
@net:
mov f,1
@ex:
dec bx
jnz @2
loop @1
add Segm,1000h
end;
gettime(h2,m2,s2,t2);
j:=j+1;
n:=mMem;
p:=segm-4096;
p:=p*16+n;
m:=p;
s:='';
w:='000';
r:='FFF';
if p=0 then s:='0'
else
j:=0;
while p>0 do
begin
s:=kl[p mod 16+1];
q:=s+w;
e:=s+r;
p:=p div 16;
end;
write('Adress ',q,' - ',e);
d:=(longint(h2)*360000+longint(m2)*6000+s2*100+t2)-(longint(h1)*360000+longint(m1)*6000+s1*100+t1);
case f of
     0: if (q[1]='C') or (q[1]='D') then
     writeln(' PACLLIUPEHU9 BIOS','CKOPOCTb 4TEHU9| ',d,' HCEK|')
     else begin write(' |OZU|','CKOPOCTb 4TEHU9| ',d,' HCEK|');
              if (q[1]='A') or (q[1]='B') then
                 writeln(' |VIDEO|')
              else writeln;
              end;
     1:begin if (q[1]='C') or (q[1]='D') then
     writeln(' PACLLIUPEHU9 BIOS','|CKOPOCTb 4TEHU9| ',d,' HCEK|');
     if (q[1]='F') then
   writeln(' |BIOS|','CKOPOCTb 4TEHU9| ',d,' HCEK|')
end;
   else
 writeln(' |PZU|','CKOPOCTb 4TEHU9| ', d,' HCEK|');
 
 end;
 
end;
readln;
end.

Решение задачи: «Объясните пожалуйста код и как проверить что по адресу F000-FFFF реально находиться BIOS»

textual
Листинг программы
program ShowBios;
 
  function HexStr(var Num; ByteCount: byte): string; assembler;
  asm
    LES DI,@Result     {get address of function result}
    mov DX,DS          {save Turbo's DS in DX         }
    LDS SI,num         {get number address            }
    MOV AL,ByteCount   {how many bytes?               }
    XOR AH,AH          {make a word                   }
    MOV CX,AX          {keep track of bytes in CX     }
    ADD SI,AX          {start from MS byte of number  }
    DEC SI
    SHL AX,1           {how many digits? (2/byte)     }
    CLD                {store # digits (going forward)}
    STOSB              {in destination string's length byte}
    @@HexLoop:
    STD                {scan number from MSB to LSB   }
    LODSB              {get next byte                 }
    MOV AH,AL          {save it                       }
    SHR AL,1           {extract high nibble           }
    SHR AL,1
    SHR AL,1
    SHR AL,1
    ADD AL,90h         {special hex conversion sequence}
    DAA                {using ADDs and DAA's           }
    ADC AL,40h
    DAA                {nibble now converted to ASCII  }
    CLD                {store ASCII going up           }
    STOSB
    MOV AL,AH          {repeat conversion for low nibble}
    AND AL,0Fh
    ADD AL,90h
    DAA
    ADC AL,40h
    DAA
    STOSB
    LOOP  @@HexLoop       {keep going until done           }
    mov  DS,DX            {restore Turbo's DS              }
  end;
 
var
  BiosMem: array [0..16 - 1] of byte;
  A, S, i, j, k: word;
begin
  A := 0;
  S := $F000;
  for k := 0 to $F000 div 256 do
  begin
    for j := 0 to 16 do
    begin
      Write(HexStr(S, 2), ':', HexStr(A, 2));
      asm
        MOV CX, 16
        LEA DI, [BiosMem]
        MOV SI, [A]
        PUSH DS
        PUSH ES
        MOV AX, DS
        MOV ES, AX
        MOV AX, [S]
        MOV DS, AX
        CLD
        REP movsb
        POP ES
        POP DS
      end;
      for i := 0 to 15 do
        Write(HexStr(BiosMem[i], 1): 3);
      writeln;
      Inc(A, 16);
    end;
    readln;
  end;
end.

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы