FASM---Win32汇编学习14

本文详细介绍了Windows API中的内存管理,包括GlobalAlloc、GlobalLock等函数的使用,以及文件输入/输出操作,如CreateFile、ReadFile、WriteFile等。通过示例代码展示了如何打开、读取、编辑和保存文本文件内容。
摘要由CSDN通过智能技术生成
     FASM---Win32汇编学习14
                               
   

       本课中我们来学习基本的内存管理和文件输入/输出操作方面的知识。另外我们需要用到我们上节课学到的通用对话框来作为显示设备。

理论:

     从用户的角度来说:win32内存是非常简单和明了的。每一个用户进程都有独立的4GB地址空间,这种内存模式叫做"平坦"型地址模式。所有的段寄存器或描述符都指向同样的起始地址,所有的偏移都是32位长。这样一个应用程序无需变换选择符就可以存取自己多大4GB的地址空间。这种内存管理是非常简洁和便于管理的。
而且我们再也不用和那些令人讨论的“near”和:“far”指针打交道了。

    在win16下有两种类型的api:全局和局部。“全局”的api分配在其他的段中,这样从内存角度看他们是一些“far(远)”函数或者交远过程调用,“局部”api只要和进程的堆打交道,所以把他们叫做“near(近)”函数或者是近过程调用。而在win32中,这两种模式是相同的。不论你调用GlobalAlloc还是LocalAlloc,结果都是一样。至于分配和使用的内存的过程都是一样的:

 

    1.调用GlobalAlloc函数分配一块内存,该函数返回分配的内存句柄。

    2.调用GlobalLock函数锁定内存块,该函数接受一个内存句柄作为参数,函数返回一个指向锁定内存块的指针。

   3.您可以用该指针来读写内存。

    4.调用GlobalUnLock函数来解锁之前锁定的内存,该函数使得指向内存块的指针无效。

    5.调用GlobalFree函数来释放内存块,您必须传给该函数一个内存句柄。

 

   在win32中您可以使用“Local”来替代内存api函数带有“Global”字样函数中的“Global”,也即用LocalAlloc,LocalLock等。在调用函数GlobalAlloc时用GMEM_FIXED标志位可以进一部简化操作,使用该标志后,Global/LocalAlloc返回的是已分配内存的指针而不是句柄。这样也就不用调用Global/LocalLock来锁定内存了,释放时只要调用Global/LockFree就可以了。不过本节课程我们只使用传统的方法,因为其他地方很多都是用这种方法写的。

 

   WIN32中的输入输出和DOS下的从外面上看几乎一样。(译者著:也许不管内部实现多么不同,可以想象所有的文件系统暴露给应用程序编写者的接口基本相同,不同的只是把dos下的中断方式处理文件输入/输出变成了对api函数的调用。以下是基本步骤。

 

     1.调用CreateFile函数来生成一个文件,该函数可以应用在很多方面,除了磁盘文件外,我们还可以用来打开通讯,管道,驱动程序或控制台,会返回指向文件或者设备的句柄,我们只有使用句柄才有权反问这些设备以及文件(译者注:我们在windows下编程,就要遵循相应的规则)。

     调用SetFilePointer来把文件指针移到想读写的地方。

    2.然后调用ReadFile或WriteFile来完成实际的读写。这些函数会自己处理文件和内存之间的数据传送,这样免的你去做分配内存等繁琐的事情。

    3.调用CloseHandle来关闭文件,该函数接受一个先前打开的句柄。

   

内容:

    下面的代码段演示了:打开一个文件对话框,用户可以选择打开一个文件,然后在编辑控件中打开该文本文件的内容,另外用户还可以编辑该文本文件的内容并选择保存。

   

format PE GUI 4.0
include 'win32ax.inc'

macro memmov [dst, src]
{
    common
    push [src]
    pop [dst]
}

IDD_OPEN equ 1002
IDD_SAVE equ 1003
IDD_EXIT equ 1004
MEMSIZE equ 65536
EDITID equ 1

.data
    
    hInstance  rd 1
    hEdit      rd 1
    hFile      rd 1
    hMemory    rd 1
    lpMemory   rd 1
SizeFileWrite  rd 1
    lpofn OPENFILENAME <>
    szBuffer   db 100 dup (?)
szFilterName   db 'all file (*.*)', 0, '*.*',0,0
    szClassName db 'xfish', 0
    szEditName  db 'edit', 0
    szWndName   db '我的程序', 0

.text
   
    entry $
                    xor edi, edi
            invoke GetModuleHandle, edi
                    mov [hInstance], eax
            stdcall _WinMain, [hInstance], edi, edi, edi
            invoke ExitProcess, edi
           
    proc _WinMain hInstance:DWORD, hPrevInstance:DWORD, lpCmdLine:DWORD, nCmdShow:DWORD
            local @wc:WNDCLASS
            local @msg:MSG
            local @hWin:DWORD
            ; +-------------------------------------------+
            ; | Register Class |
            ; +-------------------------------------------+
            invoke RtlZeroMemory, addr @wc, sizeof.WNDCLASS
                    mov [@wc.style], CS_VREDRAW    or CS_HREDRAW
                    mov [@wc.lpfnWndProc], _WinProc
                    memmov @wc.hInstance, hInstance
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值