zoukankan      html  css  js  c++  java
  • 学 Win32 汇编[2]: 最简单的 Win32 程序


    ; Test2_1.asm
    
    .386
    .model flat, stdcall
    
    include windows.inc
    include user32.inc
    include kernel32.inc
    includelib user32.lib
    includelib kernel32.lib
    
    .data
        szCaption db 'Hi', 0
        szMsg     db 'Hello World!', 0
    
    .code
    start:
        invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
        invoke ExitProcess, NULL
    end start
    

    建立过程:
    1、文件 -> 新建工程 -> 工程类型: Win32 App (no res)、工程名称: Test1 -> 默认下去到完成.
    2、打开 Test1.asm 输入以上代码, 然后编译执行. 结果如下:



    程序注释:

    ; Test1.asm
    ; 分号是单行注释
    
    comment &
      注释还可以使用 comment, 现在两个 & 之间的是注释内容, 其中的百分号也可以换做其他符号, 譬如 ^
    &
    
    COMMENT ^
      这也是注释, 
      还是多用 ; 吧, 比较方便 ^
    
    ; ********************************
    
    .386
    .model flat, stdcall
    
    ;.386 和 .model 都是是汇编伪指令; .386 表示使用 386 指令集, 这是 Win32 程序的最低需求.
    ;类似的还有 .8086 .286 .386p .486 .486p .586 .586p .mmx 等, 其中的 p 表示可以使用一些特权指令.
    
    ;.model 用于定义工作模式;
    ;flat 是内存模式, 类似还有: tiny small medium compact large huge, Win32 程序只能选择 flat;
    ;stdcall 是语言模式, 类似的还有: c syscall basic fortran pascal, 使用 Win32 API 必须选择 stdcall.
    
    ; ********************************
    
    include windows.inc
    include user32.inc
    include kernel32.inc
    includelib user32.lib
    includelib kernel32.lib
    
    ;kernel32.dll 是系统服务接口, 负责内存管理等;
    ;user32.dll 是用户服务接口, 负责消息管理等;
    ;下面的程序会用到它们的函数.
    
    ;user32.inc 和 kernel32.inc 中分别包含着对应 DLL 的函数、常量、结构的声明.
    ;windows.inc 包含着 Win32 程序用到的常量、结构的声明; 譬如下面用到的 MB_OK 常量就是在其中声明.
    
    ;程序在编译时, 见到 include (伪)指令就会把它指定的 inc 文件(或 asm) 文件复制到当前位置.
    ;inc 文件主要包含函数或常量的声明.
    
    ;lib 文件包含了动态库函数的地址信息和静态库的函数代码, 程序在链接阶段会提取这些信息或代码; 
    ;对 DLL(动态库), 程序运行时会根据这些地址信息去调用 DLL 中的相应的函数.
    
    ;inc 和 lib 文件分别存放在 masm32\include\ 和 masm32\lib\ 下;
    ;这里没有使用路径是因为 RadASM 已经给设置好了系统路了.
    
    ; ********************************
    
    .data
        szCaption db 'Hi', 0
        szMsg     db 'Hello World!', 0
    
    ;.data 说明这是程序的数据段, 下面的 .code 是代码段
    ;后面还会接触到 .const(常量段)、.data?(变量段)等
    
    ;这里是定义了两个字符串变量 szCaption、szMsg, 后面的 0 表示是 0 结束的字符串.
    ;关于 db 等后面详细探讨.
    
    ; ********************************
    
    .code
    start:
        invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
        invoke ExitProcess, NULL
    end start
    
    ;这段程序用到了两个 API 函数: MessageBox(显示消息框)、ExitProcess(退出程序);
    ;这两个函数分别来自 user32.dll 和 kernel32.dll.
    
    ;invoke 是调用函数或子过程的伪指令.
    ;addr 是取地址的伪指令, 这里也可以换做 offset
    
    ;start 是随便命名的标号, 用于表示程序段的开始和结束
    
    ;另外汇编本来是不区分大小写的, 但在使用 WinAPI 和 C 函数时必须注意大小写
    ;标号(如 start)和变量也要注意大小写
    ;指令和伪指令大小写均可
    
    ;汇编会忽略多余的空白, 并用 \ 续行, 譬如:
    invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
    ;可写作:
    invoke MessageBox, NULL,\ 
                       addr szMsg,\
                       addr szCaption,\
                       MB_OK
    

    关于换行: 在实际操作中, 我没有使用换行符号 \ 也可以, 如:

    ; Test2_1.asm
    
    .386
    .model flat, stdcall
    
    include windows.inc
    include user32.inc
    include kernel32.inc
    includelib user32.lib
    includelib kernel32.lib
    
    .data
        szCaption db 
          'Hi', 0
        szMsg     db 'Hello World', 
                     '!', 0
    
    .code
    start:
        invoke MessageBox, NULL, 
                           addr szMsg, 
                           addr szCaption, 
                           MB_OK
        invoke ExitProcess, NULL
    end start
    
  • 相关阅读:
    旁友数独会伐啦?python秒解数独了解下伐啦?
    趁老王不在,和隔壁邻居斗斗地主,比比大小
    ll字段 详解 文件权限
    etc/pass命令列表
    maven配置
    linux常用汇总
    Tomcat学习笔记
    JavaEE高级-Hibernate学习笔记
    JavaEE高级-通用Mapper学习笔记
    jQueryrocket
  • 原文地址:https://www.cnblogs.com/del/p/1703614.html
Copyright © 2011-2022 走看看