zoukankan      html  css  js  c++  java
  • 学 Win32 汇编[33]

    我觉得所谓的模块化有两种: "假模块化" 和 "真模块化".

    所谓 "假模块化" 就是通过 include 指令把 *.inc 或 *.asm 文件的文本插入到当前位置.
    这样最后还是一个大的 asm 文件, 这适合小型的模块化设计.

    所谓 "真模块化" 就是一个或几个源文件先通过 lib.exe 编译成 *.lib 文件, 然后通过 includelib 指令引入使用.
    这在 RadASM 环境中可通过建立 LIB Project 工程方便做到. 做大工程应该使用这种方式.



    假如通过 Win32 App (no res) 模板建立了并实现了这样一个工程(Test33):


    ; Test33.asm
    .386
    .model flat, stdcall
    
    include    windows.inc
    include    kernel32.inc
    include    masm32.inc
    include    debug.inc
    includelib kernel32.lib
    includelib masm32.lib
    includelib debug.lib
    
    .code
    ;两数求和的函数
    sum2 proc v1, v2
        mov eax, v1
        add eax, v2
        ret
    sum2 endp
    ;三数求和的函数
    sum3 proc v1, v2, v3
        mov eax, v1
        add eax, v2
        add eax, v3
        ret
    sum3 endp
    ;
    main proc
        invoke sum2, 11, 22
        PrintDec eax ;33
        invoke sum3, 11, 22, 33
        PrintDec eax ;66
        ret
    main endp
    end main


    上面程序的 "假模块化" 的实现:


    通过: 工程窗口 -> 右键 -> 新建 -> 源文件, 分别建立 num2.asm 和 num3.asm
    现在要把整个程序分散一些分别到: Test33.inc、num2.asm、num3.asm


    ;Test33.inc
    .386
    .model flat, stdcall
    
    include    windows.inc
    include    kernel32.inc
    include    masm32.inc
    include    debug.inc
    includelib kernel32.lib
    includelib masm32.lib
    includelib debug.lib

    
    ;num2.asm
    .code ;这个 .code 可有可无
    ;两数求和的函数
    sum2 proc v1, v2
        mov eax, v1
        add eax, v2
        ret
    sum2 endp

    
    ;num3.asm
    ;三数求和的函数
    sum3 proc v1, v2, v3
        mov eax, v1
        add eax, v2
        add eax, v3
        ret
    sum3 endp

    
    ;Test33.asm ;这样主程序的代码就非常简单了
    
    include Test33.Inc
    
    .code
    include sum2.asm
    include sum3.asm
    ;
    main proc
        invoke sum2, 11, 22
        PrintDec eax ;33
        invoke sum3, 11, 22, 33
        PrintDec eax ;66
        ret
    main endp
    end main


    上面程序的 "真模块化" 的实现:


    准备把 num2 和 num3 两个函数分别作在两个模块里(其实一个模块可以包含很多东西).
    文件 -> 新建工程(LIB Project) -> 随意取名为 sum2(准备实现 sum2 函数) -> 然后默认下去, 代码如下:


    ; sum2.asm
    .386
    .model flat, stdcall
    
    .code
    sum2 proc v1, v2
        mov eax, v1
        add eax, v2
        ret
    sum2 endp
    end ;注意这里只有 end, 模块等待调用, 不能指定入口函数
    
    ;然后执行构建(Alt+Shift+F5), 我们需要的 sum2.lib 已经在刚才建立的工程目录下了
    ;同样可以建立并得到 sum3.lib

    
    ; sum3.asm
    .386
    .model flat, stdcall
    
    .code
    sum3 proc v1, v2, v3
        mov eax, v1
        add eax, v2
        add eax, v3
        ret
    sum3 endp
    end

    
    ;调用库测试:
    ;Test33_2.asm
    .386
    .model flat, stdcall
    
    include    windows.inc
    include    kernel32.inc
    include    masm32.inc
    include    debug.inc
    includelib kernel32.lib
    includelib masm32.lib
    includelib debug.lib
    
    ;这里的引入路径可以是全路径, 这里是相对路径
    includelib ..sum2sum2.lib
    includelib ..sum3sum3.lib
    ;子程序声明
    sum2 proto :dword, :dword
    sum3 proto :dword, :dword, :dword
    
    .code
    main proc
        invoke sum2, 11, 22
        PrintDec eax ;33
        invoke sum3, 11, 22, 33
        PrintDec eax ;66
        ret
    main endp
    end main

    
    ;假如把
    sum2 proto :dword, :dword
    sum3 proto :dword, :dword, :dword
    ;分别写在 sum2.inc 和 sum3.inc, 程序可改为:

    
    ; Test33_3.asm
    .386
    .model flat, stdcall
    
    include    windows.inc
    include    kernel32.inc
    include    masm32.inc
    include    debug.inc
    includelib kernel32.lib
    includelib masm32.lib
    includelib debug.lib
    
    include ..sum2sum2.Inc
    include ..sum3sum3.Inc
    
    includelib ..sum2sum2.lib
    includelib ..sum3sum3.lib
    
    .code
    main proc
        invoke sum2, 11, 22
        PrintDec eax ;33
        invoke sum3, 11, 22, 33
        PrintDec eax ;66
        ret
    main endp
    end main
    
    ;其实把子程序的声明直接写在实现它的 asm 文件里也行, 但那样层次不分明.
  • 相关阅读:
    ArrayList源码解析
    Oracle WITH A AS 用法解析
    oracle关于时间分区的查询
    request.getRealPath("/")
    Oracle部分sql优化
    Java虚拟机
    java谜题-表达式谜题
    java和oracle简单的日期格式化
    java编译后在tomcat下无class文件
    JSP 中文乱码及其解决方案
  • 原文地址:https://www.cnblogs.com/qanholas/p/3534044.html
Copyright © 2011-2022 走看看