Объясните пожалуйста код и как проверить что по адресу 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.