• win32汇编入门(一)


    基础结构

    .386
    
    .model flat,stdcall
    
    option casemap:none
    
      <一些include语句>
    
    .stack [堆栈段的大小]
    
    .data
    
      <一些初始化过的变量定义>
    
    .data?
    
      <一些没有初始化过的变量定义>
    
    .const
    
      <一些常量定义>
    
    .code
    
      <代码>
    
      <开始标号>
    
         <其他语句>
    
    end 开始标号

    ;这里是注释  分行的办法是在一行的最后用反斜杠()做换行符

    变量定义初始值放.data 未初始值.data? ;定义在 .data?段中不会增大 .exe文件的大小

     

    3.2  变量的类型

     

    名    称                              表示方式               缩    写         长度(字节)

    字节

    byte

    db

    1

    word

    dw

    2

    双字(doubleword)

    dword

    dd

    4

    三字(farword)

    fword

    df

    6

    四字(quadword)

    qword

    dq

    8

    十字节BCD码(tenbyte)

    tbyte

    dt

    10

    有符号字节(signbyte)

    sbyte

     

    1

    有符号字(signword)

    sword

     

    2

    有符号双字(signdword)

    sdword

     

    4

    单精度浮点数

    real4

     

    4

    双精度浮点数

    real8

     

    8

    10字节浮点数

    real10

     

    10

     

     

    szBuffer            db      100 * 1024 dup (?)

    szChar  db 'Hello, world',0dh,0ah

     

    1. 局部变量的定义

     

    MASM用local伪指令提供了对局部变量的支持。定义的格式是:

     

    local       变量名1[[重复数量]][:类型],变量名2[[重复数量]][:类型]……

    local      loc1[1024]:byte        ;例1

    local伪指令必须紧接在子程序定义的伪指令proc后、其他指令开始前,这是因为局部变量的数目必须在子程序开始的时候就确定下来

     

    3. 获取变量地址  

    全局变量  mov     寄存器,offset 变量名

     

    局部变量  lea     eax,[ebp-4]

     

    该指令可以在运行时按照ebp的值实际计算出地址放到eax中。

     

    如果要在invoke伪指令的参数中用到一个局部变量的地址,该怎么办呢?参数中是不可能写入lea指令的,用offset又是不对的。MASM对此有一个专用的伪操作符addr,其格式为:

     

    addr 局部变量名和全局变量名

     

    当addr后跟全局变量名的时候,用法和offset是相同的;当addr后面跟局部变量名的时候,编译器会自动用lea指令先把地址取到eax中,然后用eax来代替变量地址使用。注意addr伪操作符只能在invoke的参数中使用

     

     

     

    调用API 

    原型 MessageBox Proto hWnd:dword,lpText:dword,lpCaption:dword,uType:dword

    调用 invoke  MessageBox,NULL,offset szText,offset szCaption,MB_OK 或

     

    push    uType

     

    push    lpCaption

     

    push    lpText

     

    push    hWnd

     

    call    MessageBox

    函数的声明

    函数名 proto [距离] [语言] [参数1]:数据类型,[参数2]:数据类型,...

    例 参数名可省略

    MessageBox  Proto  hWnd:dword,lpText:dword,lpCaption:dword,uType:dword

     

    MessageBox  Proto  :dword,:dword,:dword,:dword

     

     

     

     

  • 相关阅读:
    c++ map 的基本操作
    hdu Dragon Balls
    hdu Code Lock
    小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
    将.py脚本打包成.exe
    关于IO同步/异步/阻塞/非阻塞文章
    C++文件操作
    (十)参考教程
    (八)树控件(Tree Control),标签控件(tab control)
    (七)对话框,单选框(radiobox),复选框(checkbox),列表框(ListBox),组合框(CComboBox),水平滚动条(Horizontal scroll bar),微调(旋转)spincontrol,列表视图控件CListCtrl,静态控件static
  • 原文地址:https://www.cnblogs.com/xuankuwa/p/3659320.html
Copyright © 2020-2023  润新知