0x00汇编知识准备

1、如何用汇编语言指令或伪指令调用Windows提供的API函数?

2、Windows汇编与DOS汇编的区别?

  分段与特权指令

3、二进制数与八进制、十六进制、十进制的关系 

  D O/Q H B

4、容量单位

  1024 = 400h = 2^10 = 1K

  65536 = 10000h = 2^16 = 64K

  2^20 / 2^30 / 2^32 = 4G

5、无符号数与有符号数的表示范围

  有符号数与补码的关系

6、汇编的基本元素

  汇编语言编译器(MLMASM)

  整数常量:

  运算符及优先级: ()、+,-、*,/、MOD、+,-

  实数常量 :符号位、整数部分、小数点、小数部分和指数组成

  字符和字符串常量: 区分’A'和“A”,字符串自动在尾上加

  标识符 :大小写字母、数字、下划线、@和$,第一个字符不能是数字;240个字符长度;编译时加-Cp,使变量名和系统关键字大小写敏感;@编译器扩展用于预定义的符号,建议不要使用

  缩写    含义

  sz    表示以0结尾的字符串(ASCIIZ)

  h     表示句柄handle

  lp    表示指针long point

  lpsz     表示指向ASCIIZ的指针

  bwdwfst  表示字节byte字word双字double word浮点数float结构体struct

  伪指令:编译时,由编译器识别和执行的命令,是汇编编译器语法格式的一部分,与CPU无关;定义逻辑段、选择内存模式、定义变量类型、和创建过程,不区分大小写,例如.CODE、.code、.Code

  常用伪指令:

  .386

  .model flat,stdcall

  option casemap:none

  .data

  .code

  start:

  invoke ExitProcess,NULL

  end start

  指令和标号 标号:助记符 操作数 ;注释 标号是浮动地址,在程序编译链接后,将有一个具体的地址。用它来指明程序转移的入口点。

  MASM中的@@标号 和@B向后转移,@F向前转移 一起使用

  注释 单行注释和块注释 ;和comment(伪指令)

  .model 定义程序的工作模式,语法格式 .model 内存模式[,语言模式][,其他模式] 例.model flat,stdcall 也自动为段寄存器作了以下说明 ASSUME CS:FLAT,DS:FLAT,ES:FLAT,SS:FLAT,FS:ERROR,GS:ERROR CS,DS,ES,SS工作在一个段,FS和GS不使用。如果使用,则要说明 ASSUME FS:NOTHING,GS:NOTHING 或 ASSUME FS:FLAT,GS:FLAT

  .386 80386处理器指令集,必须定义在开头,用户级程序工作在最低特权级3,用.386够用;编写设备驱动程序,用.386p,p指的是特权指令,在最高特权级0运行

  节区 和模式选择有关,需要区分数据和代码;

  .386

  .model flat,stdcall

  option casemap:none  ;变量和关键字区分大小写

  <include 语句>

    .data          ;_DATA节区

  <初始化变量>

  .data?          ;_BSS节区

  <没有初始化值的变量(用?号表示值)>

  .const

  <常量定义>

  .code          ;_TEXT节区

  入口点标号:

  <代码>

  end 入口点标号      ;指明程序入口点

  .data和.data?区别 编译链接是否占用空间;内容都是可以读写的

  .const 常量不容许修改

  .code 节区不可写

invoke伪指令:

  invoke出现以前,程序使用入栈的方法调用Windows中的API函数

  push MB_OK ;

  push addr szCaption ;标题串的地址

  push addr szText ;正文串的地址

  push NULL  ;父窗口的句柄

  call MessageBox  ;显示信息框

     之后 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK

  右边的参数先入栈,由stdcall决定的

续行号

wsprintf  格式化信息串函数 和 其他输入输出函数

  wsprintfA PROTO C :DWORD, :VARARG

  wsprintf  equ <wsprintfA>

  其中PROTO是过程声明关键字,C表示是C语言调用方式(右边参数先入栈),:DWORD是缓冲区地址的类型,:VARARG表示参数的类型可以是BYTE、WORD和DWORD等,且参数的个数可以有任意多个(与格式串中的输出控制符对应)。

wsprintf 函数的格式如下:

wsprint, lpOut,                  ;缓冲区的地址

     lpFmt,                  ;格式串的地址

     变量列表:VARARG

多少个格式控制符,就对应多少个值;该功能是填充格式串,并将其搬入缓冲区。

例如:

buffer db 80 dup (0)

szFmt db '十进制值是:%d,十六进制值是:%xh',0

invoke wsprintf,addr buffer,addr szFmt,100,100

  masm32.lib : ClearScreen、Locate、StdOut、StdIn

 StdOut  PROTO :DWORD

StdIn     PROTO :DWORD,:DWORD

Locate   PROTO :DWORD,:DWORD

ClearScreen PROTO

原文地址:https://www.cnblogs.com/zhuzhuqwa/p/5460428.html