⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lib0020.html

📁 Memory Management—Algorithms and implementation in C/C++ Introduction Chapter 1 - Memory Manag
💻 HTML
📖 第 1 页 / 共 3 页
字号:
                <span style="background-color:d9d9d9">[ASCII char][attribute]</span>
                   <span style="background-color:d9d9d9">lo byte   hi byte</span>

    <span style="background-color:d9d9d9">80x25 = 2000 screen characters = 4000 bytes of VRAM</span>
<span style="background-color:d9d9d9">*/</span>
<span style="background-color:d9d9d9">void putCRT(ch)</span>
<span style="background-color:d9d9d9">char ch;</span>
<span style="background-color:d9d9d9">{</span><a name="145"></a><a name="IDX-51"></a>
    <span style="background-color:d9d9d9">/*</span>
    <span style="background-color:d9d9d9">ch = BP + savedBP + retaddress</span>
       <span style="background-color:d9d9d9">= BP + 4 bytes</span>
    <span style="background-color:d9d9d9">display attribute = BP+5</span>
    <span style="background-color:d9d9d9">( OFH = white foreground, black background )</span>
    <span style="background-color:d9d9d9">*/</span>
    <span style="background-color:d9d9d9">asm "MOV SI,BP";</span>
    <span style="background-color:d9d9d9">asm "ADD SI,4H";</span>
    <span style="background-color:d9d9d9">asm "MOV BYTE PTR +5[BP],BYTE PTR 0FH";</span>

    <span style="background-color:d9d9d9">/* set destination ES:DI pair */</span>
    <span style="background-color:d9d9d9">asm "MOV DX, 0B800H";</span>
    <span style="background-color:d9d9d9">asm "MOV ES, DX";</span>
    <span style="background-color:d9d9d9">asm "MOV DI,_offset";</span>

    <span style="background-color:d9d9d9">/* place [char][attr] word in memory */</span>
    <span style="background-color:d9d9d9">asm "MOV CX, 2H";</span>
    <span style="background-color:d9d9d9">asm "REP MOVSB";</span>
    <span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end putCRT-------------------------------------------------*/</span>

<span style="background-color:d9d9d9">/*</span>
    <span style="background-color:d9d9d9">puts string at text position 'pos'</span>
    <span style="background-color:d9d9d9">note: 2 bytes for each screen character,</span>
          <span style="background-color:d9d9d9">so mult. offset by 2</span>
<span style="background-color:d9d9d9">*/</span>

<span style="background-color:d9d9d9">void putCRTStr(str,pos)</span>
<span style="background-color:d9d9d9">char *str;</span>
<span style="background-color:d9d9d9">int pos;</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">int i;</span>
    <span style="background-color:d9d9d9">i=0;</span>
    <span style="background-color:d9d9d9">offset=pos*2;</span>
    <span style="background-color:d9d9d9">while(str[i]!=0)</span>
    <span style="background-color:d9d9d9">{</span>
        <span style="background-color:d9d9d9">putCRT(str[i]);</span>
        <span style="background-color:d9d9d9">offset = offset+2;</span>
        <span style="background-color:d9d9d9">i++;</span>
    <span style="background-color:d9d9d9">}</span>
    <span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end putCRTStr----------------------------------------------*/</span>

<span style="background-color:d9d9d9">/* clears the screen and places cursor to [0,0]*/</span>

<span style="background-color:d9d9d9">void clearCRT()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">int i;</span>
    <span style="background-color:d9d9d9">offset=0;</span>
    <span style="background-color:d9d9d9">for(i=0;i&lt;=(80*25);i++){ putCRT(' '); offset=offset+2; }</span>
    <span style="background-color:d9d9d9">offset=0;</span>
    <span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end clearCRT-----------------------------------------------*/</span><a name="146"></a><a name="IDX-52"></a>
<span style="background-color:d9d9d9">/*</span>
<span style="background-color:d9d9d9">test driver</span>
<span style="background-color:d9d9d9">*/</span>

<span style="background-color:d9d9d9">void main()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">clearCRT();</span>
    <span style="background-color:d9d9d9">putCRTStr("DOS is dead, Use Linux!",240);</span>
    <span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end main --------------------------------------------------*/</span>
</pre>
</div>
<p class="para">You might notice that I am using rather old K&amp;R syntax and unusual inline statements. This is due to the fact that the compiler I am using is Dave Dunfield's handy MICRO-C PC86 C compiler. It's one of the only freebies on the Internet that I could find that would generate MASM friendly 16-bit assembler. In case you are interested, here is my build script:</p>
<div class="informalexample">
<pre class="literallayout">
     del crtio.obj
     del crtio.exe
     del crtio.asm
     mcp crtio.c | mcc &gt; crtio.asm
     ML /Zm -c crtio.asm
     LINK crtio.obj PC86RL_S.OBJ
</pre>
</div>
<table border="0" cellspacing="0" cellpadding="0" class="note">
<tr>
<td valign="top" class="admon-check"></td><td valign="top" class="admon-title">Note&nbsp;</td><td valign="top" class="admon-body">
<p class="first-para">You can also get Microsoft's 16-bit <span class="fixed">CL.EXE</span> compiler and MASM assembler for free as part of the Windows Device Driver Kit. MASM consists of two files: <span class="fixed">ML.EXE</span> and <span class="fixed">ML.ERR</span>. The only downside is that they do not come with documentation.</p>
</td>
</tr>
</table>
<a></a>
</div>
<div class="section">
<h3 class="sect3-title">
<a name="147"></a><a name="ch02lev2sec5"></a>Example: Usurping DOS</h3>
<p class="first-para">Another unfortunate result of the lack of memory protection in DOS is that vital system data structures can be modified by ordinary programs. The interrupt vector table (IVT) is particularly susceptible to being hacked.</p>
<p class="para">Each IVT entry is 4 bytes in size and consists of a 16-bit offset address in the lower word, followed by a 16-bit segment address. This segment and offset address specify the address of the Interrupt Service Routine (ISR). If you want to take control of an interrupt, you can easily overwrite an IVT entry with your own segment and offset address.</p>
<p class="para">An ISR is just a function that implements an interrupt. DOS ISRs are all accessed through interrupt 0x21 in conjunction with a function specifier in the 8-bit AH register. The DOS API, in fact, is nothing more than a series of interrupts and their specifications. <a name="148"></a><a name="IDX-53"></a>The DOS operating system itself is merely the implementation of this API.</p>
<p class="para">There is no need to write your own routine to hijack interrupts. DOS makes life easy for you by providing services for replacing IVT entries (i.e., functions AH=0x25 and AH=0x35 of DOS interrupt 0x21). In the following program, I seize control of the keyboard and only surrender control after the user types eight keys in a row.</p>
<div class="informalexample">
<pre class="literallayout">
<span style="background-color:d9d9d9">/* --usurp.c-- */</span>

<span style="background-color:d9d9d9">int oldseg;</span>
<span style="background-color:d9d9d9">int oldoff;</span>
<span style="background-color:d9d9d9">char kbd_buffer;</span>
<span style="background-color:d9d9d9">int delay;</span>

<span style="background-color:d9d9d9">void saveOldISR()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">asm "MOV AH,35H";</span>
    <span style="background-color:d9d9d9">asm "MOV AL,09H";</span>
    <span style="background-color:d9d9d9">asm "INT 21H";</span>
    <span style="background-color:d9d9d9">asm "MOV _oldseg,ES";</span>
    <span style="background-color:d9d9d9">asm "MOV _oldoff,BX";</span>
    <span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end saveOldISR---------------------------------------------*/</span>

<span style="background-color:d9d9d9">void setUpISR()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">asm "PUSH  DS";</span>
        <span style="background-color:d9d9d9">asm "MOV   CX,CS";</span>
        <span style="background-color:d9d9d9">asm "MOV   DS,CX";</span>
        <span style="background-color:d9d9d9">asm "MOV   DX,OFFSET newISR";</span>
        <span style="background-color:d9d9d9">asm "MOV   AH,25H";</span>
        <span style="background-color:d9d9d9">asm "MOV   AL,09H";</span>
        <span style="background-color:d9d9d9">asm "INT   21H";</span>
       <span style="background-color:d9d9d9">asm "POP  DS";</span>
    <span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end setUpISR-----------------------------------------------*/</span>

<span style="background-color:d9d9d9">void restoreOldISR()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">asm "STI";</span>
    <span style="background-color:d9d9d9">asm "PUSH DS";</span>
    <span style="background-color:d9d9d9">asm "MOV CX, _oldseg";</span>
    <span style="background-color:d9d9d9">asm "MOV DS,CX";</span>
    <span style="background-color:d9d9d9">asm "MOV DX, _oldoff";</span>
    <span style="background-color:d9d9d9">asm "MOV AH,25H";</span>
    <span style="background-color:d9d9d9">asm "MOV AL,09H";</span>
    <span style="background-color:d9d9d9">asm "INT 21H";</span>
    <span style="background-color:d9d9d9">asm "POP DS";</span>

    <span style="background-color:d9d9d9">asm "MOV AX,4C00H";</span>
    <span style="background-color:d9d9d9">asm "INT 21H";</span><a name="149"></a><a name="IDX-54"></a>
    <span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end restoreOldISR------------------------------------------*/</span>

<span style="background-color:d9d9d9">void readKBD()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">while(kbd_buffer==-1){}</span>
    <span style="background-color:d9d9d9">kbd_buffer=-1;</span>
    <span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end readKBD------------------------------------------------*/</span>

<span style="background-color:d9d9d9">void ISR()</span>
<span style="background-color:d9d9d9">{</span>
    <span style="background-color:d9d9d9">asm "newISR:";</span>
    <span style="background-color:d9d9d9">asm "STI";</span>
    <span style="background-color:d9d9d9">asm "PUSH AX";</span>
    <span style="background-color:d9d9d9">asm "PUSH BX";</span>
    <span style="background-color:d9d9d9">asm "IN AL,60H ;get [scan code][status] from port 60H";</span>
    <span style="background-color:d9d9d9">asm "MOV BL,AL";</span>

    <span style="background-color:d9d9d9">asm "IN   AL,61H ;tell KBD have received (twiddle bit)";</span>
    <span style="background-color:d9d9d9">asm "MOV AH,AL";</span>
    <span style="background-color:d9d9d9">asm "OR AL,80H";</span>
    <span style="background-color:d9d9d9">asm "OUT  61H,AL";</span>
    <span style="background-color:d9d9d9">asm "XCHG AL,AH";</span>
    <span style="background-color:d9d9d9">asm "OUT  61H,AL";</span>

    <span style="background-color:d9d9d9">asm "mov AL,BL";</span>
    <span style="background-color:d9d9d9">asm "and  BL,7FH  ; get [scan code]";</span>
    <span style="background-color:d9d9d9">asm "test AL,80H  ; check for key release";</span>
    <span style="background-color:d9d9d9">asm "jnz exitInterrupt";</span>

    <span style="background-color:d9d9d9">asm "mov _kbd_buffer,BL";</span>

    <span style="background-color:d9d9d9">asm "exitInterrupt:";</span>
        <span style="background-color:d9d9d9">asm "mov     AL,20H";</span>
    <span style="background-color:d9d9d9">asm "out     20H,AL";</span>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -