win32汇编

[TOC]

win32汇编

模式定义

  1. 定义了程序使用的指令集、互作模式和格式

  2. win32环境中.386是必不可少的

    image-20230715173340028

    image-20230715173449273

  3. 后面带p则是伪指令

  4. 内存模式

    image-20230715173747893

    但是主要使用的是flat

    因win32程序只有一种内存模式,flat模式,没有64kb的限制

  5. 语言模式

    除了在.model语句中指定内存模式意以外,还应该指定语言模式

    image-20230715174527757

    • stdcall的参数压栈方式是:从右往左
  6. option语句

    image-20230715175305850

短的定义

image-20230715180311206

数据段

image-20230715194544213

  1. 可读可写的已定义的变量

    这些数据在.data的段中,是已初始化的数据段。.data的段存放在可执行文件的_DATA字节区内

  2. 可读可写的未定义的变量

    image-20230715195000045

    image-20230715195240031

  3. 常量

    image-20230715195356997

代码段

  1. 所有的指令都在代码段里面
  2. 代码段是放在_TEXT的节区中的

简单知识点

注释

  1. 在代码前面写”;”,代表注释处理

    image-20230715201548889

换行

  1. 由于程序的某一行过长,不利于阅读时可以使用\做换行符

调用API函数

image-20230715201811427

image-20230715201856489

动态链接库(dll)

image-20230715202519213

使用invoke语句

image-20230715203657995

API函数的返回值

image-20230715203928273

  1. 返回值保存在eax寄存器当中‘

  2. 返回值都是4个字节。

    如果超出4个字节的字符串,这个时候返回的就是指针(32位下的指针是4个字节)

函数声明

image-20230715204231533image-20230715204632946

  1. 使用proto

  2. 距离

    win32是4G 的平坦段,无所谓距离

    在Win32汇编中,函数定义时使用的距离(distance)是指函数内部的相对偏移量,用于表示函数内部的标签或指令之间的距离。

    在汇编语言中,函数通常由一系列的指令组成,每个指令都有一个相对于函数起始地址的偏移量。这个偏移量被称为距离。

  3. 对于win32汇编的参数值只有dword一种,也就是说只有4个字节

include语句

  1. 包含头文件

  2. 包含的两个方式】

    include <头文件的名字>

    include 头文件的名字

    image-20230715215236758

includelib

  1. 导入库文件

    image-20230715215645107

  2. 一般库文件和动态链接库的名字相同,后缀不同

  3. 使用lib更像是一个借用,但是使用include是将文件拷贝到程序当中

image-20230716084312490

  1. MB_OK是一个按钮,表示确定

    具体的信息可以查vs的字典

  2. 在win32汇编里面不需要使用je,jmp等

    可以使用if,elseif,else

    image-20230716085208255

    image-20230716085421317

标号

  1. 可以理解为c语言的goto

    image-20230716090026683

  2. 为了解决标号名称的浪费可以使用

    image-20230716090405835

    image-20230716090423891

变量

全局变量

  1. 类型

    image-20230716090725511

局部变量

  1. 通过修改堆栈的指针esp来预留需要的空间

    其实这个和C语言的调用是一样的

    image-20230716091713070

  2. 使用local定义局部变量

  3. 而且数据必须在代码之前

  4. 局部变量的使用

    image-20230716093250606

  5. 对局部变量的初始化

    RtlZeroMemory这个API函数经行初始化

    image-20230716094212170

变量的使用

  1. 强制类型转换

    image-20230716095945277

变量的尺寸

  1. 数据的长度计算

    image-20230716100100399

    image-20230716101511844

获取变量的地址

  1. 使用lea

    image-20230716102702916

  2. 解析addr

    image-20230716104922959

    image-20230716105002004

    在有addr的程序中,不用eax

使用子程序

image-20230716105222790

  1. 相当于函数

  2. 参数的传递和堆栈的平衡

    image-20230716105929452

    image-20230716110042079

    image-20230716110153358

数据结构

  1. 实现的语法

image-20230716111534344

image-20230716111607802

例子:

image-20230716112122258

  1. 实现引用

    • 使用点操作符

      image-20230716112706165

    • image-20230716122834546

    • 使用assume伪指令把寄存器预先定义为结构指针

      image-20230716123018164

win汇编的高级语法

  1. 补充了:条件测试,分支和循环等高级语法

条件测试

image-20230716125149179

但是注意条件判断的左边只能是变量,不能为常数;而且两边不能同时为变量,但可以是寄存器

分支语句

  1. 下面是格式

    image-20230716125613059

循环语句

  1. while语法

    image-20230716131816020

    image-20230716131856832

    使用break 的时候我们记得指出退出的条件

  2. do_while()语法

    image-20230716133337992

代码风格

匈牙利命名法

  1. 格式是类型前缀加上变量说明
  • 类型使用小写字母表示

    image-20230716144300168

    sz表示以0结尾的字符串,dw表示double word h表示句柄

    常用的前缀

    image-20230716144512642

  • 变量名采用的双峰命名法

  1. 全局变量和局部变量

    image-20230716144924625

代码的书写风格

  1. 排版方式

    对于指令和寄存器是不区分大小写

    但是指令和寄存器等要使用小写字母

    而用equ等位操作符定义的变量则使用大写的字母

    变量和标号使用匈牙利表示法

    image-20230716145044120

  2. 注释和空行

    总结的开说我们需要写合适的注释就好了,不要太多但是也不来能没有

    image-20230716145822421

  3. 代码的组织模式

窗口程序执行过程

image-20230716151134078

image-20230716153229377

  1. 使用satrt开始,endsatrt结束,但是需要添加invoke ExitProcess,NULL,不然会报错

    1
    2
    3
    4
    	.code	; 写在代码段
    start:
    invoke ExitProcess,NULL ;退出程序
    end start ;结束
  2. 详细的过程

    image-20230716221210923

  3. PostMassageSendMessage主要是用于消息的转发机制

  4. 有两个问题

  • 为什么windows调用窗口,直接处理信息不是更简单吗?

    image-20230716222442970

    image-20230716222503487

窗口程序的解剖

句柄

  1. 可以理解为窗口的序号

    image-20230716223151317

  2. 模块和句柄

    image-20230716224038899

    • 得到句柄使用GetModuleHandle

    • 例子

      image-20230716224248893

      image-20230716224430994

      如果使用的参数是NULL那么我们就是调用的是调用者的句柄

创建窗口

image-20230717082341757

  1. 注册窗口类

    RegisterClassEx

    image-20230717082647963

  2. 创建窗口类

    WNDCLASSEX的结构各字段的含义

    image-20230717083225200

    image-20230717083339200

    image-20230717083437467

    image-20230717083618134

    image-20230717093314962

  3. 建立窗口

    image-20230717094332560

    建立窗口的函数CreatWindowEx`

    下面是使用方法:

    image-20230717094412098

    第二个参数IpClassName就是表明使用的窗口的类型,这里使用自己自定义的窗口

    第三个参数是IpWindowName这个是窗口的名称

    image-20230717094815772

    第十个参数是菜单的句柄

    image-20230717094842573

    第十一个参数HInstance指定窗口所属的层序模块

    第九个参数hWndParent设置父窗口

    image-20230717095031636

    image-20230717095105968

    第四个参数dwstyle 指出需要的风格(预定的值可以查看)

    image-20230717095138524

ShowWindow

主要是显示窗口和控制窗口的显示状态

image-20230717095741377

image-20230717095916043

消息队列

image-20230717101238518

一般形式:

image-20230717101314519

image-20230717101430013

当指定没有信息的不在获取cpu时间片

image-20230717102012261

我们使用的是PeekMessage加上条件判断来控制cpu的时间片的

窗口过程

image-20230717102555823

image-20230717103506340

image-20230717103942765

下面这张图的意思就是说我们不能直接使用DestroyWindow来摧毁窗口。而是我们使用PodtQuiTMessage来摧毁信息回环机制

image-20230717104354934

关于程序接受信息的顺序

  1. 在使用CreatWindowEx时发送窗口接收到的信息

    image-20230717105407878

  2. 使用DestroyWindow摧毁窗口的时候发送的信息

    image-20230717143337820

    大部分的信息都不需要程序自己关心,windows只是尽义务的通知窗口过程而已

    下面是程序需要自己关心的

    image-20230717143452332

    image-20230717143731304

  3. Defwindowproc信息的默认处理机制

    image-20230717144409193

窗口间的消息互发

  1. 主要是使用PostMessageSendMessage

    image-20230717144914095

  2. 类似于printf的函数wsprintf

    image-20230717145123909

  3. 为什么字符串的地址不一样

    因为windows对字符串进行了拷贝

    image-20230717151631460

在窗口见传递数据

  1. 使用WM_COPYDATA信息

    image-20230717151827583

    image-20230717151940270

    类似于C语言的传址的传参

    因为使用的是共享的内存

    image-20230717152252202

  2. SendMessagePostMessage的区别

    image-20230717153331916

实践性

使用资源

  1. 程序运行=代码的创建+资源的运行
  2. 源文件是以rc为扩展名的脚本文件

菜单的定义框架

image-20230717160403774

  • 方法

    image-20230717160636378

  • 方法一:

    image-20230717160711329

  • 方法二:定义的是菜单项之间的分割线

    image-20230717160919253

  • 方法三

    定义的是子菜单

    image-20230717161052164

加载菜单和加速键

image-20230717173039779

image-20230717173321243

菜单项的修改

  1. 插入菜单项

    image-20230717174026872

    image-20230717174205538

  2. 修改菜单项

    image-20230717174234587

  3. 删除菜单项

    image-20230717174312970

    区别:

    image-20230717174402830

  4. 添加系统菜单

    image-20230717174850382

  5. 右键弹出菜单

    image-20230717174937533

  6. 二级菜单

    image-20230717175138449

  7. 获取鼠标的位置

    image-20230717175240029

  8. 菜单窗台的检测

    image-20230717175615607

图标和光标

  1. 定义

    image-20230718083711673

  2. 装载图标和光标

    image-20230718083931575

    通过发送信息

    image-20230718084236722

  3. 改变窗口的属性然后改变光标的设定

    image-20230718084346721

位图

  1. 是一种存储方式

    linux也是这种

    image-20230718084711472

  2. 矢量和位图的关系

    image-20230718084955790

  3. 区分位图,设备无关位图,位图文件

    image-20230718085112936

    image-20230718085332659

    image-20230718085306650

  4. 在资源中定义位图

    image-20230718085919241

对话框

  1. 模态对话框和非模块对话框

    image-20230718090141825相当于特殊的窗口

    image-20230718090259854

  2. 对话框的创建

    image-20230718091807097

  3. tab停留位

    就是使用tab经行焦点的转变

    image-20230718092232261

  4. 使用对话框

    • 创建部分和对话框过程(回调函数)的部分

    • 创建模态对话框

      image-20230718092717495

      image-20230718092900612

    • 结束模态对话框

      image-20230718093002726

    • 创建非模块对话框

      image-20230718093104742

    • 两个创建函数的不同

      image-20230718093413292

      image-20230718093437707

      image-20230718093446473

使用子窗口控件

子窗口的控件

  1. 定义

    image-20230718103357430

  2. 通用的使用方法

    image-20230718104005759

    • 通过id获取句柄

      image-20230718104141640

    • 向控件发送信息

      image-20230718104314711

      其中的换行符出现了错误

    • 使用单选钮和复选框

      image-20230718104605311

    • 使用静态控件

      不向对话框发送信息

      image-20230718105309632

      可以用来构造简单的线条图形

    • 使用文本编辑控件

      image-20230718111110387

    • 使用滚动条、

      image-20230718112856487

      image-20230718112937397

      发送信息获取返回

      image-20230718113658053

字符串资源


win32汇编
https://tsy244.github.io/2023/07/15/汇编/win32汇编/
Author
August Rosenberg
Posted on
July 15, 2023
Licensed under