Windows环境下32位汇编语言程序设计(第三章笔记)

第三章 使用MASM
E nd  [开始地址]
E nd start
E nd表示程序的开始和结束。
注释用“;”分号,分号中的引号不当注释,
ss bd  hello,world ; ,0dh,0ah
一行代码太长用  \  续行。
调用函数: invoke 函数名 , 参数 , 参数・・・・
API函数返回值只有一种dword,永远放在EAX寄存器中。或提供一个地址。
函数声明:
函数名 proto [距离] [语言] [参数1]:数据类型,[参数2]:数据类型,・・・
可以忽略一下参数:
函数名 proto [参数1]:数据类型,[参数2]:数据类型,・・・
include 包含文件 includelib  导入库
标号的定义,格式如下:
标号名:目的指令    作用域子程序
 或
标号名::目的指令  作用域整个程序
@@ 做标号, @B 表示本条指令前的第一个 @@ 标号, @F 表示本条指令后的第一个 @@ 标号。
全局变量的定义:
变量名 类型 初始值1,初始值2,・・・
变量名 类型 重复数量 dup (初始值1,初始值2,・・・・)
变量的类型:
db字节 Byte   dw字word dd双字dword df三字fword dq四字qword
?是未初始化预留空间,0dh回车 0ah换行,db类型可以字符串和数值定义混用,如:
S et db HELLO , WORD! ,0dh,0ah,0
局部变量的定义:
L ocal 变量名1 重复数量 :类型,变量名2 重复数量 :类型,・・・
类型不能缩写,不能用dup指令,默认word类型,可以省略。
L eave  相当于 push esp,ebp  和 push ebp
数据结构:
结构名 struct
字段1 类型 ?
```````````
结构名 ends
把结果当做数据用,在数据段中定义
.data?
结构变量名子 结构名 <>  或者:结构变量名子 结构名 <字段1初始变量,・・・>
引用结构字段:
M ov eax, aaa . 字段名
A ssume把寄存器预先定义为结构指针
M ov  esi , offset jigou
A ssume   esi:ptr jigou2
M v eax,[esi].ziduan
```
A ssume esi : nothing 
结构是可以嵌套的,引用里边的字段,如:mov a . b . 字段
指定数据的长度, 类型 ptr 变量名
M ovzx扩展指令,把参数扩展到相同,被扩展数据最高位是0用0填充,是1用1填充。
变量的长度和数量
S izeof  变量名、数据类型、数据结构名
L engthof 变量名、数据类型、数据结构名
S izeof取以字节单位的长度,lengthof取得变量中数据的项数。最好用 lstrlen 代替sizeof。
获取变量的地址:
获取全局变量: mov 寄存器 , offset   变量名
获取局部变量的地址,局部变量地址是不确定的,所以靠ebp做指针,指向:
L ea  eax ,[ebp-4]
A ddr 局部变量和全局变量 ,自动判断是局部变量就用 offset , 是局部变量就用 lea
A dd就是可以当做,invoke调用函数的参数,局部变量当做参数是出错,因为地址存在eax寄存器中。当在invoke中使用addr时,注意它的左边不能用eax,否则eax的值会被覆盖掉,当然eax用在addr右边的参数中是可以的。
子程序的定义
在程序名 proc 距离 语言类型 可视区域 USES寄存器列表 ,参数:类型・・・VARARG
L ocal 局部变量列表
指令
子程序名 endp
P ushad和popad一次保存和恢复所有寄存器
调用字程序时候,如果在后边,程序头部可以用proto声明。
分支语句:
if  条件表达式 1
   表达式 1 为“真”时执行的指令
elseif   条件表达式 2
表达式 2 为真时执行的指令
```````
lese
所有表达式为否时,执行的指令
endif
循环语句:
while  条件测试表达式
指令
break  if 退出条件
continue
endw
或:
Repeat
指令
break  if 退出条件
continue
until  条件测试表达式   untilcxz  条件测试表达式
代码风格:
全局变量的参数加___线,局部变量加@,子程序加___。

你可能感兴趣的:(windows,masm)