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毫秒