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

📄 chapter4.htm

📁 win32汇编资料 教程!
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<Title>4.0-内存</Title>
<LINK REL="stylesheet" HREF="css/basestyles.css" TYPE="text/css">
<LINK REL="stylesheet" HREF="css/tutorials.css" TYPE="text/css">
</HEAD>
<BODY>
<h1 align="center">Win32Asm 教程 </h1>
<TABLE ALIGN="CENTER">
			<TR>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20"><A HREF="chapter3.htm">前一章</A></TD>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20">
				<A HREF="contents.htm">目录</A></TD>
			<TD CLASS="tutnav" VALIGN="MIDDLE" WIDTH="60" HEIGHT="20"><A HREF="chapter5.htm">下一章</A></TD>
			</TR>
</TABLE>
<h2>4.0-内存</h2>
<p>
这部分将解释在Windows中内存是如何被管理的。
</p>
<h2>4.1-Dos和Win3.xx</h2>
<p>
在运行于Dos和Win3.xx的16位程序中,内存被分成许多个段。这些段的大小为64kb。为了存储内存,需要一个段指针和一个偏移址指针。段指针标明要使用的是哪个段,offset(偏移址)指针标明在段位置。看下图:
</p>
<table width="80%" align="center"> 
<tr> 
<td colspan="5" class="general2">
<div align="center">内存</div>
</td>
</tr> 
<tr>
<td class="general3" width="20%">
<div align="center">
1 (64kb)
</div>
</td>
<td class="general3" width="20%">
<div align="center">
段 2 (64kb)
</div>
</td>
<td class="general3" width="20%">
<div align="center">
3 (64kb)
</div>
</td>
<td class="general3" width="20%">
<div align="center">
4(64kb)
</div>
</td>
<td class="general3" width="20%">
<div align="center">
 更多
</div>
</td>
</tr>
</table>
 
<p>
注意下面关于16位程序的解释,后面有更多关于32位的内容(但不要跳过这部分,要理解32位的内存管理,这部分很重要)上表是全部的内存,被划分成了多个64kb的段。最多有65536个段。现在取出一段:
</p>
<table width="80%" align="center"> 
<tr> 
<td colspan="6" class="general2">
<div align="center">段 1(64kb)</div>
</td>
</tr> 
<tr>
<td class="general3">
<div align="center">
Offset 1
</div>
</td>
<td class="general3">
<div align="center">
Offset 2
</div>
</td>
<td class="general3">
<div align="center">
Offset 3
</div>
</td>
<td class="general3">
<div align="center">
Offset 4
</div>
</td>
<td class="general3">
<div align="center">
Offset 5
</div>
</td>
<td class="general3">
<div align="center">
 更多
</div>
</td>
</tr>
</table> 
<p>
为了指向段中的位置,需要使用offset。一个offset是段内部的一个位置。每个段最多有65536个offset。内存中地址的记法是:
</p>
<p class="def1">
SEGMENT:OFFSET
</p>
<p>
例如:
</p><p class="def1">
0030:4012(均为16进制)
</p>
<p>
它的意思是:段30,offset4012。为了查看那个地址中有什么。你先要到段30,然后到该段的offset4012。在前一章中,你已经学过了段和指针寄存器。例如,段寄存器有:
</p>
<table>
<tr>
<td class="general2">CS
</td>
<td class="general3"> 代码段</td>
</tr>
<tr>
<td class="general2">DS
</td>
<td class="general3"> 数据段</td>
</tr>
<tr>
<td class="general2">SS
</td>
<td class="general3"> 栈段</td>
</tr>
<tr>
<td class="general2">ES
</td>
<td class="general3"> 扩展段</td>
</tr>
<tr>
<td class="general2">FS (only 286+)
</td>
<td class="general3"> 全功能段</td>
</tr>
<tr>
<td class="general2">GS (only 386+)
</td>
<td class="general3"> 全功能段</td>
</tr>
</table>
<p>

顾名思义:代码段(CS)包括了当前的代码执行到了哪部分。数据段是用来标明在哪段中取出数据。栈指栈段(后面有更多)。ES,FS, GS是全功能的寄存器,并且可以用于任何段(虽然在Windows中不是如此)。
</p>
<p>
指针寄存器大多数时装有offset,但全功能寄存器(ax, bx, cx, dx等)也可以这么用。IP标明当前指令执行到了哪个offset。Sp保存了当前栈的在ss(栈段中)的offset。
</p>
<h2>4.2-32位Windows</h2>
<p>
你可能已经注意到了关于段的一切是乏味的。在16位编程中,段是必不可少的。幸运的是,这个问题已经在32位Windows(95及以上)中得到解决。你仍然有段,但不用管他们了因为它们不再是64kb,而是4GB。你如果尝试着改变段寄存器中的一个,windows甚至会崩溃。这称为平坦(flat)内存模式。只有offset,而且是32位的,因而范围从0到4,294,967,295。内存中的每一个地址都是用offset表示的。这真是32位胜于16位的最大优点。所以,你现在可以忘了段寄存器并把精神集中在其他的寄存器上。
</p>

</BODY>
</HTML>

⌨️ 快捷键说明

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