zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    《Web 开发基础》专题系列
    《.NET 编程结构》专题汇总(C#)
    .NET Core:使用BarTender
    .NET Core:过滤器
    .NET Core:中间件
    .NET Core:Api版本控制
    .NET Core:Token认证
    .NET Core:SignalR
    .NET Core:跨域
    .NET Core:Json和XML
  • 原文地址:https://www.cnblogs.com/zhuzhuqwa/p/5460428.html
Copyright © 2011-2022 走看看