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

📄 chapter3.htm

📁 win32汇编资料 教程!
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
<Title>3.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="chapter2.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="chapter4.htm">后一章</A></TD>
			</TR>
</TABLE>
<h2 align="center">3.0-汇编基础知识</h2>
<p>
这章将教你汇编语言的基础知识
</p>
<h2>3.1-伪代码(opcodes)
</h2>
<p>
汇编程序是用伪代码创建的。一个伪代码是一条处理器可以理解的指令。例如:
</p>
<p class="def1">
ADD
</p>
<p>
Add指令把两个数加到一起。大部分伪代码有参数
</p>
<p class="def2">
ADD eax, edx
</p>
<p>
ADD有两个参数。在加法的情况下,一个源一个目标。它把源值加到目标值中,并把结果保存在目标中。参数有很多不同的类型:寄存器,内存地址,直接数值(immediate values)参见下文。
</p>
<h2>
3.2-寄存器
</h2>
<p>
有几种大小的寄存器:8位,16位,32位(在MMX处理器中有更多)。在16位程序中,你仅能使用16位和8位的寄存器。在32位的程序中,你可以使用32位的寄存器。
</p>
<p>
一些寄存器是别的寄存器的一部分:例如,如果EAX保存了值EA7823BBh这里是其他寄存器的值。
</p>
<table>
<tr>
<td class="general2">EAX</td>
<td class="general3">EA</td>
<td class="general3">78</td>
<td class="general3">23</td>
<td class="general3">BB</td>
</tr>
<tr>
<td class="general2">AX</td>
<td>EA</td>
<td>78</td>
<td class="general3">23</td>
<td class="general3">BB</td>
</tr>
<tr>
<td class="general2">AH</td>
<td>EA</td>
<td>78</td>
<td class="general3">23</td>
<td>BB</td>
</tr>
<tr>
<td class="general2">AL</td>
<td>EA</td>
<td>78</td>
<td>23</td>
<td class="general3">BB</td>
</tr>
</table>
<p>
ax,ah,al是eax的一部分。eax是一个32位的寄存器(仅在386以上存在),ax包含了eax的低16位(2字节),ah包含了ax的高字节,而al包含了ax的低字节。因而ax是16位的,al和ax是8位的。在上面的例子中,这些是那些寄存器的值:
</p>
<p class="def1">
eax = EA7823BB (32-bit)<br/>
ax = 23BB (16-bit)<br/>
ah = 23 (8-bit)<br/>
al = BB (8-bit)<br/>
</p>
<p>
使用寄存器的例子(不要管那些伪代码,只看寄存器的说明)
</p>
<p class="def2">
mov eax, 12345678h<br/>
;Mov把一个值载入寄存器(注意:12345678h是一个十六进制值,因为h这个后缀。
</p> 
<p class="def2">
mov cl, ah<br/>
;把ax的高字节移入cl
</p> 
<p class="def2">
sub cl, 10<br/>
;从cl的值中减去10(十进制)
</p> 
<p class="def2">
mov al, cl<br/>
;并把cl存入eax的最低字节
</p>
<p>
让我们来分析上面的代码:
</p>
<p>
mov指令可以把一个值从寄存器,内存和直接数值移入另一个寄存器。在上面的例子中,eax包含了12345678h,然后ah的值(eax左数第三个字节)被复制入了cl中(ecx寄存器的最低字节)。然后,cl减10并移回al中(eax的最低字节)
</p>
<p>
寄存器的不同类型:
</p>
<p><B>全功能(General Purpose)</B></p>

<p>这些32位(它们的组成部分为16/8位)寄存器可以用来做任何事情:</p>
<table>
<tr>
<td class="general2">eax (ax/ah/al)</td>
<td class="general3"> 加法器</td>
</tr>
<tr>
<td class="general2">ebx (bx/bh/bl)</td>
<td class="general3"> 基(base)</td>
</tr>
<tr>
<td class="general2">ecx (cx/ch/cl)</td>
<td class="general3"> 计数器</td>
</tr>
<tr>
<td class="general2">edx (dx/dh/dl)</td>
<td class="general3">数据
</td>
</tr>
</table>
<p>
虽然它们有名字,但是你可以用它们做任何事。
</p>
<p>
<B>段(Segment)寄存器</B>
</p>
<p>
段寄存器定义了哪一段内存被使用。你可能在win32asm中用不着它们,因为windows有一个平坦(flat)的内存系统。在Dos中,内存被分为64kb的段,因而如果你想要定一个内存地址。你指定一个段,并用一个offset(偏移址)(像0172:0500(segment:offset))。在windows中,段有4GB的大小,所以你在Windows中不需要段。段总是16位寄存器。
</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>
<B>指针寄存器</B>
</p>
<p>
实际上,你可以把指针寄存器当作全功能寄存器来使用(除了eip),只要你保存并恢复它们的原始值。指针寄存器之所以这么叫是因为它们经常被用来存储内存地址。一些伪代码(movb,scasb等)也要用它们。
</p>
<table>
<tr>
<td class="general2">esi (si)
</td>
<td class="general3"> 源索引</td>
</tr>
<tr>
<td class="general2">edi (di)
</td>
<td class="general3"> 目标索引</td>
</tr>
<tr>
<td class="general2">eip (ip)
 </td>
<td class="general3">指令指针</td>
</tr>
</table>
<p>
eip(在16位编程中为ip)包含了指向处理器将要执行的下一条指令的指针。因而你不能把eip当作全功能寄存器来用。
</p>
<p>
<B>栈寄存器</B>
</p>
<p>
有2个栈寄存器:esp和ebp。esp装有内存中当前栈的位置(在下章中,对此有更多的内容)。Ebp在函数中被用成指向局部变量的指针。
</p>
<table>
<tr>
<td class="general2">
esp (sp)
 </td>
<td class="general3">栈指针
 </td>
</tr>
<tr>
<td class="general2">
ebp (bp)
 </td>
<td class="general3">基(base)指针
 </td>
</tr>
</table>


</BODY>
</HTML>

⌨️ 快捷键说明

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