内存模式

        .386.model flat,stdcall ;子程序调用模式,win32中只能用stdcall,因为win32api调用使用的这个option casemap:none ;定义了程序中变量和子程序名是否对大小写敏感,win32api名称区分大小写,所以只需要记住这个定式
  1. 指定使用的指令集
  2. .model语句
.model 内存模式[,语言模式][,其他模式]

内存模式

模式 内存使用方式
tiny 用来建立.com文件,所有的代码、数据和堆栈都在同一个64KB段内
small 建立代码和数据分别用一个64KB段的.exe文件
medium 代码段可以有多个64KB段,数据段只有一个64KB段
compact 代码段只有一个64KB段,数据段可以有多个64KB段
large 代码段和数据段都可以有多个64KB段
huge 同large,并且数据段中的一个数组也可以超过64KB
flat Win32程序使用的模式,代码和数据使用同一个4GB段

对于Win32程序来说,只有一种内存模式,flat模式

源程序结构

.386
.model flat,stdcall
option casemap:none<一些include语句>
.stack [堆栈段的大小] ;常忽略不写
.data<一些初始化过的变量定义>
.data?<一些没有初始化过的变量定义>
.const<一些常量定义>
.code<代码><开始标号><其他语句>end <开始标号>

局部变量的定义

local    变量名1[[重复数量]][:类型],变量名2[[重复数量]][:类型]......

local伪指令必须紧接在子程序的伪指令proc后

变量的类型

名称 表示方式 缩写
字节 Byte db
word dw
双字(doubleword) dword dd
三字(farword) fword df
四字(quadword) qword dq
十字节BCD码(tenbyte) tbyte dt
有符号字节(signbyte) sbyte
有符号字(signword) sword
有符号双字(signdword) sdword
单精度浮点数 Real4
双精度浮点数 Real8
10字节浮点数 Real10

数据结构

结构名    struct字段1     类型    ?
字段2     类型    ?
......结构名    ends

定义

        .data?
变量名称    结构名    <字段1,字段2,...>
;或者.data?
变量名称    结构名    <>

使用

;前提假设结构名为WNDCLASS,结构体变量名为stWndClass,里面有字段lpfnWndProc;1
mov    eax,stWndClass.lpfnWndProc;2.esi寄存器作指针寻址
mov    esi,offset stWndClass
mov    eax,[esi + WNDCLASS.lpfnWndProc]    ;注意这里是WNDCLASS;3.用assume伪指令把寄存器预先定义为结构指针
mov    esi,offset stWndClass
assume esi:ptr WNDCLASS
mov    eax,[esi].lpfnWndProc
...
assume esi:nothing    ;注意:不使用esi做指针的时候需要用这句取消定义;4.结构的定义可以嵌套
NEW_WNDCLASS    structdwOption        word        ?
oldWndClass     WNDCLASS    <>NEW_WNDCLASS    ends;5.嵌套的引用
mov    wax,[esi].oldWndClass.lpfnWndProc

以不同的类型访问变量

;以db定义一个缓冲区
szBuffer    db    1024 dup (?)
;mov    ax,szBuffer ;错误,masm中,如果要用制定类型之外的长度访问变量,必须显式指出要访问的长度,这样编译器忽略语法上的长度检验,仅使用变量的地址
;类型 ptr 变量名
mov    ax,word ptr szBuffer
mov    eax,dword ptr szBuffer

movzx

把一个字节扩展到一个字或一个字或一个双字再放到ax或eax中,高位保持0而不是越界存取到其他的变量

    .data
bTest1    db    12h.code
movzx    ax,bTest1
movzx    eax,bTest1

变量的尺寸和数量

sizeof    变量名、数据类型或数据结构名 ;取得变量、数据类型或数据结构以字节为单位的长度
lengthof  变量名、数据类型或数据结构名 ;取得变量中数据的项数

获取变量地址

mov    寄存器,offset 变量名    ;offset是取变量地址的伪操作符
lea    eax,[ebp-4]            ;运行时按照ebp的值实际计算出地址放到eax中
;invoke伪指令参数要用到一个局部变量的地址时,参数中不可能写入lea指令,用offset又是不对的,可用addr
addr   局部变量名和全局变量名   ;全局变量名时编译器按照odffset的用法来用;局部变量名时,编译器用lea先把地址取到wax中,然后用eax代替变量地址使用
;invoke中使用addr时,它的左边不能使用wax,否则eax的值会被覆盖

子程序的定义

子程序名 proc [距离][语言类型][可视区域][USES寄存器列表][,参数:类型]...[VARARG]local 局部变量列表指令子程序名 endp

参数传递和堆栈平衡

不同语言调用方式的差别

C SysCall StdCall BASIC FORTRAN PASCAL
最先入栈参数
清除堆栈者 调用者 子程序 子程序 子程序 子程序 子程序
允许使用VARARG

条件测试语句

寄存器或变量    操作符    操作数
(表达式1) 逻辑运算符 (表达式2) 逻辑运算符 (表达式3) ...
;举例,左边表达式,右边是表达式为真的条件
x==3        ;x等于3
eax!=3      ;eax不等于3
(y>=3)&&ebx ;y大于等于3且ebx为非零值
;表达式的左边只能是变量或寄存器,不能为常数;表达式两边不能同时为变量,但可以同时是寄存器

标志位的状态指示

CARRY?        表示Carry位是否置位
OVERFLOW?     表示Overflow位是否置位
PARITY?       表示Parity位是否置位
SIGN?         表示Sign位是否置位
ZERO?         表示Zero位是否置位

分支语句

.if eax && (bx >= dWX) || !(dWY != ecx)mov    esi,1
.elseif edxmov    esi,2
.elseif esi & 1mov    esi,3
.elseif ZERO? && CARRY?mov    esi,4
.endif

循环语句

.while 条件测试表达式指令[.break [.if 退出条件]][.continue]
.endw
;或
.repeat指令[.break [.if 退出条件]][.continue].until    条件测试表达式    (或 .untilcxz [条件测试表达式])

变量和函数的命名

匈牙利表示法

类型前缀+变量说明(类型用小写字母,说明则用首字母大写的几个引文单词组成)

汇编语言中常用的类型前缀

b 表示byte
w 表示word
dw 表示dword
h 表示句柄
lp 表示指针
sz 表示以0结尾的字符串
lpsz 表示指向0结尾的字符串的指针
f 表示浮点数
st 表示一个数据结构

举例

hWinMain 主窗口的句柄
dwTimeCount 时间计数器,以双字定义
szWelcome 欢迎信息字符串,以0结尾
lpBuffer 指向缓存区的指针
stWndClass WNDCLASS结构

本书的作者建议

  • 全局变量的定义使用标准的匈牙利表示法,在参数的前面加下划线;在局部变量的前面加@符号,这样引用的时候就能随时注意到变量的作用域。
  • 在内部子程序的名称前面加下划线,以便和系统API区别。

举例

_Calc    proc    _dwX,_dwYlocal   @dwResultfinitfild    _dwXfld     st(0)fmul                ;i * ifild    _dwYfld     st(0)fmul                ;j * jfadd                ;i * i + j * jfsqrt               ;sqrt(i * i + j * j)fistp   @dwResult   ;put resultmov     eax,@dwResultret_calc    endp

转载于:https://www.cnblogs.com/Akkuman/p/7523384.html

Windows环境下32位汇编语言程序设计笔记-基础篇相关推荐

  1. 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记

    琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...

  2. Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)

    Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(畅销10年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 75 ...

  3. Windows环境下32位汇编语言程序设计 相关资料

    Windows环境下32位汇编语言程序设计.pdf:https://474b.com/file/15153148-465076702 <Windows环境下32位汇编语言程序设计>随书光盘 ...

  4. Windows环境下32位汇编语言程序设计(典藏版)

    <Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...

  5. windows环境下32位汇编语言程序设计 90盘_Python 0基础详细教程 环境安装01

    Python语言有什么用,首先让大家了解Python语言的基本知识: Python语言是一种解释型,面向对象,动态数据类型的高级程序设计语言,Python语言是数据分析师的首选数据分析语言,通过数据挖 ...

  6. windows环境下32位汇编语言程序设计 90盘_程序设计作业题汇总

    C语言程序的基本单位是函数 程序设计语言经历了"机器语言"-"汇编语言"-"高级语言"的发展过程. 编写C语言代码文件的拓展名为.c/编写C ...

  7. 《Windows环境下32位汇编语言程序设计》 第五章笔记

    WM_COMMAND产生的条件:点击菜单, 点击加速键,点击子窗口按钮,点击工具栏按钮,点击列表框.这些时候都有command消息产生 wParam 高16位通知码,低16位命令ID, lParam ...

  8. Windows环境下32位汇编程序设计C版code--第四章

    采用的编译环境为VC++6.0 (一)第一个窗口函数 FirstWindow.c#include <windows.h> LRESULT CALLBACK ProcWinMain(HWND ...

  9. Windows环境下32位汇编程序设计C版code--第五章(三)

    (三)窗口子控件 #include <windows.h> #include "resource.h" HINSTANCE hInst; TCHAR szBuffer[ ...

  10. Windows环境下32位汇编程序设计C版code--第五章(二)

    (二)图标和光标 #include <windows.h> #include "Resource.h" TCHAR szName[] = TEXT("Icon ...

最新文章

  1. hessian原理解析二(服务端分析)
  2. 十图详解TensorFlow数据读取机制(附代码)
  3. 杭电1421java实现
  4. python基础教程:修改Python列表中元素的几种方法
  5. 不要在nodejs中阻塞event loop
  6. git 每次都要输入用户名密码_Git向GitHub提供代码
  7. 用python实现分段函数_在Python中绘制分段函数
  8. 软件开发过程模型——喷泉模型
  9. VUE小需求——旋转小图标
  10. 天玑处理器排行榜2022 联发科天玑处理器性能排行榜2022
  11. android锁屏界面布局修改,android 修改锁屏界面
  12. python编程题3.5:恺撒密码
  13. 你需要一份更绝佳的文章排版与设计
  14. python电话通知_教你如何使用Python向手机发送通知
  15. LIO-SAM imuPreintegration
  16. Leetcode 048旋转图像(将矩阵逆时针旋转90度)(先对角线翻转,再左右翻转)
  17. linux gic驱动
  18. 计算机命令窗口怎么打开,如何打开命令行窗口_教你在win7上直接打开命令行窗口 - 驱动管家...
  19. 关于虚拟机无法启动(The VMware Authorization Service is not running)
  20. Hadoop入门教程 详细的入门实战教程

热门文章

  1. McAfee ePO4.5 admin账号密码忘记的解决办法
  2. Hibernate配置文件
  3. Stream篇(2)【TextReader】
  4. 推荐一款数据恢复软件EasyRecovery
  5. ARP、RARP、ICMP、ping
  6. DNS寻址以及IP解析
  7. mongodb 命令补充
  8. 内存中的fas和lsp
  9. 转:2016年崛起的js项目
  10. NeHe OpenGL教程 01 创建OpenGL窗口