Windows环境下32位汇编语言程序设计笔记-基础篇
内存模式
.386
.model flat,stdcall ;子程序调用模式,win32中只能用stdcall,因为win32api调用使用的这个
option casemap:none ;定义了程序中变量和子程序名是否对大小写敏感,win32api名称区分大小写,所以只需要记住这个定式
- 指定使用的指令集
- .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 struct
dwOption 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 edx
mov esi,2
.elseif esi & 1
mov 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,_dwY
local @dwResult
finit
fild _dwX
fld st(0)
fmul ;i * i
fild _dwY
fld st(0)
fmul ;j * j
fadd ;i * i + j * j
fsqrt ;sqrt(i * i + j * j)
fistp @dwResult ;put result
mov eax,@dwResult
ret
_calc endp
Windows环境下32位汇编语言程序设计笔记-基础篇的更多相关文章
- 读书笔记——Windows环境下32位汇编语言程序设计(9)ANSII字符大小写转大写
在罗云彬的<Windows环境下32位汇编语言程序设计>中第321页 ... .const szAllowedChar db '0123456789ABCDEFabcdef',08h .. ...
- Windows环境下32位汇编语言程序设计(典藏版)
Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 756页 1 ...
- Windows环境下32位汇编语言程序设计(典藏版)
<Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...
- 读书笔记——Windows环境下32位汇编语言程序设计(2)配置环境
一直想买本罗云彬的Win32汇编书,现在终于出典藏版了,就买了本,读一读,涨涨姿势. 我把笔记本光驱拆下来添加了个硬盘,现在想装回去发现坏了,所以守着CD盘,代码却用的是第三版的,这真是个悲剧啊. - ...
- 读书笔记——Windows环境下32位汇编语言程序设计(13)关于EXCEPTION_DEBUG_INFO结构体
在动手自己尝试编写书上第13章的例子Patch3时,遇到了一个结构体EXCEPTION_DEBUG_INFO. 这个结构体在MASM的windows.inc中的定义和MSDN中的定义不一样. (我使用 ...
- 读书笔记——Windows环境下32位汇编语言程序设计(6)使用浮点指令进行64位除法
罗云彬 典藏版Page192,mark下. 这段代码看不懂,手册上根本没有fdivr不带操作数的指令. .data dqTickCounter1 dq ? dqTickCounter2 dq ? dq ...
- 读书笔记——Windows环境下32位汇编语言程序设计(5)模态对话框
资源可以用VC之类的生成,然后拷贝出来. 例如:每一个MFC工程都有一个resource.h,没有做任何修改时,这个resource.h文件是原来自带的.当对资源进行过修改添加之类的时,新添加的资源的 ...
- 读书笔记——Windows环境下32位汇编语言程序设计(3)一些基础知识
声明函数用proto 定义函数用proc 局部变量只能定义,不能赋初值,类型不能用缩写. 全局变量可以定义的时候赋初值,默认值为0. 在invoke中,参数可以使用addr取址. sizeof 字节长 ...
- 读书笔记——Windows环境下32位汇编语言程序设计(3)求复数模的子程序
3.6.1.1中的例子 _Calc proc _dwX,_dwY local @dwResult finit fild _dwX fld st(0) fmul ;i*i fild _dwY fld s ...
随机推荐
- report源码分析——report_handle和report_server和report_catcher
report_handle主要实现对message的action,severity,file的设置,然后将message传递给server: 主要的function有两个:initial和proces ...
- B树,B+树,B*树以及R树的介绍
https://blog.csdn.net/peterchan88/article/details/52248714 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开 ...
- 写自动更新程序出现"远程服务器返回错误: (404) 未找到"
在win2003配置后,在客户端运行时能够下载exe和dll文件,但是在更新lib文件时总是报“远程服务器返回错误: (404) 未找到”错误,不明白咋会出现这个问题,去网上一查,发现以下解决办法: ...
- intelj idea安装和配置
1|0优势 intellij idea 是目前公认的java最好的开发工具之一,商业版的IntelliJ应该包含了对 HTML5.CSS3.SASS.LESS.JavaScript.CoffeeScr ...
- 使用commons-compress解压GBK格式winzip文件到UTF8,以及错误使用ZipArchiveInputStream读出来数据全是空的解决办法
先上正确方法: 正确方式应该为,先创建一个ZipFile,然后对其entries做遍历,每一个entry其实就是一个文件或者文件夹,检测到文件夹的时候创建文件夹,其他情况创建文件,其中使用zipFil ...
- ptrace线程
在ptrace时使用waitpid(-1, &status, 0);无法正常trace 修改为waitpid(-1, &status, __WALL);即可 原因是:
- Python+OpenCV图像处理(八)—— 图像直方图
直方图简介:图像的直方图是用来表现图像中亮度分布的直方图,给出的是图像中某个亮度或者某个范围亮度下共有几个像素.还不明白?就是统计一幅图某个亮度像素数量.比如对于灰度值12,一幅图里面有2000 个像 ...
- 数据库 SQL 优化大总结之:百万级数据库优化方案
网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...
- Capture HTML Canvas as gif/jpg/png/pdf?
https://stackoverflow.com/questions/923885/capture-html-canvas-as-gif-jpg-png-pdf https://stackoverf ...
- 一、初始PS软件
PS的介绍 Adope Photoshop,简称“PS”,是由Adope Systems开发和发行的图像处理软件. Photoshop主要处理以像素所构成的数字图像,使用其众多的编修与绘图工具,可以 ...