Programming 版 (精华区)
发信人: SwordLea (飞刀李), 信区: Programming
标 题: 汇编程序设计ZZ
发信站: 哈工大紫丁香 (Fri Jun 11 11:53:47 2004), 转信
汇编程序设计
[80x86寄存器]
高位-->低位
AX=AH,AL 累加器
BX=BH,BL 基址寄存器
CX=CH,CL 记数寄存器
DX=DH,DL 数据寄存器
SP 堆栈指针
BP 基址指针
SI 源变址寄存器
DI 目的变址寄存器
IP 指令指针
FLAG 标志寄存器
CS 代码段寄存器
DS 数据段寄存器
SS 堆栈段寄存器
ES 附加段寄存器
[80x86体]
[汇编基本语法]
[1]通用汇编格式
;分号后为汇编程序的注释
NAME [程序名]
[Seg1] SEGMENT
[段体设计]
[Seg1] ENDS ;各段体设计
[Seg2] SEGMENT
[段体设计]
[Seg2] ENDS
.
.
.
[Seg Code] SEGMENT ;代码段
ASSUME CS:[Seg Code],DS:[Seg1]...
;映射各段体
[Label1]: .
.
. ;代码段主程序体
[Seg Code] ENDS
END [Label1]
[2]子程序设计
[ProcName] PROC NEAR 或 FAR
保护现场
根据入口参数进行处理
产生出口参数
恢复现场
RET
[ProcName] ENDP
[3]宏定义
[MacroName] MACRO [形式参数表]
[LOCAL标号及变量表]
***************************************************
.DATA 数据段
.STACK [字节数(缺省1024)] 堆栈段
.CODE 代码段
[8]模块通信
PUBILC [标识符表] 公共型
EXTRN [标识符1:FAR/NEAR,...]
引用其他段中的标识符
[Win32Asm(MASM v6.14(32))对80x86汇编的扩展]
[1]Ml常用选项
/c(常用) 只进行编译
/cff 使Obj文件为COFF格式
/Cp 区分大小写
/Fo fname 指定OBJ文件名
/Fe fname 指定链接后的文件名
/Fl fname 产生*.lst列表文件
/Gc 函数调用为Fortran或Pascal形式
/Gd 函数调用为C形式
/Gz 函数调用为StdCall形式
/I path 镇定include文件路径
/link [Option] 链接选项
/Sc 在列表文件中列出指令时钟周期
/Zi 增加符号调试信息
[2]Link常用选项
/BASE: 程序装入的基址
/COMMENT:注释 在文件头后加注释
/DEBUG 在PE中加入调试信息
/DEBUGTYPE:[CV/COFF] 调试信息类型
/DRIVE:[WDM/UPONLY] 链接NT的WDM驱动程序用
/DLL 链接为DLL
/DEF:fname 链接DLL的导出函数表
/ENTRY:label 指定入口标号
链接有导出函数的文件要
/IMPLIB:fname 建的导入库名
/INCREMENTAL:[ON/OFF]是否增量链接
/LIBPATH:path 指定库文件目录
运行平台:ALPHA/ARM/
IX86/MIPS/MIPS16/PPC
/MACHNE:name /SH3/SH4/MIPSR41XX
/MAP:fname 生成MAP文件
/OUT:fname 指定链接输出文件
/RELEARE 填写文件头中的校验字段
改变节区属性,属性:E/R/W
/SECTON:节区,属性 /S/D/K/L/P/X
/STACK:size 设定堆栈尺寸
自定义DOS文件头,fname为
/STUB:fname DOS的Exe文件
运行系统NATIVE/WINDOWS/
/SUBSYSTEM:name CONSOLE/WINDOWSCE/POSIX
/VXD 链接Win 95 VxD驱动程序
指令集伪指令
***************************************************
tbyte/dt 10 十进制BCD码
sbyte 1 有符号字节
sword 2 有符号字
sdword 4 有符号双字
real4 4 单精度
real8 8 双精度
real10 10 10字节浮点数
子程序中声明局部变量
在proc后:
local 变量1[[重复数量]][:类型],...
数据结构
结构名 struct
字段1 类型 ?
字段2 类型 ?
...
结构名 ends
可以用assume为指令把寄存器预先定义为结构指
针,再进行操作,例如:
assume esi:ptr WNDCLASS
mov eax,[esi].lpfnWndProc
...
assume esi:nothing
sizeof 变量 取变量大小
lengthof 变量 取变量中数据的项数
offset/addr 变量 取变量地址
addr 只在invoke中使用
子程序设计
子程序名 proc [距离][语言][可视区域]
[USES 寄存器列表]
[,参数:类型]...[VARARG]
lacol 局部变量列表
宏体
ENDM
注意:
实参个数可以与形参个数不同,实参数多时,多
余实参忽略;形参数多时,不足形参做"空"处理; 形
参在调用时可以是指令助记符,操作数或标号;若一
个实参中有空格,该实参应该用<>括起; &号可以在
宏体中将一个符号与参数连接起来; % 号表示引用
实参所表示的数值而非实参本身; ! 号表示使&<>%
这些符号无效;可选参数LOCAL表示列出的标号及变
量只在宏体中有效
[4]重复汇编
(1)REPT [重复次数]
重复体
ENDM
(2)IRP 形参,实参表
重复体
ENDM
此方法重复汇编数为实参表中的实参数,每重复
一次更换一个实参
(3)IRPC 形参,字符串
重复体
ENDM
此方法重复汇编数为字符串中的字符数,每重复
一次用一个字符代替形参
[5]库引用
INCLUDE 库文件名
[6]段定义
段名 SEGMENT [定位方式][组合方式]['类别']
段体
段名 ENDS
定位方式表
BYTE 从下一可用字节地址开始定位
WORD 从下一可用字地址开始定位
DWORD 从下一可用双字地址开始定位
PARA 从下一可用节地址开始定位(缺省)
PAGE 从下一可用页地址开始定位
组合方式表
PUBLIC 与同类段合并为一个段
STACK 与PUBLIC同,且合并的段固定为堆栈段
COMMON 与COMMON的同类同名段相覆盖
AT 表达式 从表达式确定的段首地址存放段
MEMORY 定位于相对地址更大的存储位置
(缺省) 独立段
'类别'为程序员自定的字符串, 同类的段放在连续
的地址中
[7]MASM 5.0 的简化伪指令
.MODEL 存储模式:
SMALL/MEDIUM/COMPACT/LARGE/HUGE
*******************************************
.8086/.186/.286/.386/.386p/.486/.486p/.586/
.586p/.mmx(用该指令集要先用.586)
.model语句
.model 内存模式[,语言模式][,其它模式]
内存模式有:tiny/small/medium/compact/large/
huge/flat(Win32使用)
语言模式有:StdCall/SysCall/C/BASIC/FORTRAN/
PASCAL
option casemap:none 使程序区分大小写
Win32汇编源程序完整格式:
.386
.model flat,stdcall
option casemap:none
<include 语句>
.stack [堆栈大小]
.data
<初始化变量>
.data?
<未初始化变量>
.const
<常量>
.code
<代码>
<开始标号>
<代码>
end <开始标号>
当某行语句太长时,可用\号将它分写为多行,例:
invoke MessageBox,NULL,offset szText,\
offset szTitle,MB_OK
API 的调用
(1)在源代码头部:
include <相应的*.inc文件>
includelib <相应的*.lib文件>
(2)在调用处:
invoke 函数名[,参数1][,参数2]...
(3)API函数的返回值在eax中
API函数的声明
函数名 proto [距离] [语言] [参数1]:类型...
距离有:NEAR/NEAR16/NEAR32/FAR/FAR16/FAR32
语言选项与.model中的选项值一样
@@标号
@@只在下一个@@出现前有效
@B表示@B前的@@标号
@F表示@F后的@@标号
变量类型
name size(byte) 说明
byte/db 1 字节
word/dw 2 字
dword/dd 4 双字
fword/df 6 三字
qword/dq 8 四字
*****************************************
代码
子程序名 endp
可视区域有:PRIVATE/PUBLIC/EXPORT
USES表中为自动保护环境的寄存器列表
选取VARARG时,允许不定参数,只有C/SysCall/
StdCall语言模式允许VARARG
条件测试句
与C语言相同
分支语句
.if 条件表达式
指令
[.elseif 条件表达式]
指令
[.elseif 条件表达式]
指令
[.else]
指令
.endif
循环语句
.while 条件表达式
指令
[.break [.if 退出条件]]
[.continue]
.endw
.repeat
指令
[.break [.if 退出条件]]
[.continue]
.until 条件表达式
(或.untilcxz [条件表达式])
--
如果程序员来到了程序设计版,
那么他就不会再牛,
更不会随便给予了。
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.246.241]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:206.132毫秒