<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[汇编研究]]></title>
<link>http://blog.pfan.cn/wukong</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[破解入门]]></title>
		<link>http://blog.pfan.cn/wukong/5346.html</link>
		<description><![CDATA[第一课 壳
************一.壳的概念作者编好软件后,编译成exe可执行文件1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名等2.需要把程序搞的小一点,从而方便使用于是,需要用到一些软件,他们能将exe可执行文件压缩,实现上述两个功能,这些软件称为加壳软件或压缩软件.它不同于一般的winzip,winrar等压缩软件.它是压缩exe可执行文件的,压缩后的文件可以直接运行.二.加壳软件最常见的加壳软件ASPACK ,UPX,PEcompact不常用的加壳软件WWPACK32；PE-PACK ；PETITE ；NEOLITE
第二课 脱壳************拿到一个软件,我们首先根据第一课的内容侦测它的壳,然后我们要把它的壳脱去,还原它的本来面目.若它没有加壳,就省事不用脱壳了.一.脱壳软件unaspack,caspr,upx,unpecompact,procdump二.使用方法(一)aspack壳 脱壳可用unaspack或caspr1.unaspack&nbsp; 我的主页可下载中文版使用方法类似lanuage傻瓜式软件,运行后选取待脱壳的软件即可.&nbsp; 缺点：只能脱aspack早些时候版本的壳,不能脱高版本的壳2.caspr第一种：待脱壳的软件(如aa.exe)和caspr.exe位于同一目录下,执行windows起始菜单的运行,键入 caspr aa.exe脱壳后的文件为aa.ex_,删掉原来的aa.exe,将aa.ex_改名为aa.exe即可使用方法类似fi&nbsp; 优点：可以脱aspack任何版本的壳，脱壳能力极强 缺点：Dos界面
第二种：将aa.exe的图标拖到caspr.exe的图标上
***若已侦测出是aspack壳,用unaspack脱壳出错，说明是aspack高版本的壳，用caspr脱即可(二)upx壳 脱壳可用upx待脱壳的软件(如aa.exe)和upx.exe位于同一目录下,执行windows起始菜单的运行,键入upx -d aa.exe
(三)PEcompact壳 脱壳用unpecompact &nbsp; 我的主页可下载中文版
使用方法类似lanuage傻瓜式软件,运行后选取待脱壳的软件即可
(四)procdump 万能脱壳但不精,一般不要用 我的主页可下载中文版使用方法:运行后]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-26 10:27:00</pubDate>
		</item>
				<item>
		<title><![CDATA[汇编语言上机指导及例示[转]]]></title>
		<link>http://blog.pfan.cn/wukong/5207.html</link>
		<description><![CDATA[&nbsp;Content：
从如何建立源文件到进行调试作下简要的介绍，并配例题说明。由于本人水平有限，在下文在如有错误及可以进一步修改的地方请大家指出 
汇编语言上机过程： 一、上机前的软件准备：MS-DOS操作系统（如：MSDOS6.22 , MSDOS7.0 等）文本编辑器 （如：EDIT.COM , TURBO.EXE , TC.EXE , C.EXE 等）汇编程序 （如：MASM.EXE , ASM.EXE 等）连接程序 （如：LINK.EXE 等）调试程序 （如：DEBUG.EXE 等）
二、汇编程序建立过程:
　
a.建立汇编源程序─通过───→b.编译为目标文件─　↓┬─→d.连接为可执行文件　　↑　　　　　　　　　　　　　　　　　　　　 　 　　　│ 　c.不通过，重新修改（语句错误）　　 　 　　　 　　　　　　↓　　　├──────────────────────┘　 　　　　　 ↓　　↑　　　f.不正确，用调试工具调试，重新修改（逻辑错误）　 　 　↓　　　└────────────────────────────←e运行　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 　↓正确　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 g.完成
三、现在对（二）的每一个标有字母的过程(PROCEDURE)进行详细说明
PROCEDURE a:建立汇编源程序（即：建立 文件名.asm）这个过程就相当于我们在纸上编写源程序代码一样，只不过是将纸变为了计算机，这个过程也称源代码录入。将源程序代码录入计算机的方法很多，下面将介绍具体方法。 1.通过MD-DOS自带的EDIT.EXE文本编辑器进行输入，在DOS提示符下键入:EDIT回车,这时如果你系统内可调用时，EDIT的操作画面便会出现在屏幕上，你就可在提示下进行录入了，当录入完毕后，选择存盘并给你输入的文件起一个文件名，形式：filename.asm ；（其中filename为你起的文件名,由1-8个字符组成），asm 是为汇编程序识别而必须加上去的，不可更改。存盘后在DOS下可用DOS命令DIR来查看，如果看到了所存的文件存在，就可以进行进程b。2.如果你的系统中没有EDIT，也可用你所熟悉的文本编辑器进行录入、编辑，如可用c语言和pascal语言的文本编辑器来编辑]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-24 12:32:00</pubDate>
		</item>
				<item>
		<title><![CDATA[汇编语言超浓缩教程[转]经典]]></title>
		<link>http://blog.pfan.cn/wukong/5206.html</link>
		<description><![CDATA[Content：
&nbsp;&nbsp;&nbsp; “ 哎哟，哥们儿，还捣鼓汇编呢？那东西没用，兄弟用VB"钓"一个API就够你忙活个十天半月的，还不一定搞出来。”此君之言倒也不虚，那吾等还有无必要研他一究呢？（废话，当然有啦！要不然你写这篇文章干嘛。）别急，别急，让我把这个中原委慢慢道来：一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储，机器码可以被比较准确的翻译成汇编语言，这是因为汇编语言兼容性最好，故几乎所有跟踪、调试工具（包括WIN95/98下）都是以汇编示人的，如果阁下对CRACK颇感兴趣……；二、汇编直接与硬件打交道，如果你想搞通程序在执行时在电脑中的来龙去脉，也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干？一个真正的硬件发烧友，不懂这些可不行。三、如今玩DOS的多是“高手”，如能像吾一样混入（我不是高手）“高手”内部，不仅可以从“高手”朋友那儿套些黑客级“机密”，还可以自诩“高手”尽情享受强烈的虚荣感--#$%&amp; “醒醒!” 
　　对初学者而言，汇编的许多命令太复杂，往往学习很长时间也写不出一个漂漂亮亮的程序，以致妨碍了我们学习汇编的兴趣，不少人就此放弃。所以我个人看法学汇编，不一定要写程序，写程序确实不是汇编的强项，大家不妨玩玩DEBUG，有时CRACK出一个小软件比完成一个程序更有成就感（就像学电脑先玩游戏一样）。某些高深的指令事实上只对有经验的汇编程序员有用，对我们而言，太过高深了。为了使学习汇编语言有个好的开始，你必须要先排除那些华丽复杂的命令，将注意力集中在最重要的几个指令上（CMP LOOP MOV JNZ……）。但是想在啰里吧嗦的教科书中完成上述目标，谈何容易，所以本人整理了这篇超浓缩（用WINZIP、WINRAR…依次压迫，嘿嘿！）教程。大言不惭的说，看通本文，你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG，很有成就感的，试试看！那么――这个接下来呢？―― Here we go！（阅读时看不懂不要紧，下文必有分解）
　　因为汇编是通过CPU和内存跟硬件对话的，所以我们不得不先了解一下CPU和内存：（关于数的进制问题在此不提）
　　ＣＰＵ是可以执行电脑所有算术╱逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说，不同的CPU其汇编语言的指令语法亦不相同。个人电脑]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-24 12:26:00</pubDate>
		</item>
				<item>
		<title><![CDATA[与C的邂逅——初学C语言的收获与感受[转]]]></title>
		<link>http://blog.pfan.cn/wukong/5204.html</link>
		<description><![CDATA[I. 关于代码的格式：



1.
预先输入配对符号和易忘符号，如成对的大括号、双引号、小括号以及分号等

2.
大括号“{” 和“}”各自独占一行并与上一行首字母对齐；

3.
左大括号“{”的下一行进行整段缩进，直到遇到右大括号“}”，如果有多对大括号“{”“}”，重复以上规则；

4.
在每个左小括号“(”前加一个空格，每个逗号“，”后加一个空格，在实现不同功能的代码块之间加一个空行；

5.
控制每一行代码的长度，使其不超过屏幕显示的范围，当某一行即将到达屏幕边界时，按下回车键并缩进至与上一行行首对齐；
示例：




#include&lt;stdio.h&gt;main (){/*大括号独占一行*/　int icount=0; /*开始整段缩进*//*适当的空行用来使代码结构清晰*/　clrscr (); /*清屏函数*/　for (; icount&lt;=10; icount++)　{　　printf (“Value of icount is %d.\n”, icount);　｝/*小括号前和逗号后的空格使代码不拥挤，更清晰*/　　　return 0; }
II. 关于数据类型和变量：



1.
定义变量时应了解各种数据类型的可表示范围，考查其是否符合对输出结果数据精度的要求；

2.
尽量用少而有意义的一组字母、数字和下划线为变量命名，这样既可以减轻输入强度，又可以使代码便于理解，以利出错维护和功能扩展；

3.
为区分不同类型的变量，命名时应该在已经确定的变量名前加一个表示该变量类型的小写字母，如“int icount;”，这样当你在后面的代码中看到它时，就知道它是一个用作计数器的整型变量；

4.
用作部分和（累加器），部分积（累乘器）的变量最好在定义时就分别初始化为0和1， 如“int isum=0;”；
III. 关于表达式的表示：



1.
不要忘记乘号“*”；

2.
当一个表达式里的符号（尤其是关系运算符）多得使你无法确定结果时，使用小括号限定运算顺序；

3.
使用相等测试运算符“==”时，将常量放在左边，如“if (0==ichoice)”
IV. 关于一些基本语句：



1.
printf和scanf：不要忘记“]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-24 11:28:00</pubDate>
		</item>
				<item>
		<title><![CDATA[编写一个简单的窗口]]></title>
		<link>http://blog.pfan.cn/wukong/5183.html</link>
		<description><![CDATA[有关窗口的基本知识
&nbsp;&nbsp;&nbsp;&nbsp;窗口是屏幕上的矩形区域。一个窗口可以从键盘或者鼠标接受用户的输入，并在其内部显示图形输出。一个应用程序窗口通常包含程序的标题条、菜单、边框，滚动条。其中，对话框也是一种窗口。不同的是，对话框表面通常包含几个其它窗口，称之为“子窗口”。这些子窗口的形式有压入按钮、单选按钮、复选框、文本输入区域、列表框和滚动条等。 用户将这些窗口看成屏幕上的对象，可以通过按下一个按钮或者滚动一个滚动条与这些对象直接交互。&nbsp;&nbsp;&nbsp;&nbsp;窗口以“消息”的形式接收窗口的输入，窗口也用消息与其它窗口通讯。比如在程序窗口的大小改变时，字处理器会重新格式化其中的文本。窗口大小改变的细节是由操作系统处理的，但程序能够响应这个系统功能。当用户改变窗口的大小时，Windows给程序发送一条消息指出新窗口的大小。然后，程序就可以调整窗口中的内容，以响应大小的变化。程序创建的每一个窗口都有相关的窗口过程。也就是给这个窗口指定一个子程序（窗口过程），Windows通过调用它来给窗口发送消息。窗口过程再根据此消息进行处理，然后将控制返回给Windows。&nbsp;&nbsp;&nbsp;&nbsp;窗口在“窗口类”的基础上创建的。Windows定义了确省的窗口过程，如果你对所有的消息都让Windows自己处理，那么你就能得到一个标准的窗口，同样，你也可以选择处理自己感兴趣的消息，这样，相当于产生了不同的子类，也就形成了不同的应用程序。同样，子窗口也是基于同一个窗口类，并且使用同一个窗口过程。例如，所有Windows 程序中的所有按钮都基于同一窗口类。这个窗口类有一个处理所有按钮消息的窗口过程，但是，如果你按自己的设想设计一个按钮，如想把按钮的表面换成位图，你就可以自己处理按钮窗口的 WM_PAINT 消息，当 Windows 需要画按钮表面的时候，你就可以随自己的意思去画。&nbsp;&nbsp;&nbsp;&nbsp;Windows程序开始执行后，Windows为该程序创建一个“消息队列”。这个消息队列用来存放该程序可能创建的各种不同窗口的消息。程序中有一段代码，叫做“消息循环”， 它用来从队列中取出消息，并且将它们发送给相应的窗口过程。在没有消息发生的时候，你的程序实际上就在消息循环中转圈子。&nbsp]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-23 19:25:00</pubDate>
		</item>
				<item>
		<title><![CDATA[一个简单的对话框 --- 兼谈资源文件的使用]]></title>
		<link>http://blog.pfan.cn/wukong/5182.html</link>
		<description><![CDATA[Windows 的资源文件
&nbsp;&nbsp;&nbsp;&nbsp;不管在Dos下编程还是在Windows下编程，我们总是要用到除了可执行文件外的很多其他数据，如声音数据，图形数据，文本等等，在Dos下编程，我们可以自己定义这些文件的格式，但这样一来就造成了很多资源共享的问题，大家可能还记的Dos下的很多游戏，它们的图形都是按自己的格式存放的，你无法用标准的看图软件来看。也无法把它另存为其他格式。虽然在Win32编程中，我们仍然可以这样做，但Win32编程给了我们一个方案 ---- 就是格式统一的资源文件，把字符串、图形、对话框包括上面的按钮，文本等定义到一个资源文件中，就可以方便的在不同的文件中使用它，最重要的是，如果我们用自己的文件格式，使用时就要涉及到这些文件的读写操作，比较复杂，但使用资源文件时，Windows提供了一系列的API来装入资源。非常方便。现在，让我们来看一个很简单的资源文件的源文件，它的扩展名是 .rc，当它用资源编译器编译以后产生 .res 文件就可以在 link的时候连入.exe 文件中：
#include	&lt;Resource.h&gt;
#define		DLG_MAIN	1

DLG_MAIN	DIALOGEX 0, 0, 236, 185
STYLE		DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION		"对话框模板"
FONT		9, "宋体"
BEGIN
	DEFPUSHBUTTON	"退出",IDOK,177,163,50,14
	CONTROL		"",-1,"Static",SS_ETCHEDHORZ,7,155,222,1
END

现在我简单解释一下 .rc文件的语法：
#include &lt;resource.h&gt; -- resource.h文件包括资源文件的一些常量定义，如下面的 WS_POPUP,WS_VISIBLE 等窗口的风格等等
#define DLG_MAIN 1 -- 类似于 .asm 文件的 equ 语句，和汇编源程序一样，这些定义是为了程序的可读性。
DLG_MAIN DIALOGEX 0,0,236,185
Windows的.rc文件可以定义 BIT]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-23 19:25:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Win32汇编程序的结构和语法]]></title>
		<link>http://blog.pfan.cn/wukong/5181.html</link>
		<description><![CDATA[Win32ASM程序的结构和语法
&nbsp;&nbsp;让我们先来看看一个最简单的Win32汇编程序：
		.386
		.model flat, stdcall
		option casemap :none   ; case sensitive

include		windows.inc
include		kernel32.inc
includelib	kernel32.lib

		.data

szCaption		db	'Win32汇编例子',0
szText		db	'Win32汇编，Simple and powerful!',0

		.code

start:
		invoke	MessageBox,NULL,addr szText,addr szCaption,MB_OK
		invoke	ExitProcess,NULL

		end	start
这就是一个能执行的最简单的Win32汇编程序，下面我简单地介绍一下各部分的作用：
.386
这条语句和Dos下汇编是一样的，是告诉编译器我们要用到80386的指令集，因为32位汇编程序要用到32位的寄存器如eax,ebx等，所以这一句是必须的，当然，你也可以用.486,.586等，当用到特权指令时，还可以用 .386p,.486p等等。
.model flat,stdcall
.model告诉编译器程序的模式，编过Dos汇编的人可能知道在Dos程序的模式有tiny,small,...huge 等，它指定了程序内存寻址模式，在huge等模式下，内存寻址和子程序调用将用Far的格式，但在Win32汇编中，你只能使用一个模式即 flat 模式，因为对Win32程序来说，内存是连续的一个4GB的段，无所谓小或大的模式。而stdcall 告诉编译器参数的传递方式，在调用子程序时，参数是通过堆栈传递的，参数的传递方式有三种，stdcall,c 和 pascal，stdcall 指定了参数是从右到左压入堆栈的，比如说对一个Windows API 如 MessageBox，在手册中是如此定义的：int MessageBox(

    HWND hWnd,	    	// handle of owner window
    LPCTSTR lpText,		/]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-23 19:24:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Win32汇编的环境和基础]]></title>
		<link>http://blog.pfan.cn/wukong/5180.html</link>
		<description><![CDATA[1.32位环境简介
&nbsp;&nbsp;在Dos下编汇编程序，我们可以管理系统的所有资源，我们可以改动系统中所有的内存，如自己改动内存控制块来分配内存，自己修改中断向量表来截获中断等，对其他操作也是如此，如我们对键盘端口直接操作就可以把键盘屏蔽掉，可以这样来描述Dos系统：系统只有一个特权级别，在编程上讲，任何程序和操作系统都是同级的，所以在Dos下，一个编得不好的程序会影响其他所有的程序，如一个程序把键盘口中断关掉了，所有程序就都不能从键盘获得键入的数据，直到任何一个程序重新打开键盘为止，一个程序陷入死循环，也没有其他程序可以把它终止掉。Dos下的编程思路是“单任务”的，你只要认为你的程序会按照你的流程一步步的执行下去，不必考虑先后问题（当然程序可能会被中断打断，但你可以认为它们会把环境恢复，如果中断程序没有把环境恢复，那是他们的错）。&nbsp;&nbsp;在内存管理方式上，Dos汇编和Win32汇编也有很多的不同：Dos工作在实模式下，我们可以寻址1M的内存，寻址时通过段寄存器来制定段的初始地址，每个段的大小为64K，超过1M的部分，就只能把他作为XMS使用，也就是说，只能用作数据存放使用而无法在其中执行程序。&nbsp;&nbsp;而Windows在保护模式下执行，这里所有的资源对应用程序来说都是被“保护”的：程序在执行中有级别之分，只有操作系统工作在最高级--0级中，所有应用程序都工作在3级中（Ring3)， 在Ring3中，你无法直接访问IO端口，无法访问其他程序运行的内存，连向程序自己的代码段写入数据都是非法的，会在Windows的屏幕上冒出一个熟悉的蓝屏幕来。只有对Ring0的程序来说，系统才是全开放的。&nbsp;&nbsp;在内存方面，Windows使用了处理器的分页机制，使得对应用程序来说，所有的内存都是“平坦”的，你不必用一个段寄存器去指定段的地址，因为在保护模式下，段寄存器的含义是不同的（可以参见80386手册方面的书籍），你可以直接指定一个32位的地址来寻址4GB的内存。&nbsp;&nbsp;在程序结构方面，Windows程序也有很大的不同，它是“基于消息”的，你可以想象这样一个常见的Windows窗口，上面有几个按钮，如果你用Dos编程的思路去考虑，你会发现实现它很困难：鼠标移动到窗口边缘时拖动会改变窗口大小，鼠标点击按钮时再做]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-23 19:23:00</pubDate>
		</item>
				<item>
		<title><![CDATA[8086/8088汇编语言指令集]]></title>
		<link>http://blog.pfan.cn/wukong/5101.html</link>
		<description><![CDATA[8086/8088汇编语言指令集 数据传送指令集&nbsp; MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数 POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m&nbsp; PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m&nbsp; 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV&nbsp; 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-22 14:02:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Win32汇编语言程序设计教程[转]]]></title>
		<link>http://blog.pfan.cn/wukong/5100.html</link>
		<description><![CDATA[Win32汇编语言程序设计教程
导言 先来对这个教程做个小小的介绍。Win32Asm不是一个非常流行的编程语言，而且只有为数不多（但很好）的教程。大多数教程都集中在编程的win32部分（例如，WinAPI，标准Windows编程技术的使用等），而不是汇编语言本身，例如伪代码（opcodes），寄存器（registers）的使用等。虽然你能在其他教程中找到这些内容，但那些教程通常是解释Dos编程的。它当然可以帮你学习汇编语言，但在Windows中编程，你不再需要了解Dos中断（interrupt）和端口（port）In/Out函数。在Windows中，WindowsAPI提供了你可在你的程序中使用的标准函数，后面还会对此有更多内容。这份教程的目的是在解释用汇编编Win32程序的同时学习汇编语言本身。 
1．0－介绍汇编语言 汇编语言是创造出来代替原始的只能由处理器理解的二进制代码的。很久以前，尚没有任何高级语言，程序都是用汇编写的。汇编代码直接描述处理器可以执行的代码，例如： 
add eax,edx 
add这条指令把两个值加到一起。eax和edx被称为寄存器，它们可以在处理器内部保存值。这条代码被转换为66 03 c2（16进制）。处理器阅读这行代码，并执行它所代表的指令。像C这样的高级语言把它们自己的语言翻译为汇编语言，而汇编器又把它转换为二进制代码： 
C 代码 a = a + b; &gt;&gt; C编译器 &gt;&gt; 汇编语言 add eax, edx &gt;&gt;汇编器&gt;&gt; 原始输出（十六进制） 66 03 C2 
（注意该处的汇编语言的代码被简化了，实际输出决定于C代码的上下文） 
1．1－为什么？（Why？） 既然用汇编写程序很困难，那么为什么你用A汇编而不是C或者别的什么？？－汇编产生的程序更小而且更快。在像如有人工智能一般的非常高级编程语言中，编译器要产生输出代码比起汇编来更困难。虽然编译器变得越来越好，编译器仍然必须指出最快（或最小）的方式产生汇编代码。而且，你自己来写（汇编）代码（包括可选的代码优化）能生成更小更快的代码。但是，当然，这比使用高级语言难多了。还有另一个与某些使用运行时dll的高级语言不同的地方，它们在大多数时运行良好，但有时由于dll（dll hell）而产生问题，用户总是要安装这些Dll]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-22 13:58:00</pubDate>
		</item>
				<item>
		<title><![CDATA[8086／88通用寄存器]]></title>
		<link>http://blog.pfan.cn/wukong/5077.html</link>
		<description><![CDATA[8086／88内部有14个寄存器。其中有四个寄存器最常用。这四个寄存器称为通用寄存器。名字分别是AX、BX、CX和DX。它们具有一个通用的功能--保存数据，但每个寄存器还有自己专门的用途，下面分别介绍。 
AX&nbsp; A取自单词Accumulator，所以AX也被称为"累加器"。不过请不要望文生意，它的专门用途可不是作加法。今天我们介绍它的一个专门用途，就是CPU与端口交换数据的唯一通路。除此之外，它还有一系列专门的用途，这些用途以后会陆续谈到。 
BX也被称为"基地址寄存器"（Base address）。这也是一个十分重要的寄存器，它可用来作为指针使用。这方面的内容将在第三章介绍。本节的程序不涉及BX的专门用途。 
CX也称"计数器"（Counter）。这个寄存器主要用于为循环指令（LOOP）计循环次数，也用于计数据移位的位数。在"串处理"指令中也有应用。后面的程序就是用CX为LOOP指令计数的。 
DS称为数据段地址寄存器（Data segment），它保存数据段的段地址。如果在程序中有数据的存取操作时，若不"显式"地指定段寄存器，则将在DS指定的段寻找相应的存储单元。 
ES称为附加段地址寄存器（Exterial segment），也可以称为扩展段地址寄存器，它用于指向内存中的任一段。一般情况下我们常使用这个段寄存器取得内存中某个单元的数据而不需修改DS寄存器。 
CS是代码段地址寄存器（Code segment），它和IP（指令指针）寄存器一起指向目前正在执行的指令。也就是说，CPU永远在CS：IP指向的内存单元中取得指令机器码并执行。CS寄存器的数值有变化，CPU所取的指令就有变化。 
SS是堆栈段地址寄存器（Stack segment），它保存了堆栈存储区的段地址。堆栈是开辟在内存中的一段特殊空间，数据在堆栈中存取不同于在其它内存空间。
以上所讲的所有段寄存器都是16位的，无法拆分成8位使用，同时，段寄存器不能参与任何数学运算和逻辑操作。 




指令指针寄存器(Instruction Pointer)　　IP是CPU内部一个16位的寄存器，它用于记录CPU将要执行的指令的偏移地址。指令的段地址由CS保存。IP不同于其它寄存器，它不能随意的修改，不能参与任何运算或逻辑操作。它的唯一用途就是为CPU取得指令提供偏移地址（C]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-21 16:05:00</pubDate>
		</item>
				<item>
		<title><![CDATA[寄存器简单介绍]]></title>
		<link>http://blog.pfan.cn/wukong/5073.html</link>
		<description><![CDATA[储单元就被CPU"选中"，那么CPU就可以把这个存储单元所存的数据通过另一组线路（数据总线）取出，或向这个存储单元存入新的数据。　　不同的CPU所具有的地址线数量是不一样的，像8086/88只有20根地址线，所能给出的地址范围是0-220－1（1048575），所以8086/88只能配备1MB存储器。而286有24根地址线，当然可配备224个字节的存储器。386/486有32根地址线，所以最多可配备4GB存储器。　　前面所说的存储器都是直接和CPU相联接的，这些存储器和CPU往往安装在同一块电路板上，因此通常把这类存储器称为"内存储器"（内存）。在机器中还有另一类存储器-"外存储器"，这类存储器一般指得是软盘、硬盘、磁带和光盘等容量较大的存储设备。　　外存储器和内存相联接而不和CPU直接联接，即CPU无法直接将外存中的数据取到自己内部进行处理，而只能先通过另一部分控制电路将外存中的数据取到内存中，再进行进一步的处理。处理后的数据也是先放在内存中，再传至外存。　　正是由于这个原因，外存的容量并不受CPU地址线数量的限制。其容量可从几百KB直至几个GB不等。而且外存往往是机械--电子结合的设备，其数据存取速度远低于内存。 
1．6 寄存器　　寄存器又分为内部寄存器与外部寄存器，所谓内部寄存器，其实也是一些小的存储单元，也能存储数据。但同存储器相比，寄存器又有自己独有的特点：　　① 寄存器位于CPU内部，数量很少，仅十四个；　　② 寄存器所能存储的数据不一定是8bit，有一些寄存器可以存储16bit数据，对于386/486处理器中的一些寄存器则能存储32bit数据；　　③ 每个内部寄存器都有一个名字，而没有类似存储器的地址编号。　　寄存器的功能十分重要，CPU对存储器中的数据进行处理时，往往先把数据取到内部寄存器中，而后再作处理。关于各个寄存器的具体问题后面会深入讨论。　　外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器，它与CPU之间通过"端口"交换数据，所以外部寄存器具有寄存器和内存储器双重特点。有些时候我们常把外部寄存器就称为"端口"，这种说法不太严格，但经常这样说。　　外部寄存器虽然也用于存放数据，但是它保存的数据具有特殊的用途。某些寄存器中各个位的0、1状态反映了外部设备的工作状态或方式；还有一些寄存器中的各个位可对外部设备进行控制；也有一些端口作为CP]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-21 10:49:00</pubDate>
		</item>
				<item>
		<title><![CDATA[汇编语言中的数]]></title>
		<link>http://blog.pfan.cn/wukong/5072.html</link>
		<description><![CDATA[汇编语言中的数　　高级语言中也多用十进制数。十进制数由0－9十个数字组合而成，逢10进1。但由于汇编语言是面向硬件的，因此，在汇编语言中使用的数字也是和硬件结合紧密的二进制数。　　二进制数只由0和1而个数字组成，逢2进1，也就是说，在十进制数中计算1+1时将得到一位数字的结果--2，而在二进制数中计算时将得到一个二位二进制数--10，表1－1列出了四位二进制数与十进制数间的对应关系。　　在十进制数字中还有"数位"之分，个位，十位，百位......，在二进制数中也分各个数位。以四位二进制数1010为例，从右数第一位，称为bit0，第二位称bit1，以此类推。因此，1010的bit3，bit1位是1，bit2，bit0位是0。与十进制数一样，二进制数自右向左数位逐渐升高。最左端的数位为最高位，1010的最高位为1。 





表1－1 四位二进制数与十进制数对照表 





二进制数
0000
0001
0010
0011
0100
0101
0110
0111






十进制数
0
1
2
3
4
5
6
7





二进制数
1000
1001
1010
1011
1100
1101
1110
1111





十进制数
8
9
10
11
12
13
14
15





　　我们知道，计算机利用电路来记忆1和0，那么1和0究竟和电路的工作状态有什么关系呢？通俗的讲，1，0反应了电路输出（入）电压的高和低。如果电路输出（入）的电压高，比如达到了电源电压的幅度，此时电路的输出（入）就为1。如果电路输出（入）的电压很低，比如接近0V，那么这时电路的输出（入）就为0。　　二进制数字在实际应用中还有一些缺点，比如不便于书写，难于记忆等。为此，在汇编语言中还常用另一种数制--十六进制。十六进制数字由十六个数组成，逢16进1。前十个数字和十进制一样，是0－9，后六个数字用英文字母A－F来表示。表1－2列出了十六进制与十进制数间的对应关系。 





表1－2 十六进制数与十进制数对照表 





十进制
0
1
2
3
4
5
6
7






十六进制]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-21 10:47:00</pubDate>
		</item>
				<item>
		<title><![CDATA[汇编语言基础知识]]></title>
		<link>http://blog.pfan.cn/wukong/5071.html</link>
		<description><![CDATA[所谓汇编语言，其实质就是机器语言的一个高级的形式。我们知道，机器语言是CPU唯一可以真正"理解"的语言，它是用一些由"0"和"1"两个数字组成的一组数字来表示的。例如：1011000000000001（意思是将数字1放入累加器）。　　这样的一组数字非常难以理解和记忆，毕竟程序员不是一块CPU。为了使程序设计人员能够很好地记忆这些机器指令，简化程序设计工作，技术人员将这些怪异的数字用一些取自人类语言的简短的文字符号来表示，于是就产生了汇编语言。这些简短的文字符号称为指令助记符。例如上面的那个机器指令用汇编语言表达出来，就是"MOV AL，1"。　　同高级语言相比，汇编语言具有一些极其突出的特点： 





　　① 汇编语言是一种完全面向硬件的语言，这同BASIC，C之类的高级语言截然不同。多数高级语言都是面向问题的，例如：如果需要在屏幕上显示一串文字时，我们可以直接应用BASIC语言中的PRINT语句，或用C语言中的PRINTF函数，这个问题就迎刃而解了。而使用汇编语言编程，解决这个问题的最终操作是"将这些文字的ASCII码写入显示缓冲存储器中"。可见，汇编语言将这个问题转化成了对硬件（显示缓冲存储器）的操作（写入）。这是汇编语言的一个极其突出的特点，也是汇编语言同高级语言的最显著的差别；　　② 同高级语言相比，汇编语言编写的程序结构十分紧凑，运行速度很快。汇编语言同机器指令直接对应，编译速度快，同时，CPU"理解"其"母语"的速度远高于"翻译"高级语言的速度。因此，汇编语言是所有程序设计语言中运行效率最高的。这是汇编语言的一个最为突出的优点。当需要编写高速运行的软件时，例如编写图像处理程序，就往往使用汇编语言编写软件中的关键部分；　　③ 用汇编语言编制程序十分费时，而且程序的质量直接受到程序员技术水平的影响，程序的可读性也很差。就象前面所举的输出文字的例子，用高级语言编程只需写一条语句，简单明了，极其直观。而用汇编语言编程则需写出一系列指令，这些指令都是些对硬件的操作，同"文字输出"这个问题没有明显的直接联系，因此程序的可读性很差。　　④ 由于汇编语言是面向硬件的，所以用汇编语言编制的程序可移植性很差。显而易见，不同的CPU都有相互独立的指令系统，相互间无任何关系，就算是使用同一系列CPU的机器，因其外围硬件可能有差别，这也会使相同的程]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-21 10:46:00</pubDate>
		</item>
				<item>
		<title><![CDATA[基本概念]]></title>
		<link>http://blog.pfan.cn/wukong/5070.html</link>
		<description><![CDATA[理论：
WIN32 程序运行在保护模式下的，保护模式的历史可以追溯到 80286。而今 80286 已成为了历史。所以我们将只把精力集中于 80386 及后续的X86 系列 CPU。Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行，也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间，当然这倒不是说它们都拥有 4GB 的物理地址空间，而只是说能够在 4GB 的范围内寻址。操作系统将会在应用程序运行时完成 4GB 的虚拟地址和物理内存地址间的转换。这就要求编写应用程序时必须格守 Windows 的规范，否则极易引起内存的保护模式错误。而过去的 Win16 内存模式下，所有的应用程序都运行于同一个 4GB 地址空间，它们可以彼此"看"到别的程序的内容，这极易导致一个应用程序破坏另一个应用程序甚至是操作系统的数据或代码。和 16 位 Windows 下的把代码分成 DATA，CODE 等段的内存模式不同，WIN32 只有一种内存模式，即 FLAT 模式，意思是"平坦"的内存模式，再没有 64K 的段大小限制，所有的 WIN32 的应用程序运行在一个连续、平坦、巨大的 4GB 的空间中。这同时也意味着您无须和段寄存器打交道，您可以用任意的段寄存器寻址任意的地址空间，这对于程序员来说是非常方便的，这也使得用32位汇编语言和用C语言一样方便。 在Win32下编程，有许多重要的规则需要遵守。有一条很重要的是：Windows 在内部频繁使用 ESI，EDI，EBP，EBX 寄存器，而且并不去检测这些寄存器的值是否被更改，这样当您要使用这些寄存器时必须先保存它们的值，待用完后再恢复它们，一个最显著的应用例子就是 Windows 的 CallBack 函数中。 
内容：
下面的程序段是一个框架， 若您现在还不知道这些指令的确切意义的话，没关系， 随后我就会给大家详细解释。
.386 .MODEL Flat, STDCALL .DATA &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ...... .DATA? &nbsp;&nbsp; &nbsp;&nbsp; ...... .CONST &nbsp;&nbsp; &nbsp;&nbsp; ...... .CODE &nbsp;&nbsp; &nbsp;&nbsp;&]]></description>
		<author><![CDATA[亚特兰帝斯]]></author>
		<pubDate>2005-09-21 10:43:00</pubDate>
		</item>
		</channel>
</rss>