<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[星夜听泉]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[资料积累(一个角落，不经常访问)（大部分资料为转摘，感兴趣的，也可以方便大家，本人技术积累较少，如有交流需要，请联系QQ147007073）]]></description>
<link>http://hi.baidu.com/yangchengbo82</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[VC++ 中的多线程编程技术]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/b3cc3c6067ddbad78cb10d1f.html]]></link>
        <description><![CDATA[
		
		<p>一、引言</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Windows系统平台经历了从16位到32位的转变后，系统运行方式和任务管理方式有了很大的变化，在Windows 95和Windows NT中，每个Win32程序在独立的进程空间上运行，32位地址空间使我们从16位段式结构的64K段限制中摆脱出来，逻辑上达到了4G的线性地址空间。这样，我们在设计程序时就不再需要考虑编译的段模式，同时还提高了大程序的运行效率。独立进程空间的另一个更大的优越性是大大提高了系统的稳定性，一个应用程序的异常错误不会影响其它的应用程序，这对于现在的桌面环境尤为重要。</p>
<p>　　在Windows的一个进程内，包含一个或多个线程。线程是指进程的一条执行路径，它包含独立的堆栈和CPU寄存器状态，每个线程共享所有的进程资源，包括打开的文件、信号标识及动态分配的内存等等。一个进程内的所有线程使用同一个32位地址空间，而这些线程的执行由系统调度程序控制，调度程序决定哪个线程可执行以及什么时候执行线程。线程有优先级别，优先权较低的线程必须等到优先权较高的线程执行完任务后再执行。在多处理器的机器上，调度程序可将多个线程放到不同的处理器上去运行，这样就可使处理器的任务平衡，也提高了系统的运行效率。</p>
<p>　　32位Windows环境下的Win32 API提供了多线程应用程序开发所需要的接口函数，但Win16和Win32对多线程应用并不支持，利用Visual C++ 5.0中提供的标准C库也可以开发多线程应用程序，而相应的MFC4.21类库则封装了多线程编程的类，因而用户在开发时可根据应用程序的需要和特点选择相应的工具。</p>
<p>　　如果用户的应用程序需要有多个任务同时进行相应的处理，则使用多线程是较理想的选择。例如，就网络文件服务功能的应用程序而言，若采用单线程编程方法，则需要循环检查网络的连接、磁盘驱动器的状况，并在适当的时候显示这些数据，必须等到一遍查询后才能刷新数据的显示。对使用者来说，延迟可能很长。而在应用多线程的情况下可将这些任务分给多个线程，一个线程负责检查网络，另一个线程管理磁盘驱动器，还有一个线程负责显示数据，三个线程结合起来共同完成文件服务，使用者也可以及时看到网络的变化。多线程应用范围很广，尤其是在目前的桌面平台上，系统的许多功能如网络(Internet)、打印、字处理、图形图像、动画和文件管理都在一个系统下运行，更需要我们的应用程序能够同时处理多个事件，而这些正是多线程可以实现的。本文讲述了利用Visual C++ 5.0进行多线程开发的编程技术。</p>
<p>　　二、基于Visual C++的多线程编程</p>
<p>　　Visual C++ 5.0提供了Windows应用程序的集成开发环境Developer Studio。在这个环境里，用户既可以编写C风格的32位Win32应用程序，也可以利用MFC类库编写C++风格的应用程序，二者各有其优点：基于Win32的应用程序执行代码小巧，运行效率高，但要求程序员编写的代码较多，且需要管理所有系统提供给程序的资源；而基于MFC类库的应用程序可以快速建立起应用程序，类库为程序员提供了大量的封装类，而且Developer Studio为程序员提供了一些工具来管理用户源程序，其缺点是类库代码很庞大，应用程序的执行代码离不开这些代码。由于使用类库所带来的快速、简捷和功能强大等优越性，因此，除非有特殊的需要，否则Visual C++提倡使用MFC类库进行应用程序开发。</p>
<p>　　多线程的编程在Win32方式下和MFC类库支持下的原理是一致的，进程的主线程在任何需要的时候都可以创建新的线程。当线程执行完任务后，自动中止线程；当进程结束后，所有的线程都中止。所有活动的线程共享进程的资源。因此，在编程时需要考虑在多个线程访问同一资源时产生冲突的问题：当一个线程正在访问一个进程对象时，另一个线程要改变该对象，这时可能会产生错误的结果。所以，程序员编程时要解决这种冲突。</p>
<p>　　下面给大家介绍一下在Win32 基础上进行多线程编程的过程。</p>
<p>　　1.用Win32函数创建和中止线程</p>
<p>　　Win32函数库中提供了多线程控制的操作函数，包括创建线程、中止线程、建立互斥区等。首先，在应用程序的主线程或者其它活动线程的适当地方创建新的线程。创建线程的函数如下：</p>
<p>　　HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId );</p>
<p>　　其中，参数lpThreadAttributes 指定了线程的安全属性，在Windows 95中被忽略；dwStackSize 指定了线程的堆栈深度；lpStartAddress 指定了线程的起始地址，一般情况为下面的原型函数：DWORD WINAPI ThreadFunc( LPVOID );lpParameter指定了线程执行时传送给线程的32位参数，即上面函数的参数；dwCreationFlags指定了线程创建的特性； lpThreadId 指向一个DWORD变量，可返回线程ID值。</p>
<p>　　如果创建成功则返回线程的句柄，否则返回NULL。</p>
<p>　　创建了新的线程后，则该线程就开始启动执行了。如果在dwCreationFlags中用了CREATE_SUSPENDED特性，那么线程并不马上执行，而是先挂起，等到调用ResumeThread后才开始启动线程，在这个过程中可以调用函数：</p>
<p>　　BOOL SetThreadPriority( HANDLE hThread, int nPriority);</p>
<p>　　来设置线程的优先权。</p>
<p>　　当线程的函数返回后，线程自动中止。如果在线程的执行过程中中止的话，则可调用函数：</p>
<p>　　VOID ExitThread( DWORD dwExitCode);</p>
<p>　　如果在线程的外面中止线程的话，则可调用下面的函数：</p>
<p>　　BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode );</p>
<p>　　但应注意：该函数可能会引起系统不稳定，而且线程所占用的资源也不释放。因此，一般情况下，建议不要使用该函数。</p>
<p>　　如果要中止的线程是进程内的最后一个线程，则在线程被中止后相应的进程也应中止。</p>
<p>　　2.用Win32函数控制线程对共享资源的访问</p>
<p>　　在线程体内，如果该线程完全独立，与其它的线程没有数据存取等资源操作上的冲突，则可按照通常单线程的方法进行编程。但是，在多线程处理时情况常常不是这样，线程之间经常要同时访问一些资源。例如，一个线程负责公式计算，另一个线程负责结果的显示，两个线程都要访问同一个结果变量。这时如果不进行冲突控制的话，则很可能显示的是不正确的结果。</p>
<p>　　对共享资源进行访问引起冲突是不可避免的，但我们可用以下办法来进行操作控制：</p>
<p>　　(1) 通过设置线程的互斥体对象，在可能冲突的地方进行同步控制。</p>
<p>　　首先，建立互斥体对象，得到句柄：</p>
<p>　　HANDLE CreateMutex( );</p>
<p>　　然后，在线程可能冲突区域的开始（即访问共享资源之前），调用WaitForSingleObject将句柄传给函数，请求占用互斥体对象：</p>
<p>　　dwWaitResult = WaitForSingleObject(hMutex, 5000L);</p>
<p>　　共享资源访问完后，释放对互斥体对象的占用：</p>
<p>　　ReleaseMutex(hMutex);</p>
<p>　　互斥体对象在同一时刻只能被一个线程占用。当互斥体对象被一个线程占用时，若有另一线程想占用它，则必须等到前一线程释放后才能成功。</p>
<p>　　(2) 设置信号：在操作共享资源前，打开信号；完成操作后，关闭信号。这类似于互斥体对象的处理。</p>
<p>　　首先，创建信号对象：</p>
<p>　　HANDLE CreateSemaphore( );</p>
<p>　　或者打开一个信号对象：</p>
<p>　　HANDLE OpenSemaphore( );</p>
<p>　　然后，在线程的访问共享资源之前调用WaitForSingleObject。</p>
<p>　　共享资源访问完后，释放对信号对象的占用：</p>
<p>　　ReleaseSemaphore();</p>
<p>　　信号对象允许同时对多个线程共享资源的访问，在创建对象时指定最大可同时访问的线程数。当一个线程申请访问成功后，信号对象中的计数器减一；调用ReleaseSemaphore函数后，信号对象中的计数器加一。其中，计数器值大于等于0，小于等于创建时指定的最大值。利用信号对象，我们不仅可以控制共享资源的访问，还可以在应用的初始化时候使用。假定一个应用在创建一个信号对象时，将其计数器的初始值设为0，这样就阻塞了其它线程，保护了资源。待初始化完成后，调用ReleaseSemaphore函数将其计数器增加至最大值，进行正常的存取访问。</p>
<p>　　(3) 利用事件对象的状态，进行线程对共享资源的访问。</p>
<p>　　用ResetEvent函数设置事件对象状态为不允许线程通过；用SetEvent函数设置事件对象状态为可以允许线程通过。</p>
<p>　　事件分为手工释放和自动释放。如果是手工释放，则按照上述两函数处理事件的状态；如果是自动释放，则在一个线程结束后，自动清除事件状态，允许其它线程通过。</p>
<p>　　(4) 设置排斥区。在排斥区中异步执行时，它只能在同一进程的线程之间共享资源处理。虽然此时上面介绍的三种方法均可使用，但是，使用排斥区的方法则使同步管理的效率更高；</p>
<p>　　先定义一个CRITICAL_SECTION结构的排斥区对象，在进程使用之前先对对象进行初始化，调用如下函数：</p>
<p>　　VOID InitializeCriticalSection( LPCRITICAL_SECTION );</p>
<p>　　当一个线程使用排斥区时，调用函数：</p>
<p>　　EnterCriticalSection或者TryEnterCriticalSection</p>
<p>　　当要求占用、退出排斥区时，调用函数：</p>
<p>　　LeaveCriticalSection</p>
<p>　　释放对排斥区对象的占用，供其它线程使用。</p>
<p>　　互斥体对象、信号对象和事件对象也可以用于进程间的线程同步操作。在用Win32函数创建了对象时，我们可以指定对象的名字，还可以设置同步对象在子进程的继承性。创建返回的是HANDLE句柄，我们可以用函数DuplicateHandle来复制对象句柄，这样每个进程都可以拥有同一对象的句柄，实现进程之间的线程同步操作。另外，在同一进程内，我们可以用OpenMutex、OpenSemaphore和OpenEvent来获得指定名字的同步对象的句柄。</p>
<p>　　排斥区异步执行的线程同步方法只能用于同一进程的线程之间共享资源处理，但是这种方法的使用效率较高，而且编程也相对简单一些。</p>
<p>　　在Visual C++中，除了利用Win32函数进行多线程同步控制外，如果我们用到了MFC类库，则可利用已经封装成C++类结构的同步对象，使我们的编程更加简捷。</p>
<p>　　三、基于MFC的多线程编程</p>
<p>　　在Visual C++ 5.0附带的MFC 4.21类库中，也提供了多线程编程的支持，基本原理与上面所讲的基于Win32函数的设计一致，但由于MFC对同步对象作了封装，因此对用户编程实现来说更加方便，避免了对象句柄管理上的繁琐工作。更重要的是，在多个窗口线程情况下，MFC中直接提供了用户接口线程的设计。</p>
<p>　　在MFC中，线程分为两种：用户接口线程和辅助线程。用户接口线程常用于接收用户的输入，处理相应的事件和消息。在用户接口线程中，包含一个消息处理循环，其中CWinApp就是一个典型的例子，它从CWinThread派生出来，负责处理用户输入产生的事件和消息。辅助线程常用于任务处理（比如计算）不要求用户输入，对用户而言，它在后台运行。Win32 API并不区分这两种线程的类型，它只是获取线程的起始地址，然后开始执行线程。而MFC则针对不同的用户需要作了分类。如果我们需要编写多个有用户接口的线程的应用程序，则利用Win32 API要写很多的框架代码来完成每个线程的消息事件的处理，而用MFC则可以充分发挥MFC中类的强大功能，还可以使用ClassWizard来帮助管理类的消息映射和成员变量等，我们就可以把精力集中到应用程序的相关代码编写上。</p>
<p>　　辅助线程编程较为简单，设计的思路与上节所讲的基本一致：一个基本函数代表了一个线程，创建并启动线程后，则线程进入运行状态；如果线程用到共享资源，则需要进行资源同步处理。共享资源的同步处理在两种线程模式下完全一致。</p>
<p>　　我们知道：基于MFC的应用程序有一个应用对象，它是CWinApp派生类的对象，该对象代表了应用进程的主线程。当线程执行完(通常是接收到WM_QUIT消息)并退出线程时，由于进程中没有其它线程的存在，故进程也自动结束。类CWinApp从CWinThread派生出来，CWinThread是用户接口线程的基本类。我们在编写用户接口线程时，需要从CWinThread派生我们自己的线程类，ClassWizard可以帮助我们完成这个工作。</p>
<p>　　下面列出编写用户接口线程的基本步骤。</p>
<p>　　1.用ClassWizard派生一个新的类，设置基类为CWinThread</p>
<p>　　注意：类的DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE宏是必需的，因为创建线程时需要动态创建类的对象。根据需要可将初始化和结束代码分别放到类的InitInstance和ExitInstance函数中。如果需要创建窗口，则可在InitInstance函数中完成。</p>
<p>　　2.创建线程并启动线程</p>
<p>　　可以用两种方法来创建用户接口线程。</p>
<p>　　（1）MFC提供了两个版本的AfxBeginThread函数，其中一个用于创建用户接口线程，函数原型如下：</p>
<p>　　 CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, int nPriority, UINT nStackSize , DWORD dwCreateFlags, LPSECURITY_ATTRIBUTES lpSecurityAttrs );</p>
<p>　　其中，参数pThreadClass指定线程的运行类，函数返回线程对象。</p>
<p>　　在创建线程时，可以指定线程先挂起，将参数dwCreateFlags设置为CREATE_SUSPENDED。然后，做一些初试工作，如对变量赋值等。最后，再调用线程类的ResumeThread函数启动线程。</p>
<p>　　函数AfxBeginThread的另一个版本指定一个线程函数并设置相应的参数，其它设置及用法与上述函数基本相同。</p>
<p>　　（2）我们也可以不用AfxBeginThread创建线程，而是分两步完成：首先，调用线程类的构造函数创建一个线程对象；其次，调用CWinThread::CreateThread函数来创建该线程。</p>
<p>　　注意：在这种情况下，在线程类中需要有公有的构造函数以创建其相应的C++对象。</p>
<p>　　线程建立并启动后，则线程在线程函数执行过程中一直有效。如果是线程对象，则在对象被删除之前，先结束线程。CWinThread已经为我们完成了线程结束的工作。</p>
<p>　　3. 同步对象的使用</p>
<p>　　不管是辅助线程还是用户接口线程，在存取共享资源时，都需要保护共享资源，以免引起冲突，造成错误。处理方法类似于Win32 API函数的使用，但MFC为我们提供了几个同步对象C++类，即CSyncObject、CMutex、CSemaphore、CEvent、CCriticalSection。这里，CSyncObject为其它四个类的基类，后四个类分别对应前面所讲的四个Win32 API同步对象。</p>
<p>　　通常，我们在C++对象的成员函数中使用共享资源，或者把共享资源封装在C++类的内部。我们可将线程同步操作封装在对象类的实现函数当中，这样在应用中的线程使用C++对象时，就可以像一般对象一样使用它，简化了使用部分代码的编写，这正是面向对象编程的思想。这样编写的类被称作&ldquo;线程安全类&rdquo;。在设计线程安全类时，首先应根据具体情况在类中加入一个同步对象类数据成员。然后，在类的成员函数中，凡是所有修改公共数据或者读取公共数据的地方均要加入相应的同步调用。一般的处理步骤是：创建一个CSingleLock或者CMultiLock对象，然后调用其Lock函数。当对象结束时，自动在析构函数中调用Unlock函数，当然也可以在任何希望的地方调用Unlock函数。</p>
<p>　　如果不是在特定的C++对象中使用共享资源，而是在特定的函数中使用共享资源（这样的函数称为&ldquo;线程安全函数&rdquo;），那么还是按照前面介绍的办法去做：先建立同步对象，然后调用等待函数，直到可以访问资源，最后释放对同步对象的控制。</p>
<p>　　下面我们讨论四个同步对象分别适用的场合：</p>
<p>　　（1）如果某个线程必须等待某些事件发生后才能存取相应资源，则用CEvent；</p>
<p>　　（2）如果一个应用同时可以有多个线程存取相应资源，则用CSemaphore；</p>
<p>　　（3）如果有多个应用(多个进程)同时存取相应资源，则用CMutex，否则用CCriticalSection。</p>
<p>　　使用线程安全类或者线程安全函数进行编程，比不考虑线程安全的编程要复杂，尤其在进行调试时情况更为复杂，我们必须灵活使用Visual C++提供的调试工具，以保证共享资源的安全存取。线程安全编程的另一缺点是运行效率相对要低些，即使在单个线程运行的情况下也会损失一些效率。所以，我们在实际工作中应具体问题具体分析，以选择合适的编程方法。</p>
<p>　　4. 多线程编程例程分析</p>
<p>　　上面讲述了在Visual C++ 5.0中进行多线程编程的技术要点，为了充分说明这种技术，我们来分析一下Visual C++提供的有关多线程的例程，看看一些多线程元素的典型用法。读者可运行这些例程，以获得多线程运行的直观效果。</p>
<p>　　（1）MtRecalc</p>
<p>　　例程MtRecalc的功能是在一个窗口中完成简单的加法运算，用户可输入加数和被加数，例程完成两数相加。用户可通过菜单选择单线程或用辅助线程来做加法运算。如果选择辅助线程进行加法运算，则在进行运算的过程中，用户可继续进行一些界面操作，如访问菜单、编辑数值等，甚至可以中止辅助运算线程。为了使其效果更加明显，例程在计算过程中使用了循环和延时，模拟一个复杂的计算过程。</p>
<p>　　在程序的CRecalcDoc类中，用到了一个线程对象和四个同步事件对象：</p>
<p>　　CWinThread* m_pRecalcWorkerThread;</p>
<p>　　 HANDLE m_hEventStartRecalc;</p>
<p>　　 HANDLE m_hEventRecalcDone;</p>
<p>　　 HANDLE m_hEventKillRecalcThread;</p>
<p>　　 HANDLE m_hEventRecalcThreadKilled;</p>
<p>当用户选择了菜单项Worker Thread后，多线程功能才有效。这时，或者选择菜单项Recalculate Now，或者在窗口中的编辑控制转移焦点时，都会调用函数：</p>
<p>　　void CRecalcDoc::UpdateInt1AndInt2(int n1, int n2, BOOL bForceRecalc);</p>
<p>　　在多线程的情况下，还会调用下面的CRecalcDoc::RecalcInSecondThread函数：</p>
<p>　　void CRecalcDoc::RecalcInSecondThread()</p>
<p>　　{</p>
<p>　　 if (m_pRecalcWorkerThread == NULL)</p>
<p>　　 {</p>
<p>　　 m_pRecalcWorkerThread =</p>
<p>　　 AfxBeginThread(RecalcThreadProc, &amp;m_recalcThreadInfo);</p>
<p>　　 }</p>
<p>　　 m_recalcThreadInfo.m_nInt1 = m_nInt1;</p>
<p>　　 m_recalcThreadInfo.m_nInt2 = m_nInt2;</p>
<p>　　 POSITION pos = GetFirstViewPosition();</p>
<p>　　 CView* pView = GetNextView(pos);</p>
<p>　　 m_recalcThreadInfo.m_hwndNotifyRecalcDone = pView-&gt;m_hWnd;</p>
<p>　　 m_recalcThreadInfo.m_hwndNotifyProgress = AfxGetMainWnd()-&gt;m_hWnd;</p>
<p>　　 m_recalcThreadInfo.m_nRecalcSpeedSeconds = m_nRecalcSpeedSeconds;</p>
<p>　　 SetEvent(m_hEventRecalcDone);</p>
<p>　　 ResetEvent(m_hEventKillRecalcThread);</p>
<p>　　 ResetEvent(m_hEventRecalcThreadKilled);</p>
<p>　　 SetEvent(m_hEventStartRecalc);</p>
<p>　　}</p>
<p>　　上面加粗的语句是与多线程直接相关的代码，应用程序调用AfxBeginThread启动了线程，把m_recalcThreadInfo作为参数传给线程函数。函数中最后的四行语句设置了四个事件对象的状态，这些事件对象在文档类的构造函数中创建。下面是实际的运算线程函数：</p>
<p>　　UINT RecalcThreadProc(LPVOID pParam)</p>
<p>　　{</p>
<p>　　 CRecalcThreadInfo* pRecalcInfo = (CRecalcThreadInfo*)pParam;</p>
<p>　　 BOOL bRecalcCompleted;</p>
<p>　　 while (TRUE)</p>
<p>　　 {</p>
<p>　　 bRecalcCompleted = FALSE;</p>
<p>　　 if (WaitForSingleObject(pRecalcInfo-&gt;m_hEventStartRecalc, INFINITE)</p>
<p>　　 != WAIT_OBJECT_0)</p>
<p>　　 break;</p>
<p>　　 if (WaitForSingleObject(pRecalcInfo-&gt;m_hEventKillRecalcThread, 0)</p>
<p>　　 WAIT_OBJECT_0)</p>
<p>　　 break; // Terminate this thread by existing the proc.</p>
<p>　　 ResetEvent(pRecalcInfo-&gt;m_hEventRecalcDone);</p>
<p>　　 bRecalcCompleted = SlowAdd(pRecalcInfo-&gt;m_nInt1,</p>
<p>　　 pRecalcInfo-&gt;m_nInt2,</p>
<p>　　 pRecalcInfo-&gt;m_nSum,</p>
<p>　　 pRecalcInfo,</p>
<p>　　 pRecalcInfo-&gt;m_nRecalcSpeedSeconds,</p>
<p>　　 pRecalcInfo-&gt;m_hwndNotifyProgress);</p>
<p>　　 SetEvent(pRecalcInfo-&gt;m_hEventRecalcDone);</p>
<p>　　 if (!bRecalcCompleted) // If interrupted by kill then...</p>
<p>　　 break; // terminate this thread by exiting the proc.</p>
<p>　　 ::PostMessage(pRecalcInfo-&gt;m_hwndNotifyRecalcDone, WM_USER_RECALC_DONE, 0, 0);</p>
<p>　　 }</p>
<p>　　 if (!bRecalcCompleted)</p>
<p>　　 SetEvent(pRecalcInfo-&gt;m_hEventRecalcThreadKilled);</p>
<p>　　 return 0;</p>
<p>　　 }</p>
<p>　　</p>
<p>　　BOOL SlowAdd(int nInt1, int nInt2, int&amp; nResult, CRecalcThreadInfo* pInfo, int nSeconds,HWND hwndNotifyProgress)</p>
<p>　　{</p>
<p>　　 CWnd* pWndNotifyProgress = CWnd::FromHandle(hwndNotifyProgress);</p>
<p>　　 BOOL bRestartCalculation = TRUE;</p>
<p>　　 while (bRestartCalculation)</p>
<p>　　 {</p>
<p>　　 bRestartCalculation = FALSE;</p>
<p>　　 for (int nCount = 1; nCount &lt;20; nCount++)</p>
<p>　　 {</p>
<p>　　 if (pInfo != NULL</p>
<p>　　 &amp;&amp; WaitForSingleObject(pInfo-&gt;m_hEventKillRecalcThread, 0) == WAIT_OBJECT_0)</p>
<p>　　 {</p>
<p>　　 if (hwndNotifyProgress != NULL)</p>
<p>　　 {</p>
<p>　　 pWndNotifyProgress-&gt;PostMessage( WM_USER_RECALC_IN_PROGRESS);</p>
<p>　　 }</p>
<p>　　 return FALSE; // Terminate this recalculation</p>
<p>　　 }</p>
<p>　　 if (pInfo != NULL</p>
<p>　　 &amp;&amp;WaitForSingleObject(pInfo-&gt;m_hEventStartRecalc, 0) == WAIT_OBJECT_0)</p>
<p>　　 {</p>
<p>　　 nInt1 = pInfo-&gt;m_nInt1;</p>
<p>　　 nInt2 = pInfo-&gt;m_nInt2;</p>
<p>　　 bRestartCalculation = TRUE;</p>
<p>　　 continue;</p>
<p>　　 }</p>
<p>　　 // update the progress indicator</p>
<p>　　 Sleep(nSeconds * 50);</p>
<p>　　 }</p>
<p>　　 // update the progress indicator</p>
<p>　　 }</p>
<p>　　 nResult = nInt1 + nInt2;</p>
<p>　　 return TRUE;</p>
<p>　　}</p>
<p>　　上面的代码充分显示了几个事件对象的用法。当线程刚启动时，先等待m_hEventStartRecalc的状态为允许，然后检查m_hEventKillRecalcThread事件对象的状态。注意这两个等待函数调用的第二个参数的区别：在进入计算函数之前，设置m_hEventRecalcDone事件为不允许状态；待计算结束后，将其设置为允许状态。在计算函数的处理过程中，循环检查事件m_hEventKillRecalcThread和m_hEventStartRecalc的状态，如果m_hEventKillRecalcThread事件允许，则退出线程，中止计算。</p>
<p>　　当计算线程在计算时，主线程可继续接受用户输入（包括菜单选择）。用户可通过菜单项中止计算线程。中止线程的处理比较简单，代码如下：</p>
<p>　　void CRecalcDoc::OnKillWorkerThread()</p>
<p>　　{</p>
<p>　　 SetEvent(m_hEventKillRecalcThread);</p>
<p>　　 SetEvent(m_hEventStartRecalc);</p>
<p>　　 WaitForSingleObject(m_hEventRecalcThreadKilled, INFINITE);</p>
<p>　　 m_pRecalcWorkerThread = NULL;</p>
<p>　　 m_bRecalcInProgress = FALSE; // but m_bRecalcNeeded is still TRUE</p>
<p>　　 UpdateAllViews(NULL, UPDATE_HINT_SUM);</p>
<p>　　}</p>
<p>　　通过设置m_hEventKillRecalcThread事件对象，计算线程的循环就会检测到该事件的状态，最终引起线程的退出。注意：线程的中止因函数的退出而自然中止，而没有用强行办法中止，这样可保证系统的安全性。另外，在程序的很多地方使用了PostMessage来更新计算进度的指示，使用PostMessage函数发送消息可立即返回，无需等待，这样就避免了阻塞，比较符合多线程编程的思想，建议读者使用这种消息发送方法。尤其是在多个UI线程编程时，用这种方法更合适。</p>
<p>　　（2）MtMDI</p>
<p>　　 例程MtMDI是一个MDI应用，每一个子窗口是一个用户接口线程，子窗口里有一个来回弹跳的小球，小球的运动由计时器控制，此处不加以讨论。下面，我们来看看UI线程的创建过程以及它与MDI的结合。</p>
<p>　　通过菜单命令New Bounce，可在主框架窗口类中响应菜单命令，函数代码如下：</p>
<p>　　void CMainFrame::OnBounce()</p>
<p>　　{</p>
<p>　　 CBounceMDIChildWnd *pBounceMDIChildWnd = new CBounceMDIChildWnd;</p>
<p>　　 if (!pBounceMDIChildWnd-&gt;Create( _T(&quot;Bounce&quot;),</p>
<p>　　 WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW, rectDefault, this))</p>
<p>　　 return;</p>
<p>　　}</p>
<p>　　函数调用子框架窗口的创建函数，代码如下：</p>
<p>　　BOOL CBounceMDIChildWnd::Create(LPCTSTR szTitle, LONG style, const RECT&amp; rect, CMDIFrameWnd* parent)</p>
<p>　　{</p>
<p>　　 // Setup the shared menu</p>
<p>　　 if (menu.m_hMenu == NULL)</p>
<p>　　 menu.LoadMenu(IDR_BOUNCE);</p>
<p>　　 m_hMenuShared = menu.m_hMenu;</p>
<p>　　 if (!CMDIChildWnd::Create(NULL, szTitle, style, rect, parent))</p>
<p>　　 return FALSE;</p>
<p>　　 CBounceThread* pBounceThread = new CBounceThread(m_hWnd);</p>
<p>　　 pBounceThread-&gt;CreateThread();</p>
<p>　　 return TRUE;</p>
<p>　　}</p>
<p>　　当CBounceMDIChildWnd子窗口被删除时，Windows会同时删除CBounceWnd窗口(内嵌在线程对象pBounceThread中)，因为它是CBounceMDIChildWnd的子窗口。由于CBounceWnd运行在单独的线程中，故当CBounceWnd子窗口被删除时，CWinThread线程对象也会自动被删除。</p>
<p>　　上述函数生成一个新的UI线程对象pBounceThread，并调用CreateThread函数创建线程。至此，线程已被创建，但还需要做初始化工作，如下面的函数InitInstance所示：</p>
<p>　　int CBounceThread::InitInstance()</p>
<p>　　{</p>
<p>　　 CWnd* pParent = CWnd::FromHandle(m_hwndParent);</p>
<p>　　 CRect rect;</p>
<p>　　 pParent-&gt;GetClientRect(&amp;rect);</p>
<p>　　 BOOL bReturn = m_wndBounce.Create(_T(&quot;BounceMTChildWnd&quot;),WS_CHILD | WS_VISIBLE, rect, pParent);</p>
<p>　　 if (bReturn)</p>
<p>　　 m_pMainWnd = &amp;m_wndBounce;</p>
<p>　　 return bReturn;</p>
<p>　　}</p>
<p>　　注意：这里，将m_pMainWnd设置为新创建的CBounceWnd窗口是必需的。只有这样设置了，才能保证当CBounceWnd窗口被删除时，线程会被自动删除。</p>
<p>　　（3）Mutexes</p>
<p>　　例程Mutexes是一个对话框程序。除主线程外，还有两个线程：一个用于计数，一个用于显示。在本例中，这两个线程都是从CWinThread派生出来的，但并不用于消息循环处理，派生类重载了Run函数，用于完成其计数和显示的任务。</p>
<p>　　在对话框类中使用了一个内嵌的CMutex对象。对话框初始化时创建两个线程，并设置相应的参数，然后启动运行两个线程。</p>
<p>　　当用户设置了对话框的同步检查框标记后，两个线程的同步处理有效。在计数线程的循环中，先调用CSingleLock::Lock函数，然后进行计数修改，最后调用CSingleLock::Unlock函数。注意：这里的CSingleLock对象根据主对话框的CMutex对象产生。在显示线程的循环中，先调用CSingleLock::Lock函数，然后取到计数值，最后调用CSingleLock::Unlock函数。注意：这里的CSingleLock对象也是由主对话框的CMutex对象产生。类似这种情况:一个线程要读取数据，另一个线程要修改数据，这是我们在处理多线程问题时碰到的最典型的情况。此处采用的方法也具有典型意义。源代码可通过查看例程或通过联机帮助来获取。</p>
<p>　　五、结束语</p>
<p>　　多线程函数是Win32不同于Win16的一个重要方面，其编程技术较为新颖，在程序设计思路上不同于传统的模块结构化方法，比一般的面向对象的思路也较为复杂，尤其是对于多处理器平台的处理更为复杂。要设计出性能良好的多线程程序，不仅需要对操作系统的处理过程很清楚，还需要对具体应用有一个全面的认识，并对应用中各线程部分的关系非常清楚，对同步模块中的同步对象的具体含义应尽可能地清晰明了，以利于在程序中控制同步事件的发生，避免出现死锁或不能同步处理的现象。</p>
<p>　　在其它的开发语言（如Visual Basic 5.0）中也提供了对多线程的支持，但从性能和安全的角度考虑，这种多线程支持受到较多的限制。不过，就一般应用而言，用这种处理方法已经足够了。</p>
<p>　　目前，大多数的计算机都是单处理器(CPU)的，在这种机器上运行多线程程序，有时反而会降低系统的性能。如果两个非常活跃的线程为了抢夺对CPU的控制权，则在线程切换时会消耗很多的CPU资源，但对于大部分时间被阻塞的线程（例如等待文件I/O操作），则可用一个单独的线程来完成。这样，就可将CPU时间让出来，使程序获得更好的性能。因此，在设计多线程应用程序时，应慎重选择，并且视具体情况加以处理，使应用程序获得最佳的性能。<br>
　</p>
<p> </p> <a href="http://hi.baidu.com/yangchengbo82/blog/item/b3cc3c6067ddbad78cb10d1f.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/b3cc3c6067ddbad78cb10d1f.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-02  15:26</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/b3cc3c6067ddbad78cb10d1f.html</guid>
</item>

<item>
        <title><![CDATA[ARM汇编指令集]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/030951ada468e9014a36d6e9.html]]></link>
        <description><![CDATA[
		
		<p>一、 跳转指令&nbsp;&nbsp;&nbsp;  跳转指令用于实现程序流程的跳转，在ARM程序中有两种方法可以实现程序流程的跳转：<br>
Ⅰ.使用专门的跳转指令。<br>
Ⅱ.直接向程序计数器PC写入跳转地址值。<br>
通过向程序计数器PC写入跳转地址值，可以实现在4GB的地址空间中的任意跳转，在跳转之前结合使用<br>
MOV LR，PC<br>
等类似指令，可以保存将来的返回地址值，从而实现在4GB连续的线性地址空间的子程序调用。<br>
&nbsp;&nbsp;&nbsp;  ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转，包括以下4条指令：<br>
1、  B指令<br>
B指令的格式为：<br>
B{条件}  目标地址<br>
B指令是最简单的跳转指令。一旦遇到一个 B 指 令，ARM 处理器将立即跳转到给定的目标地址，从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量，而不是一个绝对地址，它的值由汇编器来 计算（参考寻址方式中的相对寻址）。它是 24 位有符号数，左移两位后有符号扩展为 32 位，表示的有效偏移为 26 位(前后32MB的地址空间)。以下指令：<br>
B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Label&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；程序无条件跳转到标号Label处执行<br>
&nbsp;&nbsp;&nbsp;&nbsp;  CMP R1，＃0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；当CPSR寄存器中的Z条件码置位时，程序跳转到标号Label处执行<br>
BEQ Label&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
2、  BL指令<br>
BL指令的格式为：<br>
BL{条件} 目标地址<br>
BL 是另一个跳转指令，但跳转之前，会在寄存器R14中保存PC的当前内容，因此，可以通过将R14 的内容重新加载到PC中，来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令：<br>
&nbsp;&nbsp;  BL&nbsp;&nbsp;  Label&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；当程序无条件跳转到标号Label处执行时，同时将当前的PC值保存<br>
到R14中<br>
3、  BLX指令<br>
BLX指令的格式为：<br>
BLX  目标地址<br>
BLX指令从ARM指令集跳转到指令中所指定的目标地址，并将处理器的工作状态有ARM状态切换到Thumb状态，该指令同时将PC的当前内容保存到寄存器R14中。因此，当子程序使用Thumb指令集，而调用者使用ARM指令集时，可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时，子程序的返回可以通过将寄存器R14值复制到PC中来完成。<br>
4、  BX指令<br>
BX指令的格式为：<br>
BX{条件}  目标地址<br>
BX指令跳转到指令中所指定的目标地址，目标地址处的指令既可以是ARM指令，也可以是Thumb指令。<br>
二、数据处理指令数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。<br>
数据传送指令用于在寄存器和存储器之间进行数据的双向传输。<br>
算术逻辑运算指令完成常用的算术与逻辑的运算，该类指令不但将运算结果保存在目的寄存器中，同时更新CPSR中的相应条件标志位。<br>
比较指令不保存运算结果，只更新CPSR中相应的条件标志位。<br>
数据处理指令共以下16条。<br>
1、&nbsp;&nbsp;&nbsp;  MOV指令<br>
MOV指令的格式为：<br>
MOV{条件}{S} 目的寄存器，源操作数<br>
MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值，当没有S时指令不更新CPSR中条件标志位的值。<br>
指令示例：<br>
MOV R1，R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R0的值传送到寄存器R1<br>
MOV PC，R14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R14的值传送到PC，常用于子程序返回<br>
MOV R1，R0，LSL＃3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R0的值左移3位后传送到R1<br>
2、  MVN指令<br>
MVN指令的格式为：<br>
MVN{条件}{S} 目的寄存器，源操作数<br>
MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即 数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了，即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条 件标志位的值，当没有S时指令不更新CPSR中条件标志位的值。<br>
指令示例：<br>
MVN  R0，＃0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将立即数0取反传送到寄存器R0中，完成后R0=-1<br>
3、  CMP指令<br>
CMP指令的格式为：<br>
CMP{条件} 操作数1，操作数2<br>
CMP指令用于把 一个寄存器的内容和另一个寄存器的内容或立即数进行比较，同时更新CPSR中条件标志位的值。该指令进行一次减法运算，但不存储结果，只更改条件标志位。 标志位表示的是操作数1与操作数2的关系(大、小、相等)，例如，当操作数1大于操作操作数2，则此后的有GT 后缀的指令将可以执行。<br>
指令示例：<br>
CMP&nbsp;&nbsp;&nbsp;  R1，R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R1的值与寄存器R0的值相减，并根据<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  结果设置CPSR的标志位<br>
CMPR1，＃100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R1的值与立即数100相减，并根据结果<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  设置CPSR的标志位<br>
4、  CMN指令<br>
CMN指令的格式为：<br>
CMN{条件} 操作数1，操作数2<br>
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较，同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加，并根据结果更改条件标志位。<br>
指令示例：<br>
CMN&nbsp;&nbsp;&nbsp;  R1，R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R1的值与寄存器R0的值相加，并根据结果<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  设置CPSR的标志位<br>
&nbsp;&nbsp;  CMNR1，＃100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R1的值与立即数100相加，并根据结果设置<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  CPSR的标志位<br>
5、  TST指令<br>
TST指令的格式为：<br>
TST{条件} 操作数1，操作数2<br>
TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算，并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据，而操作数2是一个位掩码，该指令一般用来检测是否设置了特定的位。<br>
指令示例：<br>
TST&nbsp;&nbsp;&nbsp;  R1，＃％1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；用于测试在寄存器R1中是否设置了最低位（％表示二进制数）<br>
TSTR1，＃0xffe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R1的值与立即数0xffe按位与，并根据结果设置CPSR<br>
的标志位<br>
6、  TEQ指令<br>
TEQ指令的格式为：<br>
TEQ{条件} 操作数1，操作数2<br>
TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算，并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。<br>
指令示例：<br>
TEQ&nbsp;&nbsp;  R1，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R1的值与寄存器R2的值按位异或，并根据<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  结果设置CPSR的标志位<br>
7、  ADD指令<br>
ADD指令的格式为：<br>
ADD{条件}{S} 目的寄存器，操作数1，操作数2<br>
ADD指令用于把两个操作数相加，并将结果存放到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位的寄存器，或一个立即数。<br>
指令示例：<br>
ADD&nbsp;&nbsp;&nbsp;&nbsp;  R0，R1，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R1 + R2<br>
ADD&nbsp;&nbsp;&nbsp;&nbsp;  R0，R1，#256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R1 + 256<br>
ADD&nbsp;&nbsp;&nbsp;&nbsp;  R0，R2，R3，LSL#1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R2 + (R3 &lt;&lt; 1)<br>
8、  ADC指令<br>
ADC指令的格式为：<br>
ADC{条件}{S} 目的寄存器，操作数1，操作数2<br>
ADC指令用于把两个操作数相加，再加上CPSR中的C条件标志位的值，并将结果存放到目的寄存器中。它使用一个进位标志位，这样就可以做比32位大的数的加法，注意不要忘记设置S后缀来更改进位标志。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位的寄存器，或一个立即数。<br>
以下指令序列完成两个128位数的加法，第一个数由高到低存放在寄存器R7～R4，第二个数由高到低存放在寄存器R11～R8，运算结果由高到低存放在寄存器R3～R0：<br>
ADDS&nbsp;&nbsp;&nbsp;&nbsp;  R0，R4，R8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； 加低端的字<br>
ADCS&nbsp;&nbsp;&nbsp;  R1，R5，R9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； 加第二个字，带进位<br>
ADCS&nbsp;&nbsp;&nbsp;  R2，R6，R10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； 加第三个字，带进位<br>
ADC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  R3，R7，R11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； 加第四个字，带进位<br>
9、  SUB指令<br>
SUB指令的格式为：<br>
SUB{条件}{S} 目的寄存器，操作数1，操作数2<br>
SUB指令用于把操作数1减去操作数2，并将结果存放到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位的寄存器，或一个立即数。该指令可用于有符号数或无符号数的减法运算。<br>
指令示例：<br>
SUB&nbsp;&nbsp;&nbsp;&nbsp;  R0，R1，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R1 - R2<br>
SUB&nbsp;&nbsp;&nbsp;&nbsp;  R0，R1，#256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R1 - 256<br>
SUB&nbsp;&nbsp;&nbsp;&nbsp;  R0，R2，R3，LSL#1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R2 - (R3 &lt;&lt; 1)<br>
10、~~~~C指令<br>
~~~~C指令的格式为：<br>
~~~~C{条件}{S} 目的寄存器，操作数1，操作数2<br>
~~~~C指令用于把 操作数1减去操作数2，再减去CPSR中的C条件标志位的反码，并将结果存放到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位 的寄存器，或一个立即数。该指令使用进位标志来表示借位，这样就可以做大于32位的减法，注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或 无符号数的减法运算。<br>
指令示例：<br>
SUBS&nbsp;&nbsp;&nbsp;  R0，R1，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R1 - R2 - ！C，并根据结果设置<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  CPSR的进位标志位<br>
11、R~~~~指令<br>
R~~~~指令的格式为：<br>
R~~~~{条件}{S} 目的寄存器，操作数1，操作数2<br>
R~~~~指令称为逆向减法指令，用于把操作数2减去操作数1，并将结果存放到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位的寄存器，或一个立即数。该指令可用于有符号数或无符号数的减法运算。<br>
指令示例：<br>
R~~~~&nbsp;&nbsp;&nbsp;&nbsp;  R0，R1，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R2 &ndash; R1<br>
R~~~~&nbsp;&nbsp;&nbsp;&nbsp;  R0，R1，#256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = 256 &ndash; R1<br>
R~~~~&nbsp;&nbsp;&nbsp;&nbsp;  R0，R2，R3，LSL#1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = (R3 &lt;&lt; 1) - R2<br>
12、RSC指令<br>
RSC指令的格式为：<br>
RSC{条件}{S} 目的寄存器，操作数1，操作数2<br>
RSC指令用于把 操作数2减去操作数1，再减去CPSR中的C条件标志位的反码，并将结果存放到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位 的寄存器，或一个立即数。该指令使用进位标志来表示借位，这样就可以做大于32位的减法，注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或 无符号数的减法运算。<br>
指令示例：<br>
RSC&nbsp;&nbsp;&nbsp;&nbsp;  R0，R1，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； R0 = R2 &ndash; R1 - ！C<br>
13、AND指令<br>
AND指令的格式为：<br>
AND{条件}{S} 目的寄存器，操作数1，操作数2<br>
AND指令用于在两个操作数上进行逻辑与运算，并把结果放置到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位的寄存器，或一个立即数。该指令常用于屏蔽操作数1的某些位。<br>
指令示例：<br>
AND R0，R0，＃3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； 该指令保持R0的0、1位，其余位清零。<br>
14、ORR指令<br>
ORR指令的格式为：<br>
ORR{条件}{S} 目的寄存器，操作数1，操作数2<br>
ORR指令用于在两个操作数上进行逻辑或运算，并把结果放置到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位的寄存器，或一个立即数。该指令常用于设置操作数1的某些位。<br>
指令示例：<br>
ORR R0，R0，＃3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； 该指令设置R0的0、1位，其余位保持不变。<br>
15、EOR指令<br>
EOR指令的格式为：<br>
EOR{条件}{S} 目的寄存器，操作数1，操作数2<br>
EOR指令用于在两个操作数上进行逻辑异或运算，并把结果放置到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位的寄存器，或一个立即数。该指令常用于反转操作数1的某些位。<br>
指令示例：<br>
EOR R0，R0，＃3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ； 该指令反转R0的0、1位，其余位保持不变。<br>
16、BIC指令<br>
BIC指令的格式为：<br>
BIC{条件}{S} 目的寄存器，操作数1，操作数2<br>
BIC指令用于清除操作数1的某些位，并把结果放置到目的寄存器中。操作数1应是一个寄存器，操作数2可以是一个寄存器，被移位的寄存器，或一个立即数。操作数2为32位的掩码，如果在掩码中设置了某一位，则清除这一位。未设置的掩码位保持不变。<br>
指令示例：<br>
BIC R0，R0，＃％1011&nbsp;&nbsp;&nbsp;  ； 该指令清除 R0 中的位 0、1、和 3，其余的位保持不变。<br>
三、法指令与乘加指令ARM微处理器支持的乘法指令与乘加指令共有6条，可分为运算结果为32位和运算结果为64位两类，与前面的数据处理指令不同，指令中的所有操作数、目的寄存器必须为通用寄存器，不能对操作数使用立即数或被移位的寄存器，同时，目的寄存器和操作数1必须是不同的寄存器。 <br>
乘法指令与乘加指令共有以下6条：<br>
1、  MUL指令<br>
MUL指令的格式为：<br>
MUL{条件}{S} 目的寄存器，操作数1，操作数2<br>
MUL指令完成将操作数1与操作数2的乘法运算，并把结果放置到目的寄存器中，同时可以根据运算结果设置CPSR中相应的条件标志位。其中，操作数1和操作数2均为32位的有符号数或无符号数。<br>
指令示例：<br>
MUL R0，R1，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R0 = R1 × R2<br>
MULS R0，R1，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R0 = R1 × R2，同时设置CPSR中的相关条件标志位<br>
2、  MLA指令<br>
MLA指令的格式为：<br>
MLA{条件}{S} 目的寄存器，操作数1，操作数2，操作数3<br>
MLA指令完成将操作数1与操作数2的乘法运算，再将乘积加上操作数3，并把结果放置到目的寄存器中，同时可以根据运算结果设置CPSR中相应的条件标志位。其中，操作数1和操作数2均为32位的有符号数或无符号数。<br>
指令示例：<br>
MLA R0，R1，R2，R3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R0 = R1 × R2 + R3<br>
MLAS  R0，R1，R2，R3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R0 = R1 × R2 + R3，同时设置CPSR中的相关条件标志位<br>
3、  SMULL指令<br>
SMULL指令的格式为：<br>
SMULL{条件}{S}&nbsp;&nbsp;  目的寄存器Low，目的寄存器低High，操作数1，操作数2<br>
SMULL指令完成将操作数1与操作数2的乘法运算，并把结果的低32位放置到目的寄存器Low中，结果的高32位放置到目的寄存器High中，同时可以根据运算结果设置CPSR中相应的条件标志位。其中，操作数1和操作数2均为32位的有符号数。<br>
指令示例：<br>
SMULL&nbsp;&nbsp;  R0，R1，R2，R3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R0 = （R2 × R3）的低32位<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R1 = （R2 × R3）的高32位<br>
4、  SMLAL指令<br>
SMLAL指令的格式为：<br>
SMLAL{条件}{S}&nbsp;&nbsp;  目的寄存器Low，目的寄存器低High，操作数1，操作数2<br>
SMLAL指令完成将操作数1与操作数2的乘法运算，并把结果的 低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中，结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中，同 时可以根据运算结果设置CPSR中相应的条件标志位。其中，操作数1和操作数2均为32位的有符号数。<br>
对于目的寄存器Low，在指令执行前存放64位加数的低32位，指令执行后存放结果的低32位。<br>
对于目的寄存器High，在指令执行前存放64位加数的高32位，指令执行后存放结果的高32位。<br>
指令示例：<br>
SMLAL&nbsp;&nbsp;  R0，R1，R2，R3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R0 = （R2 × R3）的低32位 ＋ R0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R1 = （R2 × R3）的高32位 ＋ R1<br>
5、  UMULL指令<br>
UMULL指令的格式为：<br>
UMULL{条件}{S}&nbsp;&nbsp;  目的寄存器Low，目的寄存器低High，操作数1，操作数2<br>
UMULL指令完成将操作数1与操作数2的乘法运算，并把结果的低32位放置到目的寄存器Low中，结果的高32位放置到目的寄存器High中，同时可以根据运算结果设置CPSR中相应的条件标志位。其中，操作数1和操作数2均为32位的无符号数。<br>
指令示例：<br>
UMULL&nbsp;&nbsp;  R0，R1，R2，R3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R0 = （R2 × R3）的低32位<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R1 = （R2 × R3）的高32位<br>
6、  UMLAL指令<br>
UMLAL指令的格式为：<br>
UMLAL{条件}{S}&nbsp;&nbsp;  目的寄存器Low，目的寄存器低High，操作数1，操作数2<br>
UMLAL指令完成将操作数1与操作数2的乘法运算，并把结果的 低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中，结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中，同 时可以根据运算结果设置CPSR中相应的条件标志位。其中，操作数1和操作数2均为32位的无符号数。<br>
对于目的寄存器Low，在指令执行前存放64位加数的低32位，指令执行后存放结果的低32位。<br>
对于目的寄存器High，在指令执行前存放64位加数的高32位，指令执行后存放结果的高32位。<br>
指令示例：<br>
UMLAL&nbsp;&nbsp;  R0，R1，R2，R3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R0 = （R2 × R3）的低32位 ＋ R0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；R1 = （R2 × R3）的高32位 ＋ R1<br>
四、程序状态寄存器访问指令1、  MRS指令<br>
MRS指令的格式为：<br>
MRS{条件}&nbsp;&nbsp;&nbsp;  通用寄存器，程序状态寄存器（CPSR或SPSR）<br>
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情况：<br>
Ⅰ.当需要改变程序状态寄存器的内容时，可用MRS将程序状态寄存器的内容读入通用寄存器，修改后再写回程序状态寄存器。<br>
Ⅱ.当在异常处理或进程切换时，需要保存程序状态寄存器的值，可先用该指令读出程序状态寄存器的值，然后保存。<br>
指令示例：<br>
MRS R0，CPSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；传送CPSR的内容到R0<br>
MRS R0，SPSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；传送SPSR的内容到R0<br>
2、  MSR指令<br>
MSR指令的格式为：<br>
MSR{条件}&nbsp;&nbsp;&nbsp;  程序状态寄存器（CPSR或SPSR）_&lt;域&gt;，操作数<br>
MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中，操作数可以为通用寄存器或立即数。&lt;域&gt;用于设置程序状态寄存器中需要操作的位，32位的程序状态寄存器可分为4个域：<br>
位[31：24]为条件标志位域，用f表示；<br>
位[23：16]为状态位域，用s表示；<br>
位[15：8]为扩展位域，用x表示；<br>
位[7：0]为控制位域，用c表示；<br>
该指令通常用于恢复或改变程序状态寄存器的内容，在使用时，一般要在MSR指令中指明将要操作的域。<br>
指令示例：<br>
MSR CPSR，R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；传送R0的内容到CPSR<br>
MSR SPSR，R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；传送R0的内容到SPSR<br>
MSR CPSR_c，R0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；传送R0的内容到SPSR，但仅仅修改CPSR中的控制位域<br>
五、加载/存储指令ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据，加载指令用于将存储器中的数据传送到寄存器，存储指令则完成相反的操作。常用的加载存储指令如下：<br>
1、LDR指令<br>
LDR指令的格式为：<br>
LDR{条件} 目的寄存器，&lt;存储器地址&gt;<br>
LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器，然后对数据进行处理。当程序计数器PC作为目的寄存器时，指令从存储器中读取的字数据被当作目的地址，从而可以实现程序流程的跳转。该指令在程序设计中比较常用，且寻址方式灵活多样，请读者认真掌握。<br>
指令示例：<br>
LDR R0，[R1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1的字数据读入寄存器R0。<br>
LDR R0，[R1，R2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1+R2的字数据读入寄存器R0。LDR R0，[R1，＃8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1+8的字数据读入寄存器R0。<br>
LDR  R0，[R1，R2] ！&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1+R2的字数据读入寄存器R0，<br>
并将新地址R1＋R2写入R1。<br>
LDR R0，[R1，＃8] ！&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1+8的字数据读入寄存器R0，<br>
并将新地址R1＋8写入R1。<br>
LDR  R0，[R1]，R2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1的字数据读入寄存器R0，并<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  将新地址R1＋R2写入R1。<br>
LDR  R0，[R1，R2，LSL＃2]！&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1＋R2×4的字数据读入寄存器<br>
R0，并将新地址R1＋R2×4写入R1。<br>
LDRR0，[R1]，R2，LSL＃2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1的字数据读入寄存器R0，<br>
并将新地址R1＋R2×4写入R1。<br>
2、LDRB指令<br>
LDRB指令的格式为：<br>
LDR{条件}B 目的寄存器，&lt;存储器地址&gt;<br>
LDRB指令用于从存储器中将一个8位的字节数据传送到目的寄存器中，同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器，然后对数据进行处理。当程序计数器PC作为目的寄存器时，指令从存储器中读取的字数据被当作目的地址，从而可以实现程序流程的跳转。<br>
指令示例：<br>
LDRB  R0，[R1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1的字节数据读入寄存器R0，并<br>
将R0的高24位清零。<br>
LDRB R0，[R1，＃8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1＋8的字节数据读入寄存器<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  R0，并将R0的高24位清零。<br>
3、LDRH指令<br>
LDRH指令的格式为：<br>
LDR{条件}H 目的寄存器，&lt;存储器地址&gt;<br>
LDRH指令用于从存储器中将一个16位的半字数据传送到目的寄存器中，同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器，然后对数据进行处理。当程序计数器PC作为目的寄存器时，指令从存储器中读取的字数据被当作目的地址，从而可以实现程序流程的跳转。<br>
指令示例：<br>
  LDRH&nbsp;&nbsp;  R0，[R1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1的半字数据读入寄存器R0，并<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  将R0的高16位清零。<br>
LDRH&nbsp;&nbsp;  R0，[R1，＃8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1＋8的半字数据读入寄存器R0，<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  并将R0的高16位清零。<br>
LDRHR0，[R1，R2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将存储器地址为R1＋R2的半字数据读入寄存器<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  R0，并将R0的高16位清零。<br>
4、STR指令<br>
STR指令的格式为：<br>
STR{条件} 源寄存器，&lt;存储器地址&gt;<br>
STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用，且寻址方式灵活多样，使用方式可参考指令LDR。<br>
指令示例：<br>
STR R0，[R1]，＃8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R0中的字数据写入以R1为地址的存储器中，并<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  将新地址R1＋8写入R1。<br>
STR R0，[R1，＃8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R0中的字数据写入以R1＋8为地址的存储器中。<br>
5、STRB指令<br>
STRB指令的格式为：<br>
STR{条件}B 源寄存器，&lt;存储器地址&gt;<br>
STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。<br>
指令示例：<br>
STRB&nbsp;&nbsp;&nbsp;  R0，[R1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R0中的字节数据写入以R1为地址的存储<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  器中。<br>
STRB&nbsp;&nbsp;&nbsp;  R0，[R1，＃8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R0中的字节数据写入以R1＋8为地址的<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  存储器中。<br>
6、STRH指令<br>
STRH指令的格式为：<br>
STR{条件}H 源寄存器，&lt;存储器地址&gt;<br>
STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。<br>
指令示例：<br>
&nbsp;&nbsp;&nbsp;  STRH&nbsp;&nbsp;  R0，[R1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R0中的半字数据写入以R1为地址的存储器中。<br>
STRH&nbsp;&nbsp;  R0，[R1，＃8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器R0中的半字数据写入以R1＋8为地址的存储器中。<br>
六、批量数据加载/存储指令ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据，批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器，批量数据存储指令则完成相反的操作。常用的加载存储指令如下：<br>
LDM（或STM）指令<br>
LDM（或STM）指令的格式为：<br>
LDM（或STM）{条件}{类型} 基址寄存器{！}，寄存器列表{∧}<br>
LDM（或STM）指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据，该指令的常见用途是将多个寄存器的内容入栈或出栈。其中，{类型}为以下几种情况：<br>
IA&nbsp;&nbsp;  每次传送后地址加1；<br>
IB&nbsp;&nbsp;  每次传送前地址加1；<br>
DA&nbsp;&nbsp;  每次传送后地址减1；<br>
DB&nbsp;&nbsp;  每次传送前地址减1；<br>
FD&nbsp;&nbsp;  满递减堆栈；<br>
ED&nbsp;&nbsp;  空递减堆栈；<br>
FA&nbsp;&nbsp;  满递增堆栈；<br>
EA&nbsp;&nbsp;  空递增堆栈；<br>
{！}为可选后缀，若选用该后缀，则当数据传送完毕之后，将最后的地址写入基址寄存器，否则基址寄存器的内容不改变。<br>
基址寄存器不允许为R15，寄存器列表可以为R0～R15的任意组合。<br>
{∧}为可选后缀，当指令为LDM且寄存器列表中包含R15，选用该后缀时表示：除了正常的数据传送之外，还将SPSR复制到CPSR。同时，该后缀还表示传入或传出的是用户模式下的寄存器，而不是当前模式下的寄存器。<br>
指令示例：<br>
STMFD  R13!，{R0，R4-R12，LR}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将寄存器列表中的寄存器（R0，R4到<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  R12，LR）存入堆栈。<br>
LDMFD  R13!，{R0，R4-R12，PC}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将堆栈内容恢复到寄存器（R0，R4到<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  R12，LR）。<br>
七、数据交换指令1、SWP指令<br>
SWP指令的格式为：<br>
SWP{条件} 目的寄存器，源寄存器1，[源寄存器2]<br>
SWP指令用于将源寄存器2所指向的存储器中的字数据传送到目的寄存器中，同时将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。显然，当源寄存器1和目的寄存器为同一个寄存器时，指令交换该寄存器和存储器的内容。<br>
指令示例：<br>
SWP&nbsp;&nbsp;  R0，R1，[R2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R2所指向的存储器中的字数据传送到R0，同时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  将R1中的字数据传送到R2所指向的存储单元。<br>
SWP&nbsp;&nbsp;  R0，R0，[R1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；该指令完成将R1所指向的存储器中的字数据与R0中的数据<br>
交换。<br>
2、SWPB指令<br>
SWPB指令的格式为：<br>
SWP{条件}B 目的寄存器，源寄存器1，[源寄存器2]<br>
SWPB指令用于将源寄存器2所指向的存储器中的字节数据传送到目的寄存器中，目的寄存器的高24清零，同时将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中。显然，当源寄存器1和目的寄存器为同一个寄存器时，指令交换该寄存器和存储器的内容。<br>
指令示例：<br>
SWPB&nbsp;&nbsp;  R0，R1，[R2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R2所指向的存储器中的字节数据传送到R0，R0的高24<br>
位清零，同时将R1中的低8位数据传送到R2所指向的存储单元。<br>
SWPB&nbsp;&nbsp;  R0，R0，[R1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；该指令完成将R1所指向的存储器中的字节数据与<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  R0中的低8位数据交换。<br>
八、移位指令（操作）1、LSL（或ASL）操作<br>
LSL（或ASL）操作的格式为：<br>
通用寄存器，LSL（或ASL） 操作数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
LSL（或ASL）可完成对通用寄存器中的内容进行逻辑（或算术）的左移操作，按操作数所指定的数量向左移位，低位用零来填充。其中，操作数可以是通用寄存器，也可以是立即数（0～31）。<br>
操作示例<br>
MOV&nbsp;&nbsp;  R0, R1, LSL#2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R1中的内容左移两位后传送到R0中。<br>
2、LSR操作<br>
LSR操作的格式为：<br>
通用寄存器，LSR 操作数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
LSR可完成对通用寄存器中的内容进行右移的操作，按操作数所指定的数量向右移位，左端用零来填充。其中，操作数可以是通用寄存器，也可以是立即数（0～31）。<br>
操作示例： <br>
MOV&nbsp;&nbsp;  R0, R1, LSR#2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R1中的内容右移两位后传送到R0中，左端用<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  零来填充。<br>
3、ASR操作<br>
ASR操作的格式为：<br>
通用寄存器，ASR 操作数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
ASR可完成对通用寄存器中的内容进行右移的操作，按操作数所指定的数量向右移位，左端用第31位的值来填充。其中，操作数可以是通用寄存器，也可以是立即数（0～31）。<br>
操作示例：<br>
MOV&nbsp;&nbsp;&nbsp;  R0, R1, ASR#2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R1中的内容右移两位后传送到R0中，左端用<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  第31位的值来填充。<br>
4、ROR操作<br>
ROR操作的格式为：<br>
通用寄存器，ROR 操作数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
ROR可完成对通用寄存器中的内容进行循环右移的操作，按操作数所指定的数量向右循环移位，左端用右端移出的位来填充。其中，操作数可以是通用寄存器，也可以是立即数（0～31）。显然，当进行32位的循环右移操作时，通用寄存器中的值不改变。<br>
操作示例：<br>
MOV&nbsp;&nbsp;&nbsp;  R0, R1, ROR#2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R1中的内容循环右移两位后传送到R0中。<br>
5、RRX操作<br>
RRX操作的格式为：<br>
通用寄存器，RRX 操作数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
RRX可完成对通用寄存器中的内容进行带扩展的循环右移的操作，按操作数所指定的数量向右循环移位，左端用进位标志位C来填充。其中，操作数可以是通用寄存器，也可以是立即数（0～31）。<br>
操作示例：<br>
MOV&nbsp;&nbsp;  R0, R1, RRX#2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将R1中的内容进行带扩展的循环右移两位后传送到R0中。<br>
九、协处理器指令1、CDP指令<br>
CDP指令的格式为：<br>
CDP{条件} 协处理器编码，协处理器操作码1，目的寄存器，源寄存器1，源寄存器2，协处理器操作码2。<br>
CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作，则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作，目的寄存器和源寄存器均为协处理器的寄存器，指令不涉及ARM处理器的寄存器和存储器。<br>
指令示例：<br>
  CDP&nbsp;&nbsp;  P3，2，C12，C10，C3，4&nbsp;&nbsp;  ；该指令完成协处理器P3的初始化 <br>
2、LDC指令<br>
LDC指令的格式为：<br>
LDC{条件}{L} 协处理器编码,目的寄存器，[源寄存器]<br>
LDC指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中，若协处理器不能成功完成传送操作，则产生未定义指令异常。其中，{L}选项表示指令为长读取操作，如用于双精度数据的传输。<br>
指令示例：<br>
&nbsp;&nbsp;  LDC&nbsp;&nbsp;  P3，C4，[R0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将ARM处理器的寄存器R0所指向的存储器中<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  的字数据传送到协处理器P3的寄存器C4中。 <br>
3、STC指令<br>
STC指令的格式为：<br>
STC{条件}{L} 协处理器编码,源寄存器，[目的寄存器]<br>
STC指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中，若协处理器不能成功完成传送操作，则产生未定义指令异常。其中，{L}选项表示指令为长读取操作，如用于双精度数据的传输。<br>
指令示例：<br>
STC&nbsp;&nbsp;  P3，C4，[R0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；将协处理器P3的寄存器C4中的字数据传送到<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ARM处理器的寄存器R0所指向的存储器中。 <br>
4、MCR指令<br>
MCR指令的格式为：<br>
MCR{条件} 协处理器编码，协处理器操作码1，源寄存器，目的寄存器1，目的寄存器2，协处理器操作码2。<br>
MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作，则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作，源寄存器为ARM处理器的寄存器，目的寄存器1和目的寄存器2均为协处理器的寄存器。<br>
指令示例：<br>
&nbsp;&nbsp;  MCR&nbsp;&nbsp;  P3，3，R0，C4，C5，6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；该指令将ARM处理器寄存器R0中的数据传送到协处<br>
理器P3的寄存器C4和C5中。 <br>
5、MRC指令<br>
MRC指令的格式为：<br>
MRC{条件} 协处理器编码，协处理器操作码1，目的寄存器，源寄存器1，源寄存器2，协处理器操作码2。<br>
MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完成操作，则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作，目的寄存器为ARM处理器的寄存器，源寄存器1和源寄存器2均为协处理器的寄存器。<br>
指令示例：<br>
  MRC&nbsp;&nbsp;  P3，3，R0，C4，C5，6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；该指令将协处理器P3的寄存器中的数据传<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  送到ARM处理器寄存器中。 <br>
十、异常产生指令1、SWI指令<br>
SWI指令的格式为：<br>
SWI{条件} 24位的立即数<br>
SWI指令用于产生软件中断，以便用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务，指令中24位的立即数指定用户程序调用系统例程的类型，相关参数通过通用寄存器传递，当指令中24位的立即数被忽略时，用户程序调用系统例程的类型由通用寄存器R0的内容决定，同时，参数通过其他通用寄存器传递。 <br>
指令示例：<br>
&nbsp;&nbsp;  SWI&nbsp;&nbsp;  0x02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ；该指令调用操作系统编号位02的系统例程。<br>
2、BKPT指令<br>
BKPT指令的格式为：<br>
BKPT&nbsp;&nbsp;  16位的立即数<br>
BKPT指令产生软件断点中断，可用于程序的调试。</p> <a href="http://hi.baidu.com/yangchengbo82/blog/item/030951ada468e9014a36d6e9.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/030951ada468e9014a36d6e9.html#comment">查看评论</a>]]></description>
        <pubDate>2009-05-06  09:51</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/030951ada468e9014a36d6e9.html</guid>
</item>

<item>
        <title><![CDATA[ARM汇编伪指令介绍.]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/27c9549b5249c4bdc8eaf41c.html]]></link>
        <description><![CDATA[
		
		在 ARM 汇编语言程序里，有一些特殊指令助记符，这些助记符与指令系统的助记符不同，没有相对应的操作码，通常称这些特殊指令助记符为伪指令，他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的，这些伪指令仅在汇编过程中起作用，一旦汇编结束，伪指令的使命就完成。&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  在 ARM 的汇编程序中，有如下几种伪指令：<a href="http://www.dzkf.cn/html/qianrushixitong/2007/0530/2163.html#symbol"><font color="#0066aa">符号定义伪指令</font></a>、<a href="http://www.dzkf.cn/html/qianrushixitong/2007/0530/2163.html#data"><font color="#0066aa">数据定义伪指令</font></a>、<a href="http://www.dzkf.cn/html/qianrushixitong/2007/0530/2163.html#assembly"><font color="#0066aa">汇编控制伪指令</font></a>、<a href="http://www.dzkf.cn/html/qianrushixitong/2007/0530/2163.html#other"><font color="#0066aa">宏指令以及其他伪指令</font></a>。
<p>&nbsp;&nbsp;&nbsp;  <strong>符号定义（ Symbol Definition ）伪指令</strong>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  符号定义伪指令用于定义 ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  常见的符号定义伪指令有如下几种：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; 用于定义全局变量的 GBLA 、 GBLL 和 GBLS 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; 用于定义局部变量的 LCLA 、 LCLL 和 LCLS 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; 用于对变量赋值的 SETA 、 SETL 、 SETS 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; 为通用寄存器列表定义名称的 RLIST 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">1、 GBLA、GBLL 和GBLS</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLA （ GBLL 或 GBLS ） 全局变量名&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLA 、 GBLL 和 GBLS 伪指令用于定义一个 ARM 程序中的全局变量，并将其初始化。其中：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLA 伪指令用于定义一个全局的数字变量，并初始化为 0 ；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLL 伪指令用于定义一个全局的逻辑变量，并初始化为 F （假）；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLS 伪指令用于定义一个全局的字符串变量，并初始化为空；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  由于以上三条伪指令用于定义全局变量，因此在整个程序范围内变量名必须唯一。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLA Test1 ；定义一个全局的数字变量，变量名为 Test1&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test1 SETA 0xaa ；将该变量赋值为 0xaa&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLL Test2 ；定义一个全局的逻辑变量，变量名为 Test2&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test2 SETL {TRUE} ；将该变量赋值为真&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLS Test3 ；定义一个全局的字符串变量，变量名为 Test3&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test3 SETS &ldquo; Testing &rdquo; ；将该变量赋值为 &ldquo; Testing &rdquo;&nbsp;&nbsp;<br>
<br>
&nbsp;&nbsp;&nbsp;<font color="#0000ff"> 2、 LCLA、LCLL 和LCLS</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLA （ LCLL 或 LCLS ） 局部变量名&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLA 、 LCLL 和 LCLS 伪指令用于定义一个 ARM 程序中的局部变量，并将其初始化。其中：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLA 伪指令用于定义一个局部的数字变量，并初始化为 0 ；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLL 伪指令用于定义一个局部的逻辑变量，并初始化为 F （假）；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLS 伪指令用于定义一个局部的字符串变量，并初始化为空；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  以上三条伪指令用于声明局部变量，在其作用范围内变量名必须唯一。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLA Test4 ；声明一个局部的数字变量，变量名为 Test4&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test3 SETA 0xaa ；将该变量赋值为 0xaa&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLL Test5 ；声明一个局部的逻辑变量，变量名为 Test5&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test4 SETL {TRUE} ；将该变量赋值为真&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLS Test6 ；定义一个局部的字符串变量，变量名为 Test6&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test6 SETS &ldquo; Testing &rdquo; ；将该变量赋值为 &ldquo; Testing &rdquo;&nbsp;&nbsp;&nbsp;<br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">3、 SETA、SETL 和SETS</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  变量名 SETA （ SETL 或 SETS ） 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  伪指令 SETA 、 SETL 、 SETS 用于给一个已经定义的全局变量或局部变量赋值。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  SETA 伪指令用于给一个数学变量赋值；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  SETL 伪指令用于给一个逻辑变量赋值；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  SETS 伪指令用于给一个字符串变量赋值；&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  其中，变量名为已经定义过的全局变量或局部变量，表达式为将要赋给变量的值。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLA Test3 ；声明一个局部的数字变量，变量名为 Test3&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test3 SETA 0xaa ；将该变量赋值为 0xaa&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LCLL Test4 ；声明一个局部的逻辑变量，变量名为 Test4&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test4 SETL {TRUE} ；将该变量赋值为真&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">4 、 RLIST</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  名称 RLIST { 寄存器列表 }&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  RLIST 伪指令可用于对一个通用寄存器列表定义名称，使用该伪指令定义的名称可在 ARM 指令 LDM/STM 中使用。在 LDM/STM 指令中，列表中的寄存器访问次序为根据寄存器的编号由低到高，而与列表中的寄存器排列次序无关。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  RegList RLIST {R0-R5 ， R8 ， R10} ；将寄存器列表名称定义为 RegList ，可在 ARM 指令 LDM/STM中通过该名称访问寄存器列表。&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;  <strong>数据定义（ Data Definition ）伪指令</strong>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  数据定义伪指令一般用于为特定的数据分配存储单元，同时可完成已分配存储单元的初始化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  常见的数据定义伪指令有如下几种：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; DCW （ DCWU ） 用于分配一片连续的半字存储单元并用指定的数据初始化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; DCD （ DCDU ） 用于分配一片连续的字存储单元并用指定的数据初始化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; DCFD （ DCFDU ）用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; DCFS （ DCFSU ） 用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  始化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; DCQ （ DCQU ） 用于分配一片以 8 字节为单位的连续的存储单元并用指定的数据初始&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; SPACE 用于分配一片连续的存储单元&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; MAP 用于定义一个结构化的内存表首地址&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; FIELD 用于定义一个结构化的内存表的数据域&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">1、 DCB</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号 DCB 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DCB 伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中，表达式可以为 0 ～ 255 的数字或字符串。 DCB 也可用 &ldquo; = &rdquo; 代替。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Str DCB &ldquo; This is a test ！ &rdquo; ；分配一片连续的字节存储单元并初始化。 <br>
&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">2、 DCW（或DCWU）</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号 DCW （或 DCWU ） 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DCW （或 DCWU ）伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  其中，表达式可以为程序标号或数字表达式。。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  用 DCW 分配的字存储单元是半字对齐的，而用 DCWU 分配的字存储单元并不严格半字对齐。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DataTest DCW 1 ， 2 ， 3 ；分配一片连续的半字存储单元并初始化。&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">3、 DCD（或DCDU）</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号 DCD （或 DCDU ） 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DCD （或 DCDU ）伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中，表达式可以为程序标号或数字表达式。 DCD 也可用 &ldquo; &amp;amp; &rdquo; 代替。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  用 DCD 分配的字存储单元是字对齐的，而用 DCDU 分配的字存储单元并不严格字对齐。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DataTest DCD 4 ， 5 ， 6 ；分配一片连续的字存储单元并初始化。 <br>
&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;<font color="#0000ff"> 4、 DCFD（或DCFDU）</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号 DCFD （或 DCFDU ） 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DCFD （或 DCFDU ）伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。用 DCFD 分配的字存储单元是字对齐的，而用 DCFDU 分配的字存储单元并不严格字对齐。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  FDataTest DCFD 2E115 ， -5E7 ；分配一片连续的字存储单元并初始化为指定的双精度数。&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">5、 DCFS（或DCFSU）</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号 DCFS （或 DCFSU ） 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DCFS （或 DCFSU ）伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据一个字单元。 用 DCFS 分配的字存储单元是字对齐的，而用 DCFSU 分配的字存储单元并不严格字对齐。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  FDataTest DCFS 2E5 ， -5E － 7 ；分配一片连续的字存储单元并初始化为指定的单精度数。&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">6、 DCQ(或DCQU）</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号 DCQ （或 DCQU ） 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DCQ （或 DCQU ）伪指令用于分配一片以 8 个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  用 DCQ 分配的存储单元是字对齐的，而用 DCQU 分配的存储单元并不严格字对齐。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DataTest DCQ 100 ；分配一片连续的存储单元并初始化为指定的值。 <br>
&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">7、 SPACE </font>&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号 SPACE 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  SPACE 伪指令用于分配一片连续的存储区域并初始化为 0 。其中，表达式为要分配的字节数。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  SPACE 也可用 &ldquo; ％ &rdquo; 代替。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  DataSpace SPACE 100 ；分配连续 100 字节的存储单元并初始化为 0 。&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">8、 MAP</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MAP 表达式 { ，基址寄存器 }&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MAP 伪指令用于定义一个结构化的内存表的首地址。 MAP 也可用 &ldquo; ＾ &rdquo; 代替。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  表达式可以为程序中的标号或数学表达式，基址寄存器为可选项，当基址寄存器选项不存在时，表达式的值即为内存表的首地址，当该选项存在时，内存表的首地址为表达式的值与基址寄存器的和。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MAP 伪指令通常与 FIELD 伪指令配合使用来定义结构化的内存表。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MAP 0x100 ， R0 ；定义结构化内存表首地址的值为 0x100 ＋ R0 。 <br>
&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">9、 FILED</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号 FIELD 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  FIELD 伪指令用于定义一个结构化内存表中的数据域。 FILED 也可用 &ldquo; # &rdquo; 代替。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  表达式的值为当前数据域在内存表中所占的字节数。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  FIELD 伪指令常与 MAP 伪指令配合使用来定义结构化的内存表。 MAP 伪指令定义内存表的首地址， FIELD 伪指令定义内存表中的各个数据域，并可以为每个数据域指定一个标号供其他的指令引用。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  注意 MAP 和 FIELD 伪指令仅用于定义数据结构，并不实际分配存储单元。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MAP 0x100 ；定义结构化内存表首地址的值为 0x100 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  A FIELD 16 ；定义 A 的长度为 16 字节，位置为 0x100&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  B FIELD 32 ；定义 B 的长度为 32 字节，位置为 0x110&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  S FIELD 256 ；定义 S 的长度为 256 字节，位置为 0x130&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;  <strong>汇编控制（ Assembly Control ）伪指令</strong>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  汇编控制伪指令用于控制汇编程序的执行流程，常用的汇编控制伪指令包括以下几条：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; IF 、 ELSE 、 ENDIF&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; WHILE 、 WEND&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; MACRO 、 MEND&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; MEXIT&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">1、 IF、ELSE、ENDIF</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  IF 逻辑表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  指令序列 1&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ELSE&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  指令序列 2&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ENDIF&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  IF 、 ELSE 、 ENDIF 伪指令能根据条件的成立与否决定是否执行某个指令序列。当 IF 后面的逻辑表达式为真，则执行指令序列 1 ，否则执行指令序列 2 。其中， ELSE 及指令序列 2 可以没有，此时，当 IF 后面的逻辑表达式为真，则执行指令序列 1 ，否则继续执行后面的指令。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  IF 、 ELSE 、 ENDIF 伪指令可以嵌套使用。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLL Test ；声明一个全局的逻辑变量，变量名为 Test……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  IF Test = TRUE&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  指令序列 1&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ELSE&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  指令序列 2&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ENDIF&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">2、 WHILE、WEND</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  WHILE 逻辑表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  指令序列&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  WEND&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  WHILE 、 WEND 伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当 WHILE 后面的逻辑表达式为真，则执行指令序列，该指令序列执行完毕后，再判断逻辑表达式的值，若为真则继续执行，一直到逻辑表达式的值为假。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  WHILE 、 WEND 伪指令可以嵌套使用。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GBLA Counter ；声明一个全局的数学变量，变量名为 Counter&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Counter SETA 3 ；由变量Counter 控制循环次数&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  WHILE Counter &amp;lt; 10&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  指令序列&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  WEND&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">3、 MACRO、MEND</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  $ 标号 宏名 $ 参数 1 ， $ 参数 2 ，……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  指令序列&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MEND&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MACRO 、 MEND 伪指令可以将一段代码定义为一个整体，称为宏指令，然后就可以在程序中通过宏指令多次调用该段代码。其中， $ 标号在宏指令被展开时，标号会被替换为用户定义的符号， 宏指令可以使用一个或多个参数，当宏指令被展开时，这些参数被相应的值替换。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  宏指令的使用方式和功能与子程序有些相似，子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场，从而增加了系统的开销，因此，在代码较短且需要传递的参数较多时，可以使用宏指令代替子程序。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  包含在 MACRO 和 MEND 之间的指令序列称为宏定义体，在宏定义体的第一行应声明宏的原型（包含宏名、所需的参数），然后就可以在汇编程序中通过宏名来调用该指令序列。在源程序被编译时，汇编器将宏调用展开，用宏定义中的指令序列代替程序中的宏调用，并将实际参数的值传递给宏定义中的形式参数。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MACRO 、 MEND 伪指令可以嵌套使用。&nbsp;&nbsp;&nbsp;<br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">4、 MEXIT</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MEXIT&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  MEXIT 用于从宏定义中跳转出去。&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;  <strong>其他常用的伪指令</strong>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  还有一些其他的伪指令，在汇编程序中经常会被使用，包括以下几条：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; AREA&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; ALIGN&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; CODE16 、 CODE32&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; ENTRY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; END&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; EQU&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; EXPORT （或 GLOBAL ）&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; IMPORT&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; EXTERN&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; GET （或 INCLUDE ）&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; INCBIN&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; RN&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; ROUT&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">1、 AREA</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA 段名 属性 1 ，属性 2 ，……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA 伪指令用于定义一个代码段或数据段。其中，段名若以数字开头，则该段名需用 &ldquo; | &rdquo; 括起来，如 |1_test| 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  属性字段表示该代码段（或数据段）的相关属性，多个属性用逗号分隔。常用的属性如下：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; CODE 属性：用于定义代码段，默认为 READONLY 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; DATA 属性：用于定义数据段，默认为 READWRITE 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; READONLY 属性：指定本段为只读，代码段默认为 READONLY 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; READWRITE 属性：指定本段为可读可写，数据段的默认属性为 READWRITE 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; ALIGN 属性：使用方式为 ALIGN 表达式。在默认时， ELF （可执行连接文件）的代码段和数据段是按字对齐的，表达式的取值范围为 0 ～ 31 ，相应的对齐方式为 2 表达式次方。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  &mdash; COMMON 属性：该属性定义一个通用的段，不包含任何的用户代码和数据。各源文件中同名的 COMMON 段共享同一段存储单元。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  一个汇编语言程序至少要包含一个段，当程序太长时，也可以将程序分为多个代码段和数据段。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  该伪指令定义了一个代码段，段名为 Init ，属性为只读&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">2、 ALIGN</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ALIGN { 表达式 { ，偏移量 }}&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ALIGN 伪指令可通过添加填充字节的方式，使当前位置满足一定的对其方式 | 。其中，表达式的值用于指定对齐方式，可能的取值为 2 的幂，如 1 、 2 、 4 、 8 、 16 等。若未指定表达式，则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式，若使用该字段，则当前位置的对齐方式为： 2 的表达式次幂＋偏移量。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY ， ALIEN ＝ 3 ；指定后面的指令为 8 字节对齐。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  指令序列&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">3、 CODE16、CODE32</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  CODE16 （或 CODE32 ）&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  CODE16 伪指令通知编译器，其后的指令序列为 16 位的 Thumb 指令。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  CODE32 伪指令通知编译器，其后的指令序列为 32 位的 ARM 指令。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  若在汇编源程序中同时包含 ARM 指令和 Thumb 指令时，可用 CODE16 伪指令通知编译器其后的指令序列为 16 位的 Thumb 指令， CODE32 伪指令通知编译器其后的指令序列为 32 位的 ARM 指令。因此，在使用 ARM 指令和 Thumb 指令混合编程的代码里，可用这两条伪指令进行切换，但注意他们只通知编译器其后指令的类型，并不能对处理器进行状态的切换。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  CODE32 ；通知编译器其后的指令为 32 位的 ARM 指令&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  LDR R0 ，＝ NEXT ＋ 1 ；将跳转地址放入寄存器 R0&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  BX R0 ；程序跳转到新的位置执行，并将处理器切换到 Thumb 工作状态&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  CODE16 ；通知编译器其后的指令为 16 位的 Thumb 指令&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  NEXT LDR R3，＝0x3FF&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END ；程序结束 <br>
&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">4、 ENTRY</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ENTRY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ENTRY 伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个 ENTRY （也可以有多个，当有多个 ENTRY 时，程序的真正入口点由链接器指定），但在一个源文件里最多只能有一个 ENTRY （可以没有）。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ENTRY ；指定应用程序的入口点&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ……&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">5、 END</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END 伪指令用于通知编译器已经到了源程序的结尾。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END ；指定应用程序的结尾&nbsp;&nbsp;&nbsp;<br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">6、 EQU</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  名称 EQU 表达式 { ，类型 }&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  EQU 伪指令用于为程序中的常量、标号等定义一个等效的字符名称，类似于 C 语言中的＃ define 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  其中 EQU 可用 &ldquo; * &rdquo; 代替。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  名称为 EQU 伪指令定义的字符名称，当表达式为 32 位的常量时，可以指定表达式的数据类型，可以有以下三种类型：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  CODE16 、 CODE32 和 DATA&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Test EQU 50 ；定义标号 Test 的值为 50&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Addr EQU 0x55 ， CODE32 ；定义 Addr 的值为 0x55 ，且该处为 32 位的 ARM 指令。&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">7、 EXPORT（或GLOBAL）</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  EXPORT 标号 {[WEAK]}&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  EXPORT 伪指令用于在程序中声明一个全局的标号，该标号可在其他的文件中引用。 EXPORT可用 GLOBAL 代替。标号在程序中区分大小写， [WEAK] 选项声明其他的同名标号优先于该标号被引用。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  EXPORT Stest ；声明一个可全局引用的标号Stest……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">8、 IMPORT</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  IMPORT 标号 {[WEAK]}&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  IMPORT 伪指令用于通知编译器要使用的标号在其他的源文件中定义，但要在当前源文件中引用，而且无论当前源文件是否引用该标号，该标号均会被加入到当前源文件的符号表中。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  标号在程序中区分大小写， [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时，编译器也不给出错误信息，在多数情况下将该标号置为 0 ，若该标号为 B 或 BL 指令引用，则将 B 或 BL指令置为 NOP 操作。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  IMPORT Main ；通知编译器当前文件要引用标号Main，但Main 在其他源文件中定义……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">9、 EXTERN</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  EXTERN 标号 {[WEAK]}&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  EXTERN 伪指令用于通知编译器要使用的标号在其他的源文件中定义，但要在当前源文件中引用，如果当前源文件实际并未引用该标号，该标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写， [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时，编译器也不给出错误信息，在多数情况下将该标号置为 0 ，若该标号为 B 或 BL 指令引用，则将 B 或 BL指令置为 NOP 操作。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  EXTERN Main ；通知编译器当前文件要引用标号Main，但Main 在其他源文件中定义……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">10、 GET（或INCLUDE）</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GET 文件名&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GET 伪指令用于将一个源文件包含到当前的源文件中，并将被包含的源文件在当前位置进行汇编处理。可以使用 INCLUDE 代替 GET 。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  汇编程序中常用的方法是在某源文件中定义一些宏指令，用 EQU 定义常量的符号名称，用 MAP和 FIELD 定义结构化的数据类型，然后用 GET 伪指令将这个源文件包含到其他的源文件中。使用方法与 C 语言中的 &ldquo; include &rdquo; 相似。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GET 伪指令只能用于包含源文件，包含目标文件需要使用 INCBIN 伪指令&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GET a1.s ；通知编译器当前源文件包含源文件a1.s&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  GE T C：\a2.s ；通知编译器当前源文件包含源文件C：\ a2.s ……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">11、 INCBIN</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  INCBIN 文件名&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  INCBIN 伪指令用于将一个目标文件或数据文件包含到当前的源文件中，被包含的文件不作任何变动的存放在当前文件中，编译器从其后开始继续处理。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  AREA Init ， CODE ， READONLY&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  INCBIN a1.dat ；通知编译器当前源文件包含文件a1.dat&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  INCBIN C：\a2.txt ；通知编译器当前源文件包含文件C：\a2.txt……&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  END&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">12、 RN</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  名称 RN 表达式&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  RN 伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中，名称为给寄存器定义的别名，表达式为寄存器的编码。&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  使用示例：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  Temp RN R0 ；将R0 定义一个别名Temp&nbsp;&nbsp;&nbsp;  <br>
<br>
&nbsp;&nbsp;&nbsp;  <font color="#0000ff">13、 ROUT</font>&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  语法格式：&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  { 名称 } ROUT&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  ROUT 伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时，局部变量的作用范围为所在的 AREA ，而使用 ROUT 后，局部变量的作为范围为当前 ROUT 和下一个 ROUT 之间。</p> <a href="http://hi.baidu.com/yangchengbo82/blog/item/27c9549b5249c4bdc8eaf41c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/27c9549b5249c4bdc8eaf41c.html#comment">查看评论</a>]]></description>
        <pubDate>2009-05-06  09:07</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/27c9549b5249c4bdc8eaf41c.html</guid>
</item>

<item>
        <title><![CDATA[matlab命令大选 续]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/91d267081f126238e8248854.html]]></link>
        <description><![CDATA[
		
		图形*作<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  设置对象<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Get&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  获取对象特征<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Reset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  重置对象特征<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  删除对象<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Newplot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  预测nextplot性质的M文件<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Gco&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  获取当前对象的句柄<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Drawnow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  填充未完成绘图事件<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Findobj&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  寻找指定特征值的对象<br>
打印和存储<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Print&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  打印图形或保存图形<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Printopt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  配置本地打印机缺省值<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Orient&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  设置纸张取向<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Capture&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  屏幕抓取当前图形<br>
基本X&mdash;Y图形<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Plot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  线性图形<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Loglog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  对数坐标图形<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Semilogx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  半对数坐标图形（X轴为对数坐标）<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Semilogy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  半对数坐标图形（Y轴为对数坐标）<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Fill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  绘制二维多边形填充图<br>
特殊X&mdash;Y图形<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Polar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  极坐标图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Bar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  条形图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Stem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散序列图或杆图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Stairs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  阶梯图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Errorbar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  误差条图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Hist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  直方图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Rose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  角度直方图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Compass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  区域图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Feather&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  箭头图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Fplot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  绘图函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Comet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  星点图<br>
图形注释<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  图形标题<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Xlabel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X轴标记<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ylabel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Y轴标记<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  文本注释<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Gtext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  用鼠标放置文本<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Grid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  网格线<br>
MATLAB编程语言<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  增加新的函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Eval&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  执行由MATLAB表达式构成的字串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Feval&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  执行由字串指定的函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Global&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  定义全局变量<br>
程序控制流<br>
&nbsp;&nbsp;&nbsp;&nbsp;  If&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  条件执行语句<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  与if命令配合使用<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Elseif&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  与if命令配合使用<br>
&nbsp;&nbsp;&nbsp;&nbsp;  End&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  For,while和if语句的结束<br>
&nbsp;&nbsp;&nbsp;&nbsp;  For&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  重复执行指定次数（循环）<br>
&nbsp;&nbsp;&nbsp;&nbsp;  While&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  重复执行不定次数（循环）<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Break&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  终止循环的执行<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Return&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  返回引用的函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Error&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  显示信息并终止函数的执行<br>
交互输入<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  提示用户输入<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Keyboard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  像底稿文件一样使用键盘输入<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Menu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  产生由用户输入选择的菜单<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Pause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  等待用户响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Uimenu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  建立用户界面菜单<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Uicontrol&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  建立用户界面控制<br>
一般字符串函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Strings&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MATLAB中有关字符串函数的说明<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Abs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变字符串为数值<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Setstr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变数值为字符串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Isstr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  当变量为字符串时其值为真<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Blanks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  空串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Deblank&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  删除尾部的空串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Str2mat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从各个字符串中形成文本矩阵<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Eval&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  执行由MATLAB表达式组成的串<br>
字符串比较<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Strcmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  比较字符串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Findstr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在一字符串中查找另一个子串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Upper&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变字符串为大写<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lower&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变字符串为小写<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Isletter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  当变量为字母时，其值为真<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Isspace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  当变量为空白字符时，其值为真<br>
字符串与数值之间变换<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Num2str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变数值为字符串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Int2str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变整数为字符串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Str2num&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变字符串为数值<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Sprintf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变数值为格式控制下的字符串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Sscanf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变字符串为格式控制下的数值<br>
十进制与十六进制数之间变换<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Hex2num&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变十六进制为IEEE标准下的浮点数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Hex2dec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变十六制数为十进制数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dec2hex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变十进制数为十六进制数<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
建模<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Append&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  追加系统动态特性<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Augstate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变量状态作为输出<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Blkbuild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从方框图中构造状态空间系统<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Cloop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  系统的闭环<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Connect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  方框图建模<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Conv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  两个多项式的卷积<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Destim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从增益矩阵中形成离散状态估计器<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dreg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从增益矩阵中形成离散<nobr><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline">控制器</strong></nobr>和估计器<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Drmodel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  产生随机离散模型<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Estim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从增益矩阵中形成连续状态估计器<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Feedback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  反馈系统连接<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ord2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  产生二阶系统的A、B、C、D<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Pade&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  时延的Pade近似<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Parallel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  并行系统连接<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从增益矩阵中形成连续控制器和估计器<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Rmodel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  产生随机连续模型<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Series&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  串行系统连接<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ssdelete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从模型中删除输入、输出或状态<br>
&nbsp;&nbsp;&nbsp;&nbsp;  ssselect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从大系统中选择子系统 <br>
模型变换<br>
&nbsp;&nbsp;&nbsp;&nbsp;  C2d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变连续系统为离散系统<br>
&nbsp;&nbsp;&nbsp;&nbsp;  C2dm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  利用指定方法变连续为离散系统<br>
&nbsp;&nbsp;&nbsp;&nbsp;  C2dt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  带一延时变连续为离散系统<br>
&nbsp;&nbsp;&nbsp;&nbsp;  D2c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变离散为连续系统<br>
&nbsp;&nbsp;&nbsp;&nbsp;  D2cm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  利用指定方法变离散为连续系统<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Poly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变根值表示为多项式表示<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Residue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  部分分式展开<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ss2tf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变状态空间表示为传递函数表示<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ss2zp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变状态空间表示为零极点表示<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Tf2ss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变传递函数表示为状态空间表示<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Tf2zp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变传递函数表示为零极点表示<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Zp2tf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变零极点表示为传递函数表示<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Zp2ss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变零极点表示为状态空间表示<br>
模型简化<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Balreal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  平衡实现<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dbalreal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散平衡实现<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dmodred&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散模型降阶<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Minreal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  最小实现和零极点对消<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Modred&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  模型降阶<br>
模型实现<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Canon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  正则形式<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ctrbf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  可控阶梯形<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Obsvf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  可观阶梯形<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ss2ss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  采用相似变换<br>
模型特性<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Covar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  相对于白噪声的连续协方差响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ctrb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  可控性矩阵<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Damp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  阻尼系数和固有频率<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dcgain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  连续稳态（直流）增益<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dcovar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  相对于白噪声的离散协方差响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ddamp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散阻尼系数和固有频率<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ddcgain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散系统增益<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dgram&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散可控性和可观性<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dsort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  按幅值排序离散特征值<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Eig&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  特征值和特征向量<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Esort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  按实部排列连续特征值<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Gram&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  可控性和可观性<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Obsv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  可观性矩阵<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Printsys&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  按格式显示系统<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Roots&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  多项式之根<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Tzero&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  传递零点<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Tzero2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  利用随机扰动法传递零点<br>
时域响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dimpulse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散时间单位冲激响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dinitial&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散时间零输入响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dlsim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  任意输入下的离散时间仿真<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dstep&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散时间阶跃响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Filter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  单输入单输出Z变换仿真<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Impulse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  冲激响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Initial&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  连续时间零输入响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lsim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  任意输入下的连续时间仿真<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ltitr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  低级时间响应函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Step&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  阶跃响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Stepfun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  阶跃函数<br>
频域响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Bode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Bode图（频域响应）<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dbode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散Bode图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dnichols&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散Nichols图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dnyquist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散Nyquist图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dsigma&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散奇异值频域图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Fbode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  连续系统的快速Bode图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Freqs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  拉普拉斯变换频率响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Freqz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Z变换频率响应<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ltifr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  低级频率响应函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Margin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  增益和相位裕度<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Nichols&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Nichols图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ngrid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  画Nichols图的栅格线<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Nyquist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Nyquist图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Sigma&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  奇异值频域图<br>
根轨迹<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Pzmap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  零极点图<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Rlocfind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  交互式地确定根轨迹增益<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Rlocus&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  画根轨迹<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Sgrid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在网格上画连续根轨迹<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Zgrid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在网格上画离散根轨迹<br>
增益选择<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Acker&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  单输入单输出极点配置<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dlqe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散线性二次估计器<nobr><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline">设计</strong></nobr><br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dlqew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散线性二次估计器设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dlqr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散线性二次<nobr><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline">调节器</strong></nobr>设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dlqry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  输出加权的离散调节器设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lqe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  线性二次估计器设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lqed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  基于连续代价函数的离散估计器设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lqe2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  利用Schur法设计线性二次估计器<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lqew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  一般线性二次估计器设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lqr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  线性二次调节器设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lqrd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  基于连续代价函数的离散调节器设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lqry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  输出加权的调节器设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lqr2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  利用Schur法设计线性二次调节器<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Place&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  极点配置<br>
方程求解<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Are&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  代数Riccati方程求解<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dlyap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散Lyapunov方程求解<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lyap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  连续Lyapunov方程求解<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lyap2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  利用对角化求解Lyapunov方程<br>
演示示例<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ctrldemo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  控制工具箱介绍<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Boildemo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  锅炉系统的LQG设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Jetdemo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  喷气式飞机偏航阻尼的典型设计<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Diskdemo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  硬盘控制器的数字控制<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Kalmdemo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Kalman滤波器设计和仿真<br>
实用工具<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Abcdchk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  检测（A、B、C、D）组的一致性<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Chop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  取n个重要的位置<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dexresp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散取样响应函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dfrqint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散Bode图的自动定范围的算法<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dfrqint2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散Nyquist图的自动定范围的算法<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dmulresp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散多变量响应函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Distsl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  到直线间的距离<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散Riccati方程留数计算<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dsigma2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  DSIGMA实用工具函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Dtimvec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  离散时间响应的自动定范围算法<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Exresp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  取样响应函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Freqint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Bode图的自动定范围算法<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Freqint2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Nyquist图的自动定范围算法<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Freqresp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  低级频率响应函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Givens&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  旋转<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Housh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  构造Householder变换<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Imargin&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  利用内插技术求增益和相位裕度<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Lab2ser&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变标号为字符串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Mulresp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  多变量响应函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Nargchk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  检测M文件的变量数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Perpxy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  寻找最近的正交点<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Poly2str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  变多项式为字符串<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Printmat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  带行列号打印矩阵<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Ric&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Riccati方程留数计算<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Schord&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  有序Schwr分解<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Sigma2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  SIGMA使用函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Tfchk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  检测传<br>
递函数的一致性<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Timvec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  连续时间响应的自动定范围算法<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Tzreduce&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在计算过零点时简化系统<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Vsort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  匹配两根轨迹的向量 <a href="http://hi.baidu.com/yangchengbo82/blog/item/91d267081f126238e8248854.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/91d267081f126238e8248854.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-21  15:07</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/91d267081f126238e8248854.html</guid>
</item>

<item>
        <title><![CDATA[matlab命令大全]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/46a969231d7d2b469358074b.html]]></link>
        <description><![CDATA[
		
		MATLAB命令大全<br>
管理命令和函数<br>
    help    在线帮助文件<br>
    doc    装入超文本说明<br>
    what    M、MAT、MEX文件的目录列表<br>
    type    列出M文件<br>
    lookfor    通过help条目搜索关键字<br>
    which    定位函数和文件<br>
    Demo    运行演示程序<br>
    Path    控制MATLAB的搜索路径<br>
管理变量和工作空间<br>
    Who    列出当前变量<br>
    Whos    列出当前变量（长表）<br>
    Load    从磁盘文件中恢复变量<br>
    Save    保存工作空间变量<br>
    Clear    从内存中清除变量和函数<br>
    Pack    整理工作空间内存<br>
    Size    矩阵的尺寸<br>
    Length    向量的长度<br>
    disp    显示矩阵或<br>
与文件和操作系统有关的命令<br>
    cd    改变当前工作目录<br>
    Dir    目录列表<br>
    Delete    删除文件<br>
    Getenv    获取环境变量值<br>
    !    执行DOS操作系统命令<br>
    Unix    执行UNIX操作系统命令并返回结果<br>
    Diary    保存MATLAB任务<br>
控制命令窗口<br>
    Cedit    设置命令行编辑<br>
    Clc    清命令窗口<br>
    Home    光标置左上角<br>
    Format    设置输出格式<br>
    Echo    底稿文件内使用的回显命令<br>
    more    在命令窗口中控制分页输出<br>
启动和退出MATLAB<br>
    Quit    退出MATLAB<br>
    Startup    引用MATLAB时所执行的M文件<br>
    Matlabrc    主启动M文件<br>
一般信息<br>
    Info    MATLAB系统信息及Mathworks公司信息<br>
    Subscribe    成为MATLAB的订购用户<br>
    hostid    MATLAB主服务程序的识别代号<br>
    Whatsnew    在说明书中未包含的新信息<br>
    Ver    版本信息<br>
操作符和特殊字符<br>
    +    加<br>
    &mdash;    减<br>
    *    矩阵乘法<br>
    .*    数组乘法<br>
    ^    矩阵幂<br>
    .^    数组幂<br>
    \    左除或反斜杠<br>
    /    右除或斜杠<br>
    ./    数组除<br>
    Kron    Kronecker张量积<br>
    :    冒号<br>
    ( )    圆括号<br>
    [ ]    方括号<br>
    .    小数点<br>
    ..    父目录<br>
    …    继续<br>
    ,    逗号<br>
    ;    分号<br>
    %    注释<br>
    !    感叹号<br>
    &lsquo;    转置或引用<br>
    =    赋值<br>
    = =    相等<br>
    &lt; &gt;    关系操作符<br>
    &amp;    逻辑与<br>
    |    逻辑或<br>
    ~    逻辑非<br>
    xor    逻辑异或<br>
逻辑函数<br>
    Exist    检查变量或函数是否存在<br>
    Any    向量的任一元为真，则其值为真<br>
    All    向量的所有元为真，则其值为真<br>
    Find    找出非零元素的索引号<br>
三角函数<br>
    Sin    正弦<br>
    Sinh    双曲正弦<br>
    Asin    反正弦<br>
    Asinh    反双曲正弦<br>
    Cos    余弦<br>
    Cosh    双曲余弦<br>
    Acos    反余弦<br>
    Acosh    反双曲余弦<br>
    Tan    正切<br>
    Tanh    双曲正切<br>
    Atan    反正切<br>
    Atan2    四象限反正切<br>
    Atanh    反双曲正切<br>
    Sec    正割<br>
    Sech    双曲正割<br>
    Asech     反双曲正割<br>
    Csc    余割<br>
    Csch    双曲余割<br>
    Acsc    反余割<br>
    Acsch    反双曲余割<br>
    Cot    余切<br>
    Coth    双曲余切<br>
    Acot    反余切<br>
    Acoth    反双曲余切<br>
指数函数<br>
    Exp    指数<br>
    Log    自然对数<br>
    Log10    常用对数<br>
    Sqrt    平方根<br>
复数函数<br>
    Abs    绝对值<br>
    Argle    相角<br>
    Conj    复共轭<br>
    Image    复数虚部<br>
    Real    复数实部<br>
数值函数<br>
    Fix    朝零方向取整<br>
    Floor    朝负无穷大方向取整<br>
    Ceil    朝正无穷大方向取整<br>
    Round    朝最近的整数取整<br>
    Rem    除后取余<br>
    Sign    符号函数<br>
基本矩阵<br>
    Zeros    零矩阵<br>
    Ones    全&ldquo;1&rdquo;矩阵<br>
    Eye    单位矩阵<br>
    Rand    均匀分布的随机数矩阵<br>
    Randn    正态分布的随机数矩阵<br>
    Logspace    对数间隔的向量<br>
    Meshgrid    三维图形的X和Y数组<br>
    :    规则间隔的向量<br>
特殊变量和常数<br>
    Ans    当前的答案<br>
    Eps    相对浮点精度<br>
    Realmax    最大浮点数<br>
    Realmin    最小浮点数<br>
    Pi    圆周率<br>
    I,j    虚数单位<br>
    Inf    无穷大<br>
    Nan    非数值<br>
    Flops    浮点运算次数<br>
    Nargin    函数输入变量数<br>
    Nargout    函数输出变量数<br>
    Computer    计算机类型<br>
    Isieee    当计算机采用IEEE算术标准时，其值为真<br>
    Why    简明的答案<br>
    Version    MATLAB版本号<br>
时间和日期<br>
    Clock    挂钟<br>
    Date    日历<br>
    Etime    计时函数<br>
    Tic    秒表开始计时<br>
    Toc    计时函数<br>
    Cputime    CPU时间（以秒为单位）<br>
矩阵操作<br>
    Diag    建立和提取对角阵<br>
    Fliplr    矩阵作左右翻转<br>
    Flipud    矩阵作上下翻转<br>
    Reshape    改变矩阵大小<br>
    Rot90    矩阵旋转90度<br>
    Tril    提取矩阵的下三角部分<br>
    Triu    提取矩阵的上三角部分<br>
    :    矩阵的索引号，重新排列矩阵<br>
    Compan    友矩阵<br>
    Hadamard    Hadamard矩阵<br>
    Hankel    Hankel矩阵<br>
    Hilb    Hilbert矩阵<br>
    Invhilb    逆Hilbert矩阵<br>
    Kron    Kronecker张量积<br>
    Magic    魔方矩阵<br>
    Toeplitz    Toeplitz矩阵<br>
    Vander    Vandermonde矩阵<br>
矩阵分析    <br>
    Cond    计算矩阵条件数<br>
    Norm    计算矩阵或向量范数<br>
    Rcond Linpack    逆条件值估计<br>
    Rank    计算矩阵秩<br>
    Det    计算矩阵行列式值<br>
    Trace    计算矩阵的迹<br>
    Null    零矩阵<br>
    Orth    正交化<br>
线性方程<br>
    \和/    线性方程求解<br>
    Chol    Cholesky分解<br>
    Lu    高斯消元法求系数阵<br>
    Inv    矩阵求逆<br>
    Qr    正交三角矩阵分解（QR分解）<br>
    Pinv    矩阵伪逆<br>
特征值和奇异值<br>
    Eig    求特征值和特征向量<br>
    Poly    求特征多项式<br>
    Hess    Hessberg形式<br>
    Qz    广义特征值<br>
    Cdf2rdf    变复对角矩阵为实分块对角形式<br>
    Schur    Schur分解<br>
    Balance    矩阵均衡处理以提高特征值精度<br>
    Svde    奇异值分解<br>
矩阵函数<br>
    Expm    矩阵指数<br>
    Expm1    实现expm的M文件<br>
    Expm2    通过泰勒级数求矩阵指数<br>
    Expm3    通过特征值和特征向量求矩阵指数<br>
    Logm    矩阵对数<br>
    Sqrtm    矩阵开平方根<br>
    Funm    一般矩阵的计算<br>
泛函&mdash;&mdash;非线性数值方法<br>
    Ode23    低阶法求解常微分方程<br>
    Ode23p    低阶法求解常微分方程并绘出结果图形<br>
    Ode45    高阶法求解常微分方程<br>
    Quad    低阶法计算数值积分<br>
    Quad8    高阶法计算数值积分<br>
    Fmin    单变量函数的极小变化<br>
    Fmins    多变量函数的极小化<br>
    Fzero    找出单变量函数的零点<br>
    Fplot    函数绘图<br>
多项式函数<br>
    Roots    求多项式根<br>
    Poly    构造具有指定根的多项式<br>
    Polyvalm    带矩阵变量的多项式计算<br>
    Residue    部分分式展开（留数计算）<br>
    Polyfit    数据的多项式拟合<br>
    Polyder    微分多项式 <a href="http://hi.baidu.com/yangchengbo82/blog/item/46a969231d7d2b469358074b.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/46a969231d7d2b469358074b.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-21  15:07</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/46a969231d7d2b469358074b.html</guid>
</item>

<item>
        <title><![CDATA[matlab程序计时]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/dbd7483442d67a335ab5f537.html]]></link>
        <description><![CDATA[
		
		<p><font size="3">四种方法：</font></p>
<p><font size="3">【1】tic,toc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  %这方法最简单，但一定要一起执行，</font></p>
<p><font size="3">tic&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  %否则显示的是tic和toc两条命令的间隔时间</font></p>
<p><font size="3">your_operation</font></p>
<p><font size="3">toc</font></p>
<p> </p>
<p> </p>
<p><font size="3">【2】cputime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  %给一个变量设定为cputime，做操作，然后看这个时间变了多少，</font></p>
<p><font size="3">t=cputime;<font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  % 但如果时间太小就显示0</font></font></p>
<p><font size="3">your_operation</font></p>
<p><font size="3">cputime-t</font></p>
<p> </p>
<p> </p>
<p><font size="3">【3】clock,etime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  %和上面类似</font></p>
<p><font size="3">t0 = clock;<br>
your_operation<br>
etime(clock,t0)</font></p>
<p> </p>
<font size="3">
<p><font size="3">【4】profile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  %最后一种，用法比较复杂，当然功能也多<br>
例子：<br>
profile on<br>
plot(magic(35))<br>
profile viewer<br>
profsave(profile('info'),'profile_results')</font></p>
<p><font size="3">profile on -history<br>
plot(magic(4));<br>
p = profile('info');<br>
for n = 1:size(p.FunctionHistory,2)<br>
if p.FunctionHistory(1,n)==0<br>
str = 'entering function: ';<br>
else<br>
str = ' exiting function: ';<br>
end<br>
disp([str p.FunctionTable(p.FunctionHistory(2,n)).FunctionName]);<br>
end</font></p>
<p> </p>
</font> <a href="http://hi.baidu.com/yangchengbo82/blog/item/dbd7483442d67a335ab5f537.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/dbd7483442d67a335ab5f537.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-19  19:57</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/dbd7483442d67a335ab5f537.html</guid>
</item>

<item>
        <title><![CDATA[虚拟机访问网络方式解析]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/0cc63bb5b28e62c637d3ca0e.html]]></link>
        <description><![CDATA[
		
		VMWare里面的Gentoo Linux是采用network bridge 的方式和windows共享一个物理网卡上网，这次回家，将电脑搬了回来，改成了adsl上网，结果发现Linux居然无法访问网络了，我的Gentoo Linux如果没有网络那就等于废了，不能emerge，Gentoo的优势何在啊？逼的我疯狂google，查阅了不少VMWare的文档，终 VMWare的网络问题搞定了。其实，这已经是一个月前的事情了，直到现在才找了点时间，把它写出来：<br>
<br>
<h3>三种网络方式</h3>
<h4>BRIDGED:&nbsp;&nbsp;</h4>
<br>
bridge 就是&ldquo;桥&rdquo;的意思，说起桥接，就不能不说局域网。比如我们有两个局域网络，他们的ip段都处于192.168.0.*，同时，我们希望把这两个网络链接起来，这中情况下，我们就可以采用桥接。这个时候，&ldquo;桥&rdquo;就是一个主机，这个机器拥有两块网卡，分别处于两个局域网中，同时在&ldquo;桥&rdquo;上，运行着程序，让局域网A中的所有数据包原封不动的流入B，反之亦然。这样，局域网A和B就无缝的在链路层连接起来了（当然要保证两个局域网没有冲突的 IP）。这就是桥的作用，在链路层无缝的沟通两个局域网。<br>
<br>
而VMWare的桥也是同样的道理，只不过，本来作为硬件的一块网卡，现在由 VMWare软件虚拟而来罢了！当采用桥接时，VMWare会虚拟一块网卡和真正的物理网卡就行桥接，这样，发到物理网卡的所有数据包就到了VMWare 虚拟机，而由VMWare发出的数据包也会通过桥从物理网卡的那端发出，这样，如果物理网卡可以上网，那么桥接的软网卡也没有问题了，这就是桥接上网的原理了。<br>
<br>
在桥接时，VMWare网卡和物理网卡应该处于同意ip网段，所以在虚拟机中ping物理网卡ip，或者在主机总ping虚拟机网卡ip，都可以ping通。<br>
<br>
<h4>NAT：</h4>
nat 就是network address translate的简称。网络地址转换，这个技术是为了让象192.168.*.*这样的私有ip段能够访问internet而开发的。私有ip段，可以由任何公司和个人使用，所以世界上有无数电脑使用了192.168.0.111这样的地址，而这个地址绝对不能出现在internet上，因为这肯定会造成路由的失败。但是，ip地址的稀缺让我们必须采用这种共享ip的方案，同时还要允许这些机器访问internet。这样的前提下，NAT就应运而生了。<br>
<br>
NAT技术应用在internet网关和路由器上，比如192.168.0.111这个地址要访问internet，它的数据包就要通过一个网关或者路由器，而网关或者路由器拥有一个能访问internet的ip地址，这样的网关和路由器就要在收发数据包时，对数据包的IP协议层数据进行更改（即 NAT），以使私有网段的主机能够顺利访问internet。<br>
<br>
我想到的一个最典型的例子，就要算我的大学宿舍了。宿舍内部网段192.168.1.× ，通过路由器进入校园局域网10.10.110.×，然后通过学校网关，进入internet。这个过程中，宿舍的路由器做了一次NAT，而学校的网关又做了一次NAT。<br>
<br>
VMWare的NAT上网采用的技术是一样的，它在主机和虚拟机之间用软件伪造出一块网卡，这块网卡和虚拟机的ip处于一个地址段。同时，在这块网卡和主机的网络接口之间进行NAT。虚拟机发出的每一块数据包都会经过虚拟网卡，然后nat，然后由主机的接口发出。<br>
<br>
由于在这种条件下，虚拟机和主机不在同一个ip段，但是主机相当于虚拟机的网关，所以虚拟机能ping到主机的ip，但是主机ping不到虚拟机的ip。<br>
<br>
<h4>Host-only:</h4>
顾名思义，这种技术提供的是主机和虚拟机之间的网络互访，而不是虚拟机访问internet的技术。如果，你只想让虚拟机和主机之间有数据交换，而不想让虚拟机访问internet，就要采用这个设置了。（我试验了一下，虚拟机还是能访问网络的，以上叙述非本人言论，呵呵）<br>
<br>
Host-only的条件下，VMWare在真正的Windows系统中，建立一块软网卡。这块网卡可以在网络连接中看到，这块网卡的作用就是使windows看到虚拟机的IP。<br>
<br>
由于，这种技术就是将主机和虚拟机通过一个ip段的网卡联系起来，所以双方都可以ping到对方。<br>
<br> <a href="http://hi.baidu.com/yangchengbo82/blog/item/0cc63bb5b28e62c637d3ca0e.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/0cc63bb5b28e62c637d3ca0e.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-19  01:05</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/0cc63bb5b28e62c637d3ca0e.html</guid>
</item>

<item>
        <title><![CDATA[VC获取系统时间、程序运行时间]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/15b1310f6899ef226159f302.html]]></link>
        <description><![CDATA[
		
		<p><font size="4">1.使用CTime类 </font></p>
<p><span style="font-size: 12pt"><font size="4">CString str;<br>
//获取系统时间<br>
CTime tm;<br>
tm=CTime::GetCurrentTime();<br>
str=tm.Format(&quot;现在时间是%Y年%m月%d日 %X&quot;);<br>
MessageBox(str,NULL,MB_OK);</font></span></p>
<p><span style="font-size: 12pt"><font size="4">2: 得到系统时间日期(使用GetLocalTime)<br>
</font></span><span style="font-size: 12pt"><br>
<font size="4">SYSTEMTIME st;<br>
CString strDate,strTime;<br>
GetLocalTime(&amp;st);<br>
strDate.Format(&quot;%4d-%2d-%2d&quot;,st.wYear,st.wMonth,st.wDay);<br>
strTime.Format(&quot;%2d:%2d:%2d&quot;,st.wHour,st.wMinute,st.wSecond);</font></span></p>
<p><font size="4">3.使用GetTickCount<br>
//获取程序运行时间<br>
long t1=GetTickCount();//程序段开始前取得系统运行时间(ms)<br>
Sleep(500);<br>
long t2=GetTickCount();();//程序段结束后取得系统运行时间(ms)<br>
str.Format(&quot;time:%dms&quot;,t2-t1);//前后之差即 程序运行时间<br>
AfxMessageBox(str);<br>
//获取系统运行时间<br>
long t=GetTickCount();<br>
CString str,str1;<br>
str1.Format(&quot;系统已运行 %d时&quot;,t/3600000);<br>
str=str1;<br>
t%=3600000;<br>
str1.Format(&quot;%d分&quot;,t/60000);<br>
str+=str1;<br>
t%=60000;<br>
str1.Format(&quot;%d秒&quot;,t/1000);<br>
str+=str1;<br>
AfxMessageBox(str);</font></p>
<p> </p>
<p><font color="#336699" size="4">如何在VC6.0中得到一个程序的运行时间，也就是这个程序耗费的时钟周期数// C和C++的时间编程 </font></p>
<p><font size="4">#include&lt;iostream&gt; <br>
#include&lt;ctime&gt; <br>
using namespace std; <br>
int main() <br>
{ <br>
time_t begin,end; <br>
begin=clock(); <br>
//这里加上你的代码 <br>
end=clock(); <br>
cout&lt;&lt;&quot;runtime: &quot;&lt;&lt;double(end-begin)/CLOCKS_PER_SEC&lt;&lt;endl; <br>
}&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;</font></p>
<p> </p>
<p><font size="4">unix时间相关,也是标准库的<br>
这些在&lt;time.h&gt;<br>
1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息;<br>
time_t timegm(struct tm *tm); </font></p>
<p><font size="4">2.mktime使用时区信息<br>
time_t mktime(struct tm *tm);</font></p>
<p><font size="4">timelocal 函数是GNU扩展的与posix函数mktime相当<br>
time_t timelocal (struct tm *tm);</font></p>
<p><font size="4">3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息;<br>
struct tm * gmtime(const time_t *clock);</font></p>
<p><font size="4">4.localtime使用时区信息<br>
struct tm * localtime(const time_t *clock);</font></p>
<p><font size="4">1.time获取时间，stime设置时间<br>
time_t t；<br>
t = time(&amp;t);<br>
2.stime其参数应该是GMT时间,根据本地时区设置为本地时间;<br>
int stime(time_t *tp)</font></p>
<p><font size="4">3.UTC=true 表示采用夏时制;<br>
4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间;<br>
5.设置时区推荐使用setup来设置;<br>
6.设置时区也可以先更变/etc/sysconfig/clock中的设置 再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效</font></p>
<p><font size="4">time_t只能表示68年的范围，即mktime只能返回1970-2038这一段范围的time_t<br>
看看你的系统是否有time_t64，它能表示更大的时间范围</font></p>
<p><br>
<font size="4">Window里面的一些不一样的</font></p>
<p><font size="4">CTime MFC类，好像就是把time.h封了个类，没扩展<br>
CTime t = GetCurrentTime();</font></p>
<p><font size="4">SYSTEMTIME 结构包含毫秒信息<br>
typedef struct _SYSTEMTIME { <br>
WORD wYear; <br>
WORD wMonth; <br>
WORD wDayOfWeek; <br>
WORD wDay; <br>
WORD wHour; <br>
WORD wMinute; <br>
WORD wSecond; <br>
WORD wMilliseconds;<br>
} SYSTEMTIME, *PSYSTEMTIME;</font></p>
<p><font size="4">SYSTEMTIME t1;<br>
GetSystemTime(&amp;t1) <br>
CTime curTime(t1); <br>
WORD ms = t1.wMilliseconds;</font></p>
<p><font size="4">SYSTEMTIME sysTm;<br>
::GetLocalTime(&amp;sysTm);</font></p>
<p><br>
<font size="4">在time.h中的_strtime() //只能在windows中用<br>
char t[11];<br>
_strtime(t);<br>
puts(t);</font></p>
<p><font size="4">------------------------------------------------------------------------------<br>
_timeb定义在SYS\TIMEB.H，有四个fields<br>
dstflag<br>
millitm<br>
time<br>
timezone</font></p>
<p><font size="4">void _ftime( struct _timeb *timeptr );</font></p>
<p><font size="4">struct _timeb timebuffer;<br>
&nbsp;&nbsp;  _ftime( &amp;timebuffer );<br>
取当前时间:文档讲可以到ms,有人测试,好象只能到16ms!</font></p>
<p><br>
<font size="4">-------------------------------------------------------------------------<br>
如何设定当前系统时间---windows<br>
SYSTEMTIME m_myLocalTime,*lpSystemTime;<br>
&nbsp;&nbsp;&nbsp;  m_myLocalTime.wYear=2003;<br>
&nbsp;&nbsp;&nbsp;  m_myLocalTime.wMonth=1;<br>
&nbsp;&nbsp;&nbsp;  m_myLocalTime.wDay=1;<br>
&nbsp;&nbsp;&nbsp;  m_myLocalTime.wHour=0;<br>
&nbsp;&nbsp;&nbsp;  m_myLocalTime.wMinute=0;<br>
&nbsp;&nbsp;&nbsp;  m_myLocalTime.wSecond=0;<br>
&nbsp;&nbsp;&nbsp;  m_myLocalTime.wMilliseconds=0;<br>
&nbsp;&nbsp;&nbsp;  lpSystemTime=&amp;m_myLocalTime;<br>
&nbsp;&nbsp;&nbsp;  if( SetLocalTime(lpSystemTime) ) //此处换成 SetSystemTime( )也不行<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MessageBox(&quot;OK !&quot;); <br>
&nbsp;&nbsp;&nbsp;  else<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MessageBox(&quot;Error !&quot;); </font></p>
<p> </p>
<p><font size="4">SYSTEMTIME m_myLocalTime,*lpSystemTime;<br>
m_myLocalTime.wYear=2003;<br>
m_myLocalTime.wMonth=1;<br>
m_myLocalTime.wDay=1;<br>
lpSystemTime=&amp;m_myLocalTime;<br>
if( SetDate(lpSystemTime) ) //此处换成 SetSystemTime( )也不行<br>
&nbsp;&nbsp;&nbsp;  MessageBox(&quot;OK !&quot;); <br>
else<br>
&nbsp;&nbsp;&nbsp;  MessageBox(&quot;Error !&quot;); </font></p>
<p> </p>
<p><font size="4">-----------------------------------------------------------------------------<br>
用clock()函数，得到系统启动以后的毫秒级时间，然后除以CLOCKS_PER_SEC，就可以换成&ldquo;秒&rdquo;，标准c函数。<br>
clock_t clock ( void );</font></p>
<p><font size="4">#include &lt;time.h&gt;<br>
clock_t t = clock();<br>
long sec = t / CLOCKS_PER_SEC;<br>
他是记录时钟周期的，实现看来不会很精确，需要试验验证；</font></p>
<p><font size="4">---------------------------------------------------------------------------<br>
据说tc2.0的time结构含有毫秒信息<br>
#include&nbsp;&nbsp;  &lt;stdio.h&gt; <br>
#include&nbsp;&nbsp;  &lt;dos.h&gt;</font></p>
<p><font size="4">int main(void) <br>
{ <br>
&nbsp;&nbsp;  struct time t;</font></p>
<p><font size="4">&nbsp;&nbsp;  gettime(&amp;t); <br>
&nbsp;&nbsp;  printf(&quot;The current time is: %2d:%02d:%02d.%02d\n&quot;, <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund); <br>
&nbsp;&nbsp;  return 0; <br>
} <br>
time 是一个结构体，， 其中成员函数 ti_hund 是豪秒。。。上程序可以在tc2.0运行</font></p>
<p><font size="4">--------------------------------------------------------------------------------<br>
这个是windows里面常用来计算程序运行时间的函数；<br>
DWORD dwStart = GetTickCount();</font></p>
<p><font size="4">//这里运行你的程序代码</font></p>
<p><font size="4">DWORD dwEnd = GetTickCount();</font></p>
<p><font size="4">则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位<br>
这个函数只精确到55ms，1个tick就是55ms。<br>
<br>
--------------------------------------------------------------------------------<br>
timeGetTime()基本等于GetTickCount()，但是精度更高<br>
DWORD dwStart = timeGetTime();</font></p>
<p><font size="4">//这里运行你的程序代码</font></p>
<p><font size="4">DWORD dwEnd = timeGetTime();</font></p>
<p><font size="4">则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位 <br>
虽然返回的值单位应该是ms,但传说精度只有10ms。<br>
--------------------------------------------------------------------------------</font></p>
<p> </p>
<p><font size="4">Borland C++ Builder VCL的时间函数</font></p>
<p><font size="4">　　1. Date<br>
　　返回TDateTime对象,包含当前的年月日信息,函数原型如下：<br>
　　System：：TDateTime __fastcall Date(void)；</font></p>
<p><font size="4">　　2. Time<br>
　　返回TDateTime对象,包含当前的时间信息,函数原型如下：<br>
　　System：：TDateTime __fastcall Time(void)；</font></p>
<p><font size="4">　　3. Now<br>
　　返回TDateTime对象,获取当前的日期和时间信息,函数原型如下：<br>
　　System：：TDateTime __fastcall Now(void)；</font></p>
<p><font size="4">　　4. DatetimeToString<br>
　　将TDateTime对象转换为指定格式的字符串对象,函数原型如下：<br>
　　void __fastcall DateTimeToString(AnsiString &amp;；Result, const AnsiString Format,System：：TDateTime DateTime)；</font></p>
<p><font size="4">　　5. DateToStr<br>
　　将TDateTime对象(包含当前年月日信息)转换为字符串对象,函数原型如下：<br>
　　AnsiString __fastcall DateToStr(System：：TDateTime Date)；</font></p>
<p><font size="4">　　6. TimeToStr<br>
　　将当前日期转换为字符串对象,函数原型如下：<br>
　　AnsiString __fastcall TimeToStr(System：：TDateTime Time)；</font></p>
<p><font size="4">　　7. DateTimetoStr<br>
　　将TDateTime对象转换为字符串对象,函数原型如下：<br>
　　AnsiString __fastcall DateTimeToStr(System：：TDateTime DateTime)；</font></p>
<p><font size="4">　　8. StrToDate<br>
　　将字符串对象转换为年月日对象,函数原型如下：<br>
　　System：：TDateTime __fastcall StrToDate(const AnsiString S)；</font></p>
<p><font size="4">　　9. StrToTime<br>
　　将字符串对象转换时间对象,函数原型如下：<br>
　　System：：TDateTime __fastcall StrToTime(const AnsiString S)；</font></p>
<p><font size="4">　　10.StrToDateTime<br>
　　将字符串对象转换为年月日时间对象,函数原型如下：<br>
　　System：：TDateTime __fastcall StrToDateTime(const AnsiString S)；</font></p>
<p><font size="4">　　11.DateTimeToSystemTime<br>
　　将TDateTime对象转换为操作系统时间,函数原型如下：<br>
　　void __fastcall DateTimeToSystemTime(System：：TDateTime DateTime, _SYSTEMTIME &amp;；SystemTime)；</font></p>
<p><font size="4">　　12.SystemTimeToDateTime<br>
　　将操作系统时间转换为TDateTime对象,函数原型如下：<br>
　　System：：TDateTime __fastcall SystemTimeToDateTime(const _SYSTEMTIME &amp;；SystemTime)；</font></p>
<p> </p>
<p><br>
<font size="4">---------------------------------------------------------------------------------------<br>
下面是转的一个用汇编的精确计时方法<br>
---------------------------------------------------------------------------------------<br>
如何获得程序或者一段代码运行的时间？你可能说有专门的程序测试工具，确实，不过你也可以在程序中嵌入汇编代码来实现。</font></p>
<p><font size="4">在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值，我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数，进而通过你的cpu的频率算出一个时钟周期的时间，从而算出程序运行的确切时间。</font></p>
<p><font size="4">我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.</font></p>
<p><font size="4">下面看看实现的代码:</font></p>
<p><font size="4">//用汇编实现获取一段代码运行的时间 <br>
#include&lt;iostream&gt;</font></p>
<p><font size="4">using namespace std;</font></p>
<p><font size="4">void GetClockNumber (long high, long low); <br>
void GetRunTime();</font></p>
<p><font size="4">int main() <br>
{&nbsp;&nbsp;&nbsp;</font></p>
<p><font size="4">long HighStart,LowStart,HighEnd,LowEnd; <br>
long numhigh,numlow; <br>
//获取代码运行开始时cpu内部计数器的值 <br>
__asm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
{ <br>
RDTSC <br>
mov HighStart, edx <br>
mov LowStart, eax <br>
} <br>
for(int i= 0; i&lt;100000; i++ ) <br>
{ <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for(int i= 0; i&lt;100000; i++ ) <br>
&nbsp;&nbsp;  { <br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  }</font></p>
<p><font size="4">} <br>
//获取代码结束时cpu内部计数器的值，并减去初值 <br>
&nbsp;&nbsp;&nbsp;  __asm <br>
{ <br>
RDTSC <br>
mov HighEnd, edx <br>
Mov LowEnd, eax <br>
;获取两次计数器值得差 <br>
sub eax, LowStart <br>
cmp eax, 0&nbsp;&nbsp;&nbsp;  ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大 <br>
jg&nbsp;&nbsp;  L1 <br>
neg&nbsp;&nbsp;  eax <br>
jmp&nbsp;&nbsp;  L2 <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  L1: mov numlow, eax <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  L2: sbb edx, HighStart <br>
mov numhigh, edx <br>
<br>
} <br>
&nbsp;&nbsp;&nbsp;  //把两个计数器值之差放在一个64位的整形变量中 <br>
&nbsp;&nbsp;&nbsp;  //先把高32位左移32位放在64的整形变量中,然后再加上低32位 <br>
__int64 timer =(numhigh&lt;&lt;32) + numlow; <br>
&nbsp;&nbsp;&nbsp;&nbsp;  //输出代码段运行的时钟周期数 <br>
&nbsp;&nbsp;&nbsp;&nbsp;  //以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^ <br>
cout&lt;&lt; (double) (timer /1.1/1000000000) &lt;&lt; endl; <br>
return 0; <br>
}</font></p>
<p><br>
<font size="4">&nbsp;&nbsp;  这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间，不过并不能得到运行的确切时间，因为即使去掉中间的循环，程序也会有个运行时间，</font></p>
<p><font size="4">因为在第一次取得计数器的值后，有两条汇编指令mov HighStart, edx&nbsp;&nbsp;&nbsp;  mov LowStart, eax这两条指令当然也有运行时间 ，当然你可以减去这两条指令的运行时间(在1.1G的机子上是3e-8s)，这样会更精确一点。</font></p>
<p><font size="4">如果你要确切知道程序的运行时间，专业的测试软件肯定会更好一点，不过好像一般没有必要获取除非专门的要求的程序。</font></p> <a href="http://hi.baidu.com/yangchengbo82/blog/item/15b1310f6899ef226159f302.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/15b1310f6899ef226159f302.html#comment">查看评论</a>]]></description>
        <pubDate>2009-03-23  16:17</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/15b1310f6899ef226159f302.html</guid>
</item>

<item>
        <title><![CDATA[matlab图像命令大全]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/e4057a4c7e6e60ffd62afc01.html]]></link>
        <description><![CDATA[
		
		<div class="bvEntry" >
<div >图像增强</div>
<div class="bvMsg" >
<p>1. 直方图均衡化的 Matlab 实现<br>
<br>
1.1 imhist 函数<br>
功能：计算和显示图像的色彩直方图<br>
格式：imhist(I,n)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  imhist(X,map)<br>
说明：imhist(I,n) 其中，n 为指定的灰度级数目，缺省值为256；imhist(X,map) 就算和显示索引色图像 X 的直方图，map 为调色板。用</p>
<p>stem(x,counts) 同样可以显示直方图。<br>
<br>
1.2 imcontour 函数<br>
功能：显示图像的等灰度值图<br>
格式：imcontour(I,n),imcontour(I,v)<br>
说明：n 为灰度级的个数，v 是有用户指定所选的等灰度级向量。<br>
<br>
1.3 imadjust 函数<br>
功能：通过直方图变换调整对比度<br>
格式：J=imadjust(I,[low high],[bottom top],gamma)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  newmap=imadjust(map,[low high],[bottom top],gamma)<br>
说明：J=imadjust(I,[low high],[bottom top],gamma) 其中，gamma 为校正量r，[low high] 为原图像中要变换的灰度范围，[bottom top]</p>
<p>指定了变换后的灰度范围；newmap=imadjust(map,[low high],[bottom top],gamma) 调整索引色图像的调色板 map 。此时若 [low high] 和</p>
<p>[bottom top] 都为2×3的矩阵，则分别调整 R、G、B 3个分量。<br>
<br>
1.4 histeq 函数<br>
功能：直方图均衡化<br>
格式：J=histeq(I,hgram)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  J=histeq(I,n)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [J,T]=histeq(I,...)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  newmap=histeq(X,map,hgram)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  newmap=histeq(X,map)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [new,T]=histeq(X,...)<br>
说明：J=histeq(I,hgram) 实现了所谓&ldquo;直方图规定化&rdquo;，即将原是图象 I 的直方图变换成用户指定的向量 hgram 。hgram 中的每一个元素</p>
<p>都在 [0,1] 中；J=histeq(I,n) 指定均衡化后的灰度级数 n ，缺省值为 64；[J,T]=histeq(I,...) 返回从能将图像 I 的灰度直方图变换成</p>
<p>图像 J 的直方图的变换 T ；newmap=histeq(X,map) 和 [new,T]=histeq(X,...) 是针对索引色图像调色板的直方图均衡。<br>
<br>
2. 噪声及其噪声的 Matlab 实现<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  imnoise 函数<br>
格式：J=imnoise(I,type)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  J=imnoise(I,type,parameter)<br>
说明：J=imnoise(I,type) 返回对图像 I 添加典型噪声后的有噪图像 J ，参数 type 和 parameter 用于确定噪声的类型和相应的参数。<br>
<br>
3. 图像滤波的 Matlab 实现<br>
<br>
3.1 conv2 函数<br>
功能：计算二维卷积<br>
格式：C=conv2(A,B)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  C=conv2(Hcol,Hrow,A)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  C=conv2(...,'shape')<br>
说明：对于 C=conv2(A,B) ，conv2 的算矩阵 A 和 B 的卷积，若 [Ma,Na]＝size(A), [Mb,Nb]=size(B), 则 size(C)=[Ma+Mb-1,Na+Nb-1];</p>
<p>C=conv2(Hcol,Hrow,A) 中，矩阵 A 分别与 Hcol 向量在列方向和 Hrow 向量在行方向上进行卷积；C=conv2(...,'shape') 用来指定 conv2</p>
<p>返回二维卷积结果部分，参数 shape 可取值如下：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  》full 为缺省值，返回二维卷积的全部结果；<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  》same 返回二维卷积结果中与 A 大小相同的中间部分；<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  valid 返回在卷积过程中，未使用边缘补 0 部分进行计算的卷积结果部分，当 size(A)&gt;size(B) 时，size(C)=[Ma-Mb+1,Na-Nb+1]</p>
<p>。<br>
<br>
3.2 conv 函数<br>
功能：计算多维卷积<br>
格式：与 conv2 函数相同<br>
<br>
3.3 filter2函数<br>
功能：计算二维线型数字滤波，它与函数 fspecial 连用<br>
格式：Y=filter2(B,X)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Y=filter2(B,X,'shape')<br>
说明：对于 Y=filter2(B,X) ，filter2 使用矩阵 B 中的二维 FIR 滤波器对数据 X 进行滤波，结果 Y 是通过二维互相关计算出来的，其大</p>
<p>小与 X 一样；对于 Y=filter2(B,X,'shape') ，filter2 返回的 Y 是通过二维互相关计算出来的，其大小由参数 shape 确定，其取值如下</p>
<p>：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  》full 返回二维相关的全部结果，size(Y)&gt;size(X)；<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  》same 返回二维互相关结果的中间部分，Y 与 X 大小相同；<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  》valid 返回在二维互相关过程中，未使用边缘补 0 部分进行计算的结果部分，有 size(Y)&lt;size(X) 。<br>
<br>
3.4 fspecial 函数<br>
功能：产生预定义滤波器<br>
格式：H=fspecial(type)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  H=fspecial('gaussian',n,sigma)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  高斯低通滤波器<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  H=fspecial('sobel')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Sobel 水平边缘增强滤波器<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  H=fspecial('prewitt')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Prewitt 水平边缘增强滤波器<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  H=fspecial('laplacian',alpha)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  近似二维拉普拉斯运算滤波器<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  H=fspecial('log',n,sigma)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  高斯拉普拉斯（LoG）运算滤波器<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  H=fspecial('average',n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  均值滤波器<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  H=fspecial('unsharp',alpha)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  模糊对比增强滤波器<br>
说明：对于形式 H=fspecial(type) ，fspecial 函数产生一个由 type 指定的二维滤波器 H ，返回的 H 常与其它滤波器搭配使用。<br>
<br>
4. 彩色增强的 Matlab 实现<br>
4.1 imfilter函数<br>
功能：真彩色增强<br>
格式：B=imfilter(A,h)<br>
说明：将原始图像 A 按指定的滤波器 h 进行滤波增强处理，增强后的图像 B 与 A 的尺寸和类型相同</p>
<p>图像的变换<br>
1. 离散傅立叶变换的 Matlab 实现<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Matlab 函数 fft、fft2 和 fftn 分别可以实现一维、二维和 N 维 DFT 算法；而函数 ifft、ifft2 和 ifftn 则用来计算反 DFT 。</p>
<p>这些函数的调用格式如下：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  A＝fft(X,N,DIM)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  其中，X 表示输入图像；N 表示采样间隔点，如果 X 小于该数值，那么 Matlab 将会对 X 进行零填充，否则将进行截取，使之长度为</p>
<p>N ；DIM 表示要进行离散傅立叶变换。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  A＝fft2(X,MROWS,NCOLS) <br>
其中，MROWS 和 NCOLS 指定对 X 进行零填充后的 X 大小。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  A＝fftn(X,SIZE)<br>
其中，SIZE 是一个向量，它们每一个元素都将指定 X 相应维进行零填充后的长度。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  函数 ifft、ifft2 和 ifftn的调用格式于对应的离散傅立叶变换函数一致。<br>
<br>
例子：图像的二维傅立叶频谱<br>
<br>
% 读入原始图像<br>
I＝imread('lena.bmp');<br>
imshow(I)<br>
% 求离散傅立叶频谱<br>
J=fftshift(fft2(I));<br>
figure;<br>
imshow(log(abs(J)),[8,10])<br>
<br>
<br>
2. 离散余弦变换的 Matlab 实现<br>
<br>
2.1. dCT2 函数<br>
功能：二维 DCT 变换<br>
格式：B=dct2(A) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  B=dct2(A,m,n) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  B=dct2(A,[m,n]) <br>
说明：B＝dct2(A) 计算 A 的 DCT 变换 B ，A 与 B 的大小相同；B＝dct2(A,m,n) 和 B=dct2(A,[m,n]) 通过对 A 补 0 或剪裁，使 B 的大</p>
<p>小为 m×n。<br>
<br>
2.2. dict2 函数<br>
功能：DCT 反变换<br>
格式：B=idct2(A) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  B=idct2(A,m,n) <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  B=idct2(A,[m,n]) <br>
说明：B＝idct2(A) 计算 A 的 DCT 反变换 B ，A 与 B 的大小相同；B＝idct2(A,m,n) 和 B=idct2(A,[m,n]) 通过对 A 补 0 或剪裁，使 B</p>
<p>的大小为 m×n。<br>
<br>
2.3. dctmtx函数<br>
功能：计算 DCT 变换矩阵<br>
格式：D＝dctmtx(n)<br>
说明：D＝dctmtx(n) 返回一个 n×n 的 DCT 变换矩阵，输出矩阵 D 为 double 类型。<br>
<br>
<br>
3. 图像小波变换的 Matlab 实现<br>
<br>
3.1 一维小波变换的 Matlab 实现<br>
(1) dwt 函数<br>
功能：一维离散小波变换<br>
格式：[cA,cD]=dwt(X,'wname')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [cA,cD]=dwt(X,Lo_D,Hi_D)<br>
说明：[cA,cD]=dwt(X,'wname') 使用指定的小波基函数 'wname' 对信号 X 进行分解，cA、cD</p>
<p>分别为近似分量和细节分量；[cA,cD]=dwt(X,Lo_D,Hi_D) 使用指定的滤波器组 Lo_D、Hi_D 对信号进行分解。<br>
(2) idwt 函数<br>
功能：一维离散小波反变换<br>
格式：X=idwt(cA,cD,'wname')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=idwt(cA,cD,Lo_R,Hi_R)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=idwt(cA,cD,'wname',L)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=idwt(cA,cD,Lo_R,Hi_R,L)<br>
说明：X=idwt(cA,cD,'wname') 由近似分量 cA 和细节分量 cD 经小波反变换重构原始信号 X 。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  'wname' 为所选的小波函数<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=idwt(cA,cD,Lo_R,Hi_R) 用指定的重构滤波器 Lo_R 和 Hi_R 经小波反变换重构原始信号 X 。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=idwt(cA,cD,'wname',L) 和 X=idwt(cA,cD,Lo_R,Hi_R,L) 指定返回信号 X 中心附近的 L 个点。<br>
<br>
3.2 二维小波变换的 Matlab 实现<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  二维小波变换的函数<br>
-------------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;  函数名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  函数功能<br>
---------------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;  dwt2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  二维离散小波变换<br>
&nbsp;&nbsp;  wavedec2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  二维信号的多层小波分解<br>
&nbsp;&nbsp;&nbsp;&nbsp;  idwt2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  二维离散小波反变换<br>
&nbsp;&nbsp;  waverec2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  二维信号的多层小波重构<br>
&nbsp;&nbsp;  wrcoef2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  由多层小波分解重构某一层的分解信号<br>
&nbsp;&nbsp;  upcoef2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  由多层小波分解重构近似分量或细节分量<br>
&nbsp;&nbsp;  detcoef2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  提取二维信号小波分解的细节分量<br>
&nbsp;&nbsp;  appcoef2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  提取二维信号小波分解的近似分量<br>
&nbsp;&nbsp;  upwlev2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  二维小波分解的单层重构<br>
&nbsp;&nbsp;  dwtpet2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  二维周期小波变换<br>
&nbsp;&nbsp;  idwtper2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  二维周期小波反变换<br>
-------------------------------------------------------------<br>
<br>
(1) wcodemat 函数<br>
功能：对数据矩阵进行伪彩色编码<br>
格式：Y=wcodemat(X,NB,OPT,ABSOL)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Y=wcodemat(X,NB,OPT)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Y=wcodemat(X,NB)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Y=wcodemat(X)<br>
说明：Y=wcodemat(X,NB,OPT,ABSOL) 返回数据矩阵 X 的编码矩阵 Y ；NB 伪编码的最大值，即编码范围为 0～NB，缺省值 NB＝16；<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  OPT 指定了编码的方式（缺省值为 'mat'），即：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  OPT＝'row' ，按行编码<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  OPT＝'col' ，按列编码<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  OPT＝'mat' ，按整个矩阵编码<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ABSOL 是函数的控制参数（缺省值为 '1'），即：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ABSOL＝0 时，返回编码矩阵<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ABSOL＝1 时，返回数据矩阵的绝对值 ABS(X)<br>
<br>
(2) dwt2 函数<br>
功能：二维离散小波变换<br>
格式：[cA,cH,cV,cD]=dwt2(X,'wname')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D)<br>
说明：[cA,cH,cV,cD]=dwt2(X,'wname')使用指定的小波基函数 'wname' 对二维信号 X 进行二维离散小波变幻；cA，cH,cV,cD 分别为近似分</p>
<p>量、水平细节分量、垂直细节分量和对角细节分量；[cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D) 使用指定的分解低通和高通滤波器 Lo_D 和 Hi_D 分</p>
<p>解信号 X 。<br>
<br>
(3) wavedec2 函数<br>
功能：二维信号的多层小波分解<br>
格式：[C,S]=wavedec2(X,N,'wname')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [C,S]=wavedec2(X,N,Lo_D,Hi_D)<br>
说明：[C,S]=wavedec2(X,N,'wname') 使用小波基函数 'wname' 对二维信号 X 进行 N 层分解；[C,S]=wavedec2(X,N,Lo_D,Hi_D) 使用指定</p>
<p>的分解低通和高通滤波器 Lo_D 和 Hi_D 分解信号 X 。<br>
<br>
(4) idwt2 函数<br>
功能：二维离散小波反变换<br>
格式：X=idwt2(cA,cH,cV,cD,'wname')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=idwt2(cA,cH,cV,cD,'wname',S)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S)<br>
说明：X=idwt2(cA,cH,cV,cD,'wname') 由信号小波分解的近似信号 cA 和细节信号 cH、cH、cV、cD 经小波反变换重构原信号 X</p>
<p>；X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R) 使用指定的重构低通和高通滤波器 Lo_R 和 Hi_R 重构原信号 X ；X=idwt2(cA,cH,cV,cD,'wname',S)</p>
<p>和 X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S) 返回中心附近的 S 个数据点。<br>
<br>
(5) waverec2 函数<br>
说明：二维信号的多层小波重构<br>
格式：X=waverec2(C,S,'wname')<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  X=waverec2(C,S,Lo_R,Hi_R)<br>
说明：X=waverec2(C,S,'wname') 由多层二维小波分解的结果 C、S 重构原始信号 X ，'wname'</p>
<p>为使用的小波基函数；X=waverec2(C,S,Lo_R,Hi_R) 使用重构低通和高通滤波器 Lo_R 和 Hi_R 重构原信号。</p>
<p> </p>
<p>图像处理工具箱<br>
1. 图像和图像数据<br>
&nbsp;&nbsp;  缺省情况下，MATLAB将图像中的数据存储为双精度类型(double)，64位浮点<br>
数，所需存储量很大；MATLAB还支持另一种类型无符号整型(uint8)，即图像矩<br>
阵中每个数据占用1个字节。<br>
&nbsp;&nbsp;  在使用MATLAB工具箱时，一定要注意函数所要求的参数类型。另外，uint8<br>
与double两种类型数据的值域不同，编程需注意值域转换。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从uint8到double的转换<br>
&nbsp;&nbsp;  ---------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  图像类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MATLAB语句<br>
&nbsp;&nbsp;  ---------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;  索引色&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  B=double(A)+1<br>
&nbsp;&nbsp;&nbsp;&nbsp;  索引色或真彩色 B=double(A)/255<br>
&nbsp;&nbsp;&nbsp;&nbsp;  二值图像&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  B=double(A)<br>
&nbsp;&nbsp;  ---------------------------------------------<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  从double到uint8的转换<br>
&nbsp;&nbsp;  ---------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  图像类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  MATLAB语句<br>
&nbsp;&nbsp;  ---------------------------------------------<br>
&nbsp;&nbsp;&nbsp;  索引色&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  B=uint8(round(A-1))<br>
&nbsp;&nbsp;&nbsp;  索引色或真彩色&nbsp;&nbsp;&nbsp;  B=uint8(round(A*255))<br>
&nbsp;&nbsp;&nbsp;  二值图像&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  B=logical(uint8(round(A)))<br>
&nbsp;&nbsp;  ---------------------------------------------<br>
<br>
2. 图像处理工具箱所支持的图像类型<br>
<br>
2.1 真彩色图像<br>
&nbsp;&nbsp;&nbsp;  R、G、B三个分量表示一个像素的颜色。如果要读取图像中(100,50)处的像素值，<br>
可查看三元数据(100,50,1:3)。<br>
&nbsp;&nbsp;&nbsp;  真彩色图像可用双精度存储，亮度值范围是[0,1]；比较符合习惯的存储方法是用无<br>
符号整型存储，亮度值范围[0,255]<br>
&nbsp;&nbsp;  <br>
2.2 索引色图像<br>
&nbsp;&nbsp;  包含两个结构，一个是调色板，另一个是图像数据矩阵。调色板是一个有3列和若干行<br>
的色彩映象矩阵，矩阵每行代表一种颜色，3列分别代表红、绿、蓝色强度的双精度数。<br>
&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  注意：MATLAB中调色板色彩强度[0,1]，0代表最暗，1代表最亮。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  常用颜色的RGB值<br>
&nbsp;&nbsp;  --------------------------------------------<br>
&nbsp;&nbsp;&nbsp;  颜色&nbsp;&nbsp;&nbsp;  R&nbsp;&nbsp;  G&nbsp;&nbsp;  B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  颜色&nbsp;&nbsp;&nbsp;  R&nbsp;&nbsp;  G&nbsp;&nbsp;  B <br>
&nbsp;&nbsp;  --------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;  黑&nbsp;&nbsp;&nbsp;&nbsp;  0&nbsp;&nbsp;  0&nbsp;&nbsp;  1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  洋红&nbsp;&nbsp;&nbsp;  1&nbsp;&nbsp;  0&nbsp;&nbsp;  1<br>
&nbsp;&nbsp;&nbsp;&nbsp;  白&nbsp;&nbsp;&nbsp;&nbsp;  1&nbsp;&nbsp;  1&nbsp;&nbsp;  1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  青蓝&nbsp;&nbsp;&nbsp;  0&nbsp;&nbsp;  1&nbsp;&nbsp;  1<br>
&nbsp;&nbsp;&nbsp;&nbsp;  红&nbsp;&nbsp;&nbsp;&nbsp;  1&nbsp;&nbsp;  0&nbsp;&nbsp;  0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  天蓝 0.67 0&nbsp;&nbsp;  1<br>
&nbsp;&nbsp;&nbsp;&nbsp;  绿&nbsp;&nbsp;&nbsp;&nbsp;  0&nbsp;&nbsp;  1&nbsp;&nbsp;  0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  橘黄&nbsp;&nbsp;&nbsp;  1 0.5 0<br>
&nbsp;&nbsp;&nbsp;&nbsp;  蓝&nbsp;&nbsp;&nbsp;&nbsp;  0&nbsp;&nbsp;  0&nbsp;&nbsp;  1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  深红&nbsp;&nbsp;  0.5 0&nbsp;&nbsp;  0<br>
&nbsp;&nbsp;&nbsp;&nbsp;  黄&nbsp;&nbsp;&nbsp;&nbsp;  1&nbsp;&nbsp;  1&nbsp;&nbsp;  0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  灰&nbsp;&nbsp;&nbsp;  0.5 0.5 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  --------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  产生标准调色板的函数<br>
&nbsp;&nbsp;  -------------------------------------------------<br>
&nbsp;&nbsp;&nbsp;  函数名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  调色板<br>
&nbsp;&nbsp;  -------------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Hsv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  色彩饱和度，以红色开始，并以红色结束<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Hot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  黑色－红色－黄色－白色<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Cool&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  青蓝和洋红的色度<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Pink&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  粉红的色度<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Gray&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  线型灰度<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Bone&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  带蓝色的灰度<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Jet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Hsv的一种变形，以蓝色开始，以蓝色结束<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Copper&nbsp;&nbsp;&nbsp;  线型铜色度<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Prim&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  三棱镜，交替为红、橘黄、黄、绿和天蓝<br>
&nbsp;&nbsp;&nbsp;&nbsp;  Flag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  交替为红、白、蓝和黑<br>
--------------------------------------------------<br>
&nbsp;&nbsp;  缺省情况下，调用上述函数灰产生一个64×3的调色板，用户也可指定调色板大小。<br>
&nbsp;&nbsp;  <br>
&nbsp;&nbsp;  索引色图像数据也有double和uint8两种类型。<br>
&nbsp;&nbsp;  当图像数据为double类型时，值1代表调色板中的第1行，值2代表第2行……<br>
&nbsp;&nbsp;  如果图像数据为uint8类型，0代表调色板的第一行，，值1代表第2行……<br>
<br>
2.3 灰度图像<br>
&nbsp;&nbsp;  存储灰度图像只需要一个数据矩阵。<br>
&nbsp;&nbsp;  数据类型可以是double，[0，1]；也可以是uint8，[0,255]<br>
<br>
2.4 二值图像<br>
&nbsp;&nbsp;  二值图像只需一个数据矩阵，每个像素只有两个灰度值，可以采用uint8或double类型存储。<br>
&nbsp;&nbsp;  MATLAB工具箱中以二值图像作为返回结果的函数都使用uint8类型。<br>
<br>
2.5 图像序列<br>
&nbsp;&nbsp;  MATLAB工具箱支持将多帧图像连接成图像序列。<br>
&nbsp;&nbsp;  图像序列是一个4维数组，图像帧的序号在图像的长、宽、颜色深度之后构成第4维。<br>
&nbsp;&nbsp;  分散的图像也可以合并成图像序列，前提是各图像尺寸必须相同，若是索引色图像，<br>
调色板也必须相同。<br>
&nbsp;&nbsp;  可参考cat()函数&nbsp;&nbsp;&nbsp;  A＝cat(4,A1,A2,A3,A4,A5)<br>
<br>
3. MATLAB图像类型转换<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  图像类型转换函数<br>
&nbsp;&nbsp;  ---------------------------------------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;  函数名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  函数功能<br>
&nbsp;&nbsp;  ---------------------------------------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;  dither&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  图像抖动，将灰度图变成二值图，或将真彩色图像抖动成索引色图像<br>
&nbsp;&nbsp;&nbsp;  gray2ind&nbsp;&nbsp;&nbsp;  将灰度图像转换成索引图像<br>
&nbsp;&nbsp;&nbsp;  grayslice&nbsp;&nbsp;&nbsp;  通过设定阈值将灰度图像转换成索引色图像<br>
&nbsp;&nbsp;&nbsp;&nbsp;  im2bw&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  通过设定亮度阈值将真彩色、索引色、灰度图转换成二值图<br>
&nbsp;&nbsp;&nbsp;  ind2gray&nbsp;&nbsp;&nbsp;  将索引色图像转换成灰度图像<br>
&nbsp;&nbsp;&nbsp;  ind2rgb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  将索引色图像转换成真彩色图像<br>
&nbsp;&nbsp;&nbsp;  mat2gray&nbsp;&nbsp;  将一个数据矩阵转换成一副灰度图<br>
&nbsp;&nbsp;&nbsp;  rgb2gray&nbsp;&nbsp;&nbsp;  将一副真彩色图像转换成灰度图像<br>
&nbsp;&nbsp;&nbsp;  rgb2ind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  将真彩色图像转换成索引色图像<br>
&nbsp;&nbsp;  ----------------------------------------------------------------------------<br>
<br>
4. 图像文件的读写和查询<br>
<br>
4.1 图形图像文件的读取<br>
&nbsp;&nbsp;  利用函数imread()可完成图形图像文件的读取，语法：<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;  A=imread(filename,fmt)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  [X,map]=imread(filename,fmt)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  [...]=imread(filename)<br>
&nbsp;&nbsp;&nbsp;&nbsp;  [...]=imread(filename,idx) （只对TIF格式的文件）<br>
&nbsp;&nbsp;&nbsp;&nbsp;  [...]=imread(filename,ref) （只对HDF格式的文件）<br>
<br>
&nbsp;&nbsp;  通常，读取的大多数图像均为8bit，当这些图像加载到内存中时，Matlab就将其存放<br>
在类uint8中。此为Matlab还支持16bit的PNG和TIF图像，当读取这类文件时，Matlab就将<br>
其存贮在uint16中。<br>
<br>
&nbsp;&nbsp;  注意：对于索引图像，即使图像阵列的本身为类uint8或类uint16，imread函数仍将<br>
颜色映象表读取并存贮到一个双精度的浮点类型的阵列中。<br>
<br>
4.2 图形图像文件的写入<br>
&nbsp;&nbsp;  使用imwrite函数，语法如下：<br>
<br>
&nbsp;&nbsp;  imwrite(A,filename,fmt)<br>
&nbsp;&nbsp;  imwrite(X,map,filename,fmt)<br>
&nbsp;&nbsp;  imwrite(...,filename)<br>
&nbsp;&nbsp;  imwrite(...,parameter,value)<br>
<br>
&nbsp;&nbsp;  当利用imwrite函数保存图像时，Matlab缺省的方式是将其简化道uint8的数据格式。<br>
<br>
4.3 图形图像文件信息的查询&nbsp;&nbsp;  imfinfo()函数<br>
<br>
5. 图像文件的显示<br>
<br>
5.1 索引图像及其显示<br>
<br>
&nbsp;&nbsp;  方法一：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  image(X)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  colormap(map)<br>
<br>
&nbsp;&nbsp;  方法二： <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  imshow(X,map)<br>
<br>
5.2 灰度图像及其显示<br>
&nbsp;&nbsp;  Matlab 7.0 中，要显示一副灰度图像，可以调用函数 imshow 或 imagesc （即 <br>
imagescale，图像缩放函数）<br>
<br>
&nbsp;&nbsp;  (1) imshow 函数显示灰度图像<br>
&nbsp;&nbsp;&nbsp;  使用 imshow(I)&nbsp;&nbsp;&nbsp;  或 使用明确指定的灰度级书目：imshow(I,32)<br>
&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;  由于Matlab自动对灰度图像进行标度以适合调色板的范围，因而可以使用自定义<br>
大小的调色板。其调用格式如下：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  imshow(I,[low,high])<br>
&nbsp;&nbsp;&nbsp;  其中，low 和 high 分别为数据数组的最小值和最大值。<br>
<br>
&nbsp;&nbsp;  (2) imagesc 函数显示灰度图像<br>
&nbsp;&nbsp;  下面的代码是具有两个输入参数的 imagesc 函数显示一副灰度图像<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  imagesc(1,[0,1]);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  colormap(gray);<br>
&nbsp;&nbsp;&nbsp;  imagesc 函数中的第二个参数确定灰度范围。灰度范围中的第一个值（通常是0），<br>
对应于颜色映象表中的第一个值（颜色），第二个值（通常是1）则对应与颜色映象表<br>
中的最后一个值（颜色）。灰度范围中间的值则线型对应与颜色映象表中剩余的值（颜色）。<br>
<br>
&nbsp;&nbsp;&nbsp;  在调用 imagesc 函数时，若只使用一个参数，可以用任意灰度范围显示图像。在该<br>
调用方式下，数据矩阵中的最小值对应于颜色映象表中的第一个颜色值，数据矩阵中的最大<br>
值对应于颜色映象表中的最后一个颜色值。<br>
<br>
5.3 RGB 图像及其显示<br>
&nbsp;&nbsp;  (1) image(RGB) <br>
&nbsp;&nbsp;  不管RGB图像的类型是double浮点型，还是 uint8 或 uint16 无符号整数型，Matlab都<br>
能通过 image 函数将其正确显示出来。<br>
<br>
&nbsp;&nbsp;  RGB8 = uint8(round(RGB64×255)); ％ 将 double 浮点型转换为 uint8 无符号整型<br>
&nbsp;&nbsp;  RGB64 = double(RGB8)/255;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ％ 将 uint8 无符号整型转换为 double 浮点型<br>
&nbsp;&nbsp;  RGB16 = uint16(round(RGB64×65535)); ％ 将 double 浮点型转换为 uint16 无符号整型 <br>
&nbsp;&nbsp;  RGB64 = double(RGB16)/65535;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ％ 将 uint16 无符号整型转换为 double 浮点型<br>
<br>
&nbsp;&nbsp;  (2) imshow(RGB) 参数是一个 m×n×3 的数组<br>
<br>
5.4 二进制图像及其显示<br>
<br>
&nbsp;&nbsp;  (1) imshow(BW)<br>
&nbsp;&nbsp;  在 Matlab 7.0 中，二进制图像是一个逻辑类，仅包括 0 和 1 两个数值。像素 0 显示<br>
为黑色，像素 1 显示为白色。<br>
&nbsp;&nbsp;  显示时，也可通过NOT(~)命令，对二进制图象进行取反，使数值 0 显示为白色；1 显示<br>
为黑色。 <br>
&nbsp;&nbsp;  例如： imshow(~BW)<br>
<br>
&nbsp;&nbsp;  (2) 此外，还可以使用一个调色板显示一副二进制图像。如果图形是 uint8 数据类型，<br>
则数值 0 显示为调色板的第一个颜色，数值 1 显示为第二个颜色。<br>
&nbsp;&nbsp;  例如： imshow(BW,[1 0 0;0 0 1])&nbsp;&nbsp;  <br>
<br>
5.5 直接从磁盘显示图像<br>
&nbsp;&nbsp;  可使用一下命令直接进行图像文件的显示： <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  imshow filename<br>
&nbsp;&nbsp;  其中，filename 为要显示的图像文件的文件名。<br>
<br>
&nbsp;&nbsp;  如果图像是多帧的，那么 imshow 将仅显示第一帧。但需注意，在使用这种方式时，图像<br>
数据没有保存在Matlab 7.0 工作平台。如果希望将图像装入工作台中，需使用 getimage 函<br>
数，从当前的句柄图形图像对象中获取图像数据，<br>
&nbsp;&nbsp;  命令形式为： rgb ＝ getimage;</p>
<p> </p>
<p> </p>
<p>bwlabel <br>
功能： <br>
标注二进制图像中已连接的部分。 <br>
L = bwlabel(BW,n) <br>
[L,num] = bwlabel(BW,n)</p>
<p>isbw <br>
功能： <br>
判断是否为二进制图像。 <br>
语法： <br>
flag = isbw(A) <br>
相关命令： <br>
isind, isgray, isrgb <br>
74．isgray <br>
功能： <br>
判断是否为灰度图像。 <br>
语法： <br>
flag = isgray(A) <br>
相关命令： <br>
isbw, isind, isrgb</p>
<p>11．bwselect <br>
功能： <br>
在二进制图像中选择对象。 <br>
语法： <br>
BW2 = bwselect(BW1,c,r,n) <br>
BW2 = bwselect(BW1,n) <br>
[BW2,idx] = bwselect(...) <br>
举例 <br>
BW1 = imread('text.tif'); <br>
c = [16 90 144]; <br>
r = [85 197 247]; <br>
BW2 = bwselect(BW1,c,r,4); <br>
imshow(BW1) <br>
figure, imshow(BW2)</p>
<p>47．im2bw <br>
功能： <br>
转换图像为二进制图像。 <br>
语法： <br>
BW = im2bw(I,level) <br>
BW = im2bw(X,map,level) <br>
BW = im2bw(RGB,level) <br>
举例 <br>
load trees <br>
BW = im2bw(X,map,0.4); <br>
imshow(X,map)</p>
</div>
</div> <a href="http://hi.baidu.com/yangchengbo82/blog/item/e4057a4c7e6e60ffd62afc01.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/e4057a4c7e6e60ffd62afc01.html#comment">查看评论</a>]]></description>
        <pubDate>2008-09-27  16:38</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/e4057a4c7e6e60ffd62afc01.html</guid>
</item>

<item>
        <title><![CDATA[Matlab常见问题集锦]]></title>
        <link><![CDATA[http://hi.baidu.com/yangchengbo82/blog/item/5d9bb016cc6a1f1e962b4336.html]]></link>
        <description><![CDATA[
		
		matlab安装、运行与其他问题集锦
<p style="text-indent: 2em">Q1：matlab有没有监视内存的方法?</p>
<p style="text-indent: 2em">A： 用函数whos。</p>
<p style="text-indent: 2em">Q2：如何解决matlab7.0命令窗口跳出一大堆java错误...</p>
<p style="text-indent: 2em">A：换matlab 7的sp2。</p>
<p style="text-indent: 2em">Q3：自从安装matlab，一开机就在进程里有matlab。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  能不能开机的时候进程就不运行matlab？</p>
<p style="text-indent: 2em">A： 开始--&gt;控制面板--&gt;管理工具--&gt;服务</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  把MATLAB Server的属性改成&ldquo;手动&rdquo;就行了。</p>
<p style="text-indent: 2em">Q4：退出matlab7程序运行的快捷键。</p>
<p style="text-indent: 2em">A：  ctrl+q</p>
<p style="text-indent: 2em">Q5：matlab7远程控制是否有限制？</p>
<p style="text-indent: 2em">A：不能远程控制,不过你可以先在你的remote机器上打开,然后就可以用了。</p>
<p style="text-indent: 2em">Q6：Matlab占用资源太多怎么办？</p>
<p style="text-indent: 2em">A： 用matlab -nojvm启动（如果不需要图形界面）。</p>
<p style="text-indent: 2em">Q7：怎样给matlab添加新的toolbox？</p>
<p style="text-indent: 2em">A：  在matlab的文件菜单里边添加路径，选set path。</p>
<p style="text-indent: 2em">Q8：请问matlab有没有命令可以调出历史输入啊？</p>
<p style="text-indent: 2em">A：  command history 窗口。</p>
<p style="text-indent: 2em">Q9：matlab 7.0 不能在64位的cpu下运行？</p>
<p style="text-indent: 2em">A： matlab 应该是依赖于自己的虚拟机的</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  但是好像这个虚拟机是在 IA32 里面作出来的，所以，应该找个带 64 位的</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  java 虚拟机替换原来的，不过不一定能行 or so,记不清了）</p>
<p style="text-indent: 2em">Q10：matlab有没有注释一段的功能？</p>
<p style="text-indent: 2em">A：  选中一段代码，ctrl r就是区段注释</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  选中一段代码，ctrl t取消区段注释</p>
<p style="text-indent: 2em">Q11：今有WINDOWS版MATLAB7，启动时只出现版权画面，然后进程结束。</p>
<p style="text-indent: 2em">A:&nbsp;&nbsp;  用matlab -nojvm可以启动，但是报了OpenGL错误的信息，估计是显卡比较</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  差或驱动程序不好。在显示属性里关闭硬件加速即可。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  matlab常用命令参考</p>
<p style="text-indent: 2em">1、学会用help和doc函数。</p>
<p style="text-indent: 2em">2、输入输出文件：save/load</p>
<p style="text-indent: 2em">&nbsp;&nbsp;  在屏幕上显示文件：type</p>
<p style="text-indent: 2em">3、解线性方程组AX=B：X=A\B</p>
<p style="text-indent: 2em">4、作图时两张曲线合并：hold on或者subplot作子图</p>
<p style="text-indent: 2em">5、程序计算时间：tic，toc或者clock</p>
<p style="text-indent: 2em">6、变量显示方式更改：format long/short/bank...</p>
<p style="text-indent: 2em">7、数组元素求和：sum</p>
<p style="text-indent: 2em">8、求数组长度：length</p>
<p style="text-indent: 2em">&nbsp;&nbsp;  求矩阵维数：size或者ndims  矩阵元素个数：numel</p>
<p style="text-indent: 2em">9、函数作图：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;  饼图：pie/pie3&nbsp;&nbsp;&nbsp;  误差图：errorbar&nbsp;&nbsp;&nbsp;&nbsp;  散点图：scatter/scatter3</p>
<p style="text-indent: 2em">&nbsp;&nbsp;  直方图：hist&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  函数图：fplot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  动画：movie</p>
<p style="text-indent: 2em">10、矩阵分析：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  左右翻转：fliplr&nbsp;&nbsp;&nbsp;  上下翻转：flipud&nbsp;&nbsp;&nbsp;  转置：transpose</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  矩阵求逆：inv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  矩阵范数：norm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  条件数：cond</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  初等变换：rref&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  特征值：eig/eigs</p>
<p style="text-indent: 2em">11、特殊矩阵：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  元素全为1的矩阵：ones&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  元素全为0的矩阵：zeros</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  单位阵：eye&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  魔方阵：magic</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  线性变化数组：linspace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  聚合矩阵：cat/horzcat/vertcat</p>
<p style="text-indent: 2em">12、随机数：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  创建一个元素服从均匀分布的随机数数组：rand</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  创建一个元素服从正态分布的随机数数组：randn</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  二项分布：binornd  指数分布：exprnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  F分布：frnd</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  几何分布：geornd&nbsp;&nbsp;  超几何分布：hygernd&nbsp;&nbsp;&nbsp;  泊松分布：poissrnd</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  正态分布：normrnd  离散均匀分布：unidrnd  连续均匀分布：unifrnd</p>
<p style="text-indent: 2em">13、清屏：clc  清理内存：clear</p>
<p style="text-indent: 2em">14、字体显示变更等：preferences</p>
<p style="text-indent: 2em">15、得到一个文件夹的所有文件名：ls</p>
<p style="text-indent: 2em">16、语句太长的话可以再句末加...换行。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  matlab与其他软件调用问题集锦</p>
<p style="text-indent: 2em">Q1：如何在c++里可以调用matlab6.5的数学库？</p>
<p style="text-indent: 2em">A： 6.5版的第三张cd里的cppmath_ug2b.pdf、cppmath_ref2b.pdf</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  比较详细的介绍了Matlab C++ Math Library</p>
<p style="text-indent: 2em">Q2：matlab的库能生成c代码吗？</p>
<p style="text-indent: 2em">A： 库就是compile过，等着被其它程序link的，</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  即能得到效率又能隐藏算法，都放在matlab安装目录的\extern\lib;\bin\win32</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  下面要看算法的话，就查阅help，一般会简单地介绍下算法，或者用到的文献什</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  么的。库是帮你写好的算法，用就可以了:)</p>
<p style="text-indent: 2em">Q3：关于matlab中的xlsread函数</p>
<p style="text-indent: 2em">A：这个函数可以读出excel数据。先把excel里面数据复制粘贴到记事本，</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  再textread进去。</p>
<p style="text-indent: 2em">Q4：请问如何在matlab中插入c代码？</p>
<p style="text-indent: 2em">A：需要把c代码编译成mex文件，需要把c代码编译成mex文件。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  6.5版的第三张cd里的apiext.pdf、apiref.pdf介绍了怎么把c代码编译成mex。</p>
<p style="text-indent: 2em">Q5：如何将excel数据导入matlab?</p>
<p style="text-indent: 2em">A： ExcelLink。</p>
<p style="text-indent: 2em">Q6：java如何和matlab互相调用？</p>
<p style="text-indent: 2em">A： matlab环境（完整环境）内置了java虚拟机，所以普通的java类都可以在matlab环境</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  中直接使用。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  事实上matlab很多程序例如界面，还有数据库借口，都是由java创建的。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  关于java与matlab数据的交互，帮助上讲的比较清楚。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  matlab插值与拟合问题集锦</p>
<p style="text-indent: 2em">Q1：就是给出几个点，要求一个给定阶数的多项式，使他最接近这几个点。类似?[0m</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  线性回归。</p>
<p style="text-indent: 2em">A： [a,S]=polyfit(x,y,n)</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  [ye,delta]=ployval(a,x,S)</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  %a为所得的多项式系数</p>
<p style="text-indent: 2em">Q2：如何做最简单的一维拟合？</p>
<p style="text-indent: 2em">A： yy=spline(x,y,xx)</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  matlab图形与图象问题集锦</p>
<p style="text-indent: 2em">Q1：比如一个函数C(x,y,z)，想做一个3维等值面图，该如何做？</p>
<p style="text-indent: 2em">A： help contour3/help uicontrol 在plot出来的figure上做个小控件吧。</p>
<p style="text-indent: 2em">Q2：请问怎么把MATLAB里用程序实现的动画导入到Powerpoint演示呢？</p>
<p style="text-indent: 2em">A： matlab有avifile,getframe,addframe,pause等做avi动画的函数的。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  做好的avi放在ppt，如果要暂停之类的功能，是ppt或者播放器的事情了。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  matlab提供了com组件来和其它应用程序进行通信在ppt里写个vba调用matlab。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  细节可以在help文档里查找vba和com关键字</p>
<p style="text-indent: 2em">Q3：我们可以用subplot画出两个不同的曲面图，那怎么样才能使得这两个曲面图</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  各自用到不同的颜色对照表呢？如果画完一个然后用不同的colormap，</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  两张图会变成一样的。</p>
<p style="text-indent: 2em">A：如果是曲面图的话 atch对象或者surface对象自己有颜色映射表的。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  其实说白了，colormap也是对颜色的索引罢了，例如surface对象而言，也就是第</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  三位的颜色表。支持的形式有两种:索引以及RGB直接表示.采用第二种就可以解决</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  这个问题.毕竟对于figure对象而言,colormap没有太大的意义.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  以下附实现的方法,以供讨论: （见合集2005年之38）</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  原理是通过改变caxis的值。</p>
<p style="text-indent: 2em">Q4：虽然用subplot可以在一个窗口中显示多幅图像，但是每幅图像之间有较大间距。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  现在想让多幅图像紧挨着显示(比如说2行两列共4个图像)，该如何实现？</p>
<p style="text-indent: 2em">A： subplot('Position',[left bottom width height])</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  或者axes('PropertyName',PropertyValue,...)</p>
<p style="text-indent: 2em">Q5：matlab 怎么画球？</p>
<p style="text-indent: 2em">A： sphere函数。</p>
<p style="text-indent: 2em">Q6：matlab由图上直接取某个值命令？</p>
<p style="text-indent: 2em">A：ginput。</p>
<p style="text-indent: 2em">Q7：请问用什么命令可以让figure窗口中的图形输出到指定的文件中？</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  图片数量很大。</p>
<p style="text-indent: 2em">A： print和matlab 的 notebook 功能</p>
<p style="text-indent: 2em">Q8：怎么能让一个plot命令执行完了以后重新开一个chart window画下一个图？</p>
<p style="text-indent: 2em">A： figure。</p>
<p style="text-indent: 2em">Q9：请教matlab坐标不等距画图。如果坐标轴上标的量希望不要均匀应该怎么操作？</p>
<p style="text-indent: 2em">A： semilogy/xtick,ytick。</p>
<p style="text-indent: 2em">Q10：如何在matlab中接摄像头自动获取图像?</p>
<p style="text-indent: 2em">A:&nbsp;&nbsp;  比较简单的是调用现成的Activex、Com控件来完成，缺点是至今无法编译。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  第二种是自己写硬件接口，优点是可以编译，并且自定功能，缺点是耗时。</p>
<p style="text-indent: 2em">Q11：请问matlab绘图能有动态效果吗？</p>
<p style="text-indent: 2em">A：  延时、清屏、重画。ing like that</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  如果闪烁的话打开double buffer</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  高兴的话还可以做成avi movie(frame2avi or so）</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  还有慧星图 comet</p>
<p style="text-indent: 2em">Q12：怎么样更改colorbar中的字体？</p>
<p style="text-indent: 2em">A：  colorbar说白了就是一个axes对象.</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  这样:了傅幕按蚩猟ouble buffer</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  ColorbarHandle = colorbar ;(frame2avi or so）</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  set(ColorbarHandle, 'FontSize', 20);</p>
<p style="text-indent: 2em">Q13：请问matlab中画多张图如何使用同一的colorbar?</p>
<p style="text-indent: 2em">A：  z值映射到colormap，colorbar通过z值和colormap的映射关系生成的，所以需要</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;  将不同的figure，z值映射相同的colormap索引。</p>
<p style="text-indent: 2em">Q14：在MATLAB里如何显示一副图像，但使其背景为透明的？</p>
<p style="text-indent: 2em">A：  用 image 画了之后再把 axis 关掉（axis off）</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  matlab运筹与统计问题集锦</p>
<p style="text-indent: 2em">Q1：在matlab7.0中求解线形规划的函数？</p>
<p style="text-indent: 2em">A： linprog一般能直接给出结果，参数设定可参阅help。</p>
<p style="text-indent: 2em">Q2：matlab中如何做回归分析？</p>
<p style="text-indent: 2em">A： Statistics Toolbox。</p>
<p style="text-indent: 2em">Q3：已知两个正态分布的均值和方差，matlab里有什么函数可以直接求出来？</p>
<p style="text-indent: 2em">A： 用fminsearch函数。</p>
<p style="text-indent: 2em">Q4：已知两个变量符合一个联合正态分布参数，能否用matlab生成这两个随机数？</p>
<p style="text-indent: 2em">A：先生成两个独立正态随机数，然后利用正态分布的性质，用线性变换过去。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;  也可参阅statistics toolbox中类似于 multirnd 还是什么</p>
<p style="text-indent: 2em">Q5：求解一个不等式外加两个约束条件用什么函数好呢？</p>
<p style="text-indent: 2em">A：试试用规划中的fmincon函数。</p> <a href="http://hi.baidu.com/yangchengbo82/blog/item/5d9bb016cc6a1f1e962b4336.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/yangchengbo82/blog/category/%D7%AA%D5%AA">转摘</a>&nbsp;<a href="http://hi.baidu.com/yangchengbo82/blog/item/5d9bb016cc6a1f1e962b4336.html#comment">查看评论</a>]]></description>
        <pubDate>2008-09-24  22:57</pubDate>
        <category><![CDATA[转摘]]></category>
        <author><![CDATA[yangchengbo82]]></author>
		<guid>http://hi.baidu.com/yangchengbo82/blog/item/5d9bb016cc6a1f1e962b4336.html</guid>
</item>


</channel>
</rss>