zoukankan      html  css  js  c++  java
  • 汇编学习笔记

    汇编学习笔记 汇编进入文件必须考虑大小写 编译过程 进入D盘  d: 1.进入有var的文件夹 2.运行var 3.修改makefile 4.进入存放要编译文件的文件夹 5.nmake 进入某个文件夹,前面不需要加反斜杠,进入其子文件夹需要加反斜杠

    如果变量名靠的太紧,程序会无法识别 变量名和文件名要匹配,小心文件名里包含空格等,巨坑啊

    借鉴别人代码的时候,在看懂的基础上,直接将源代码直接复制过去,接着修改变量名,然后运行。发现错误后再修改 先实现功能再减少功能,这是一种由整化简的思路 若是由简凑整反而速度会慢

    使用CMD时,点击右键,选标记,然后选中命令提示符对话框中的文字,按ctrl+C,就能将里面的文字复制出来了

    ExitLoop:      invoke FreeLibrary,hRichEdit   mov eax, msg.wParam       ret

    其中 mov eax, msg.wParam       ret 是结束语句

    汇编有错,很可能是输入时用的输入法是中文的。 汇编对大小写的要求很明显

    asm文件中也可以用include语句包含数据定义和函数声明的头文件。Win32汇编的头文件一般用inc作扩展名,如MASM32软件包附带的Windows.inc文件定义了Win32 API中很多参数和数据结构,其他的inc文件则是不同DLL中的Win32 API函数声明。

    资源脚本文件的扩展名一般为rc,经过资源编译器编译成资源文件*.res。

    但在Win32环境下,大部分的公用函数封装在DLL文件中,以动态链接的方式供用户程序调用

    动态链接的方式供用户程序调用。这时候库文件中只需要包含函数在DLL中的位置信息,不再需要有二进制代码部分。所以链接的时候也只是把库文件中的位置信息取出放入最后的可执行文件中。Win32中这种只包含位置信息的库文件称为导入库。

    .model语句用来定义程序工作的模式,它的使用方法是: .model 内存模式[,语言模式][,其他模式] 对Win32程序来说,只有一种内存模式,即flat(平坦)模式,意思是内存是很“平坦”地从0延伸到 4 GB

    纵观Win32汇编的源程序,没有一处可以找到ds或es等段寄存器的使用,因为所有的4 GB空间用32位的寄存器全部都能访问到了,不必在头脑中随时记着当前使用的是哪个数据段,这就是“平坦”内存模式带来的好处。

    .model语句中还应该指定语言模式,即子程序的调用方式 stdcall,它指出了调用子程序或Win32 API时参数传递的次序和堆栈平衡的方法

    option语句 在Win32汇编程序中,需要的只是定义option casemap:none,这个语句定义了程序中的变量和子程序名是否对大小写敏感,由于Win32 API中的API名称是区分大小写的,所以必须指定这个选项,否则在调用API的时候会有问题。

    2、数据段 第一类是可读可写的已定义变量。.data段是已初始化数据段,其中定义的数据是可读可写的,在程序装入完成的时候,这些值就已经在内存中了

    第二类是可读可写的未定义变量。这些变量一般是当做缓冲区或者在程序执行后才开始使用的,这些数据可以定义在 .data段中,也可以定义在 .data?段中,但一般把它放到 .data?段中。

    第一类占内存,第二类不占。只给他分配空间大小。

    .const段是常量段,它是可读不可写的。 在程序中如果不小心写了对 .const段中的数据做写操作的指令,会引起保护错误

    3、代码段 code段是代码段,在可执行文件中,代码段是放在_TEXT节区中

    代码段的属性是由可执行文件PE头部中的属性位决定的,通过编辑磁盘上的 .exe文件,把代码段属性位改成可写,那么在程序中就允许修改自己的代码段。

    多个模块链接在一起的时候,只能有一个主模块指定入口地址

    用反斜杠()做换行符  invoke  MessageBox,

            Null,              ;父窗口句柄

            offset szText,     ;消息框中的文字

            offset szCaption,  ;标题文字

            MB_OK 反斜杠后面多几个空格或加上注释并不影响换行符的使用,如上例所示,这一点和makefile文件中换行符的规定有所不同。

    API 当应用程序要引用系统功能时,要把相应的参数放在各个寄存器中再调用相应的中断,程序控制权转到中断中去执行,完成以后会通过iret中断返回指令回到应用程序中。

    AUX in 辅助输入接口

    Win32的基础就是由DLL组成的。Win32 API的核心由3个DLL提供 ●   KERNEL32.DLL——系统服务功能。包括内存管理、任务管理和动态链接等。

    ●   GDI32.DLL——图形设备接口。利用VGA与DRV之类的显示设备驱动程序完成显示文本和矩形等功能。

    ●   USER32.DLL——用户接口服务。建立窗口和传送消息等。

    Win32 API是用堆栈来传递参数的,调用者把参数一个个压入堆栈,DLL中的函数程序再从堆栈中取出参数处理,并在返回之前将堆栈中已经无用的参数丢弃。

    HWND类型的窗口句柄(hWnd),LPCTSTR类型的要显示的字符串地址(lpText)和标题字符串地址(lpCaption),还有UINT类型的消息框类型(uType)。

    Windows所有编程资料发布的格式也是C格式。

    ,Win32 API调用中要把参数放入堆栈,顺序是最后一个参数最先进栈

    在源程序编译链接成可执行文件后,call MessageBox语句中的MessageBox会被换成一个地址,指向可执行文件中的导入表,导入表中指向MessageBox函数的实际地址会在程序装入内存的时候,根据User32.dll在内存中的位置由Windows系统动态填入。

    如果写的时候少写了一句push指令,程序在编译和链接的时候都不会报错,但在执行的时候必定会崩