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

📄 lion-tut-c12.htm

📁 内有一些代码
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<HTML>
<head>
<link rel="stylesheet" href="../../asm.css">

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Iczelion's win32 asm tutorial</title>
</head>

<body bgcolor="#FFFFFF" background="../../images/back01.jpg">
<P align=center><FONT color=#0000ff>第十二课 内存管理和文件输入/输出</FONT></P>
<HR SIZE=1>
本课中我们将学习基本的内存管理和文件输入/输出操作方面的知识。另外我们还将用上课学的通用对话框作为我们的显示“设备”。 
<P><FONT color=#ff0000>理论:</FONT> 
<P>从用户的角度来看,WIN32的内存管理是非常简单和明了的。每一个应用程序都有自己独立的4G地址空间,这种内存模式叫做“平坦”型地址模式,所有的段寄存器或描述符都指向同样的起始地址,所有的地址偏移都是32位的长度,这样一个应用程序无须变换选择符就可以存取自己的多达4G的地址空间。这种内存管理模式是非常简洁而便于管理的,而且我们再不用和那些令人讨厌的“near”和“far”指针打交道了。<BR>
  在W16下有两种主要类型的API:全局和局部。“全局”的API 分配在其他的段中,这样从内存角度来看他们是一些“far”(远)函数或者叫远过程调用,“局部”API只要和进程的堆打交道,所以把它们叫做“near”(近)函数或者近过程调用。而在WIN32中,这两种内存模式是相同的,无论您调用GlobalAlloc还是LocalAlloc,结果都是一样。<BR>
  至于分配和使用内存的过程都是一样的: 
<OL>
  <LI>调用GlobalAlloc函数分配一块内存,该函数会返回分配的内存句柄。 
  <LI>调用GlobalLock函数锁定内存块,该函数接受一个内存句柄作为参数,然后返回一个指向被锁定的内存块的指针。 
  <LI>您可以用该指针来读写内存。 
  <LI>调用GlobalUnlock函数来解锁先前被锁定的内存,该函数使得指向内存块的指针无效。 
  <LI>调用GlobalFree函数来释放内存块。您必须传给该函数一个内存句柄。 </LI>
</OL>
<P>在WIN32中您也可以用“Local”替代内存分配API函数带有“Global”字样的函数中的“Global”,也即用LocalAlloc、LocalLock等。<BR>
  在调用函数GlobalAlloc时使用GMEM_FIXED标志位可以更进一步简化操作。使用了该标志后,Global/LocalAlloc返回的是指向已分配内存的指针而不是句柄,这样也就不用调用Global/LocalLock来锁定内存了,释放内存时只要直接调用Global/LocalFree就可以了。不过在本课中我们只使用传统的方法,因为其它地方有许多的源代码是用这种方法写的。</P>
<P>WIN32的文件输入/输出API和DOS下的从外表上看几乎一样(译者注:也许不管内部实现多么不同,可以想象所有的文件系统暴露给应用程序编写者的接口的功能应该基本相同),不同的只是把DOS下的中断方式处理文件输入/输出变成了对API函数的调用。以下是基本的步骤: 
  <BR>
  &nbsp; 
<OL>
  <LI>调用CreateFile函数生成一个文件,该函数可以应用在多方面,除了磁盘文件外,我们还可以用来打开通讯端口、管道、驱动程序或控制台。如果成功的话,会返回指向文件或设备的句柄。然后可以使用该句柄去完成对文件或设备操作。<BR>
    调用SetFilePointer来把文件指针移到想读写的地方。. 
  <LI>然后调用ReadFile 或 WriteFile来完成实际的读写。这些函数会自己处理文件和内存之间的数据传送,这样免得您自己去做分配内存等繁杂的琐事。 
  <LI>调用CloseHandle来关闭文件。该函数接受一个先前打开的文件句柄。 </LI>
</OL>
<P><FONT color=#ff0000>内容:</FONT></P>
<P>下面的代码段演示了:打开一个“打开文件”对话框,用户可以选择打开一个文本文件,然后在一个编辑控件中打开该文本文件的内容,另外用户还可以编辑该文本文件的内容并选择保存。</P>
<P><B>.386</B> <BR>
  <B>.model flat,stdcall</B> <BR>
  <B>option casemap:none</B> <BR>
  <B>WinMain proto :DWORD,:DWORD,:DWORD,:DWORD</B> <BR>
  <B>include \masm32\include\windows.inc</B> <BR>
  <B>include \masm32\include\user32.inc</B> <BR>
  <B>include \masm32\include\kernel32.inc</B> <BR>
  <B>include \masm32\include\comdlg32.inc</B> <BR>
  <B>includelib \masm32\lib\user32.lib</B> <BR>
  <B>includelib \masm32\lib\kernel32.lib</B> <BR>
  <B>includelib \masm32\lib\comdlg32.lib</B> 
<P><B>.const</B> <BR>
  <B>IDM_OPEN equ 1</B> <BR>
  <B>IDM_SAVE equ 2</B> <BR>
  <B>IDM_EXIT equ 3</B> <BR>
  <B>MAXSIZE equ 260</B> <BR>
  <B>MEMSIZE equ 65535</B> 
<P><B>EditID equ 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  ; ID of the edit control</B> 
<P><B>.data</B> <BR>
  <B>ClassName db "Win32ASMEditClass",0</B> <BR>
  <B>AppName&nbsp; db "Win32 ASM Edit",0</B> <BR>
  <B>EditClass db "edit",0</B> <BR>
  <B>MenuName db "FirstMenu",0</B> <BR>
  <B>ofn&nbsp;&nbsp; OPENFILENAME &lt;&gt;</B> <BR>
  <B>FilterString db "All Files",0,"*.*",0</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  db "Text Files",0,"*.txt",0,0</B> <BR>
  <B>buffer db MAXSIZE dup(0)</B> 
<P><B>.data?</B> <BR>
  <B>hInstance HINSTANCE ?</B> <BR>
  <B>CommandLine LPSTR ?</B> <BR>
  <B>hwndEdit HWND ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  ; Handle to the edit control</B> <BR>
  <B>hFile HANDLE ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  ; File handle</B> <BR>
  <B>hMemory HANDLE ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  ;handle to the allocated memory block</B> <BR>
  <B>pMemory DWORD ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  ;pointer to the allocated memory block</B> <BR>
  <B>SizeReadWrite DWORD ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  ; number of bytes actually read or write</B> 
<P><B>.code</B> <BR>
  <B>start:</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke GetModuleHandle, NULL</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; hInstance,eax</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke GetCommandLine<BR>
  &nbsp;&nbsp;&nbsp;&nbsp;mov CommandLine,eax</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke ExitProcess,eax</B> 
<P><B>WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:SDWORD</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp; LOCAL wc:WNDCLASSEX</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; LOCAL msg:MSG</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; LOCAL hwnd:HWND</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.cbSize,SIZEOF WNDCLASSEX</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.style, CS_HREDRAW or CS_VREDRAW</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.lpfnWndProc, OFFSET WndProc</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.cbClsExtra,NULL</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.cbWndExtra,NULL</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; push&nbsp; hInst</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; wc.hInstance</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.hbrBackground,COLOR_WINDOW+1</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.lpszMenuName,OFFSET MenuName</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.lpszClassName,OFFSET ClassName</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke LoadIcon,NULL,IDI_APPLICATION</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.hIcon,eax</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.hIconSm,eax</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke LoadCursor,NULL,IDC_ARROW</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; wc.hCursor,eax</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke RegisterClassEx, addr wc</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR 
  AppName,\</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CW_USEDEFAULT,300,200,NULL,NULL,\</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hInst,NULL</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; hwnd,eax</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke ShowWindow, hwnd,SW_SHOWNORMAL</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; invoke UpdateWindow, hwnd</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; .WHILE TRUE</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke GetMessage, ADDR msg,NULL,0,0</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .BREAK .IF (!eax)</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke TranslateMessage, ADDR 
  msg</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke DispatchMessage, ADDR msg</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp; .ENDW</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax,msg.wParam</B> <BR>
  <B>&nbsp;&nbsp;&nbsp; ret</B> <BR>
  <B>WinMain endp</B> 
<P><B>WndProc proc uses ebx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM</B> 
  <BR>
  <B>&nbsp;&nbsp;&nbsp; .IF uMsg==WM_CREATE</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke CreateWindowEx,NULL,ADDR 
  EditClass,NULL,\</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or\</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  ES_AUTOHSCROLL or ES_AUTOVSCROLL,0,\</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  0,0,0,hWnd,EditID,\</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  hInstance,NULL</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov hwndEdit,eax</B> <BR>
  <B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke SetFocus,hwndEdit</B> <BR>

⌨️ 快捷键说明

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