三个关于汇编的程序

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 该程序是一个简单的动态链接库,用于实现对对话框中的某个值的加减.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 程序名: MyDll.asm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.386 
.model flat,stdcall 
option casemap:none 
;******************include****************************
include  windows.inc 
include  user32.inc 
include  kernel32.inc 
includelib  user32.lib 
includelib  kernel32.lib 
;******************data*******************************
.data 
val  dd ?
bRet dd ?
;******************code******************************
.code 
;================================================================
; 入口函数 
;================================================================
DllEntry proc hInstDLL:HINSTANCE, reason:DWORD, reserved1:DWORD 
 mov  eax,TRUE 
 ret 
DllEntry Endp 
;================================================================
; 下面是两个导出函数,其它程序可以来调用这两个函数。 
;================================================================
AddVal proc hWnd:DWORD, dwID:DWORD
 invoke GetDlgItemInt, hWnd, dwID, NULL, NULL
 inc eax
 invoke SetDlgItemInt, hWnd, dwID, eax, TRUE
    ret 
AddVal endp 
;================================================================
DecVal proc hWnd:DWORD, dwID:DWORD
 invoke GetDlgItemInt, hWnd, dwID, NULL, NULL
 dec eax
 invoke SetDlgItemInt, hWnd, dwID, eax, TRUE
    ret
DecVal endp

End DllEntry

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 实例10是一个模式对话框程序,该程序调用实例9的动态链接库程序.
;你也可以直接双击“实例10的程序运行结果”运行该程序的运行结果
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.386 
.model flat, stdcall 
option casemap:none 
;**************头文件和导入库文件****************************
include  windows.inc 
include  user32.inc 
include  kernel32.inc 
includelib  user32.lib 
includelib  kernel32.lib 
include  mydll.inc
includelib  mydll.lib
;**************equ******************************
IDD_DIALOG_APP  equ 101
IDC_BUTTON_ADD  equ 1000
IDC_BUTTON_DEC  equ 1001
IDC_EDIT   equ 1002
;**************data?****************************
.data? 
hInstance   HINSTANCE ? 
CommandLine  LPSTR ? 
buffer    db 512 dup(?) 
hLib   DWORD ?
dwFunctionAddr dd ?
;**************常量******************************
.const 
AppName    db  "Appdll",0 
szFunctionName2  db "DecVal",0
szFunctionName1  db "AddVal",0
szLibName   db "MyDLL.dll",0 
DllNotFound   db "The MyDLL.dll could not be found.",0
FunctionNotFound db "The Function could not be found.",0
;**************代码段****************************
.code 
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
    .if uMsg == WM_INITDIALOG 
        invoke SetDlgItemInt, hWnd, IDC_EDIT, 11, FALSE
    .elseif uMsg == WM_CLOSE 
        invoke EndDialog, hWnd,NULL
    .elseif uMsg == WM_COMMAND 
        mov eax, wParam 
        .if ax == IDC_BUTTON_ADD
         ;---直接调用DLL中的导出函数---
         invoke AddVal, hWnd, IDC_EDIT
        .elseif ax == IDC_BUTTON_DEC
         ;---直接调用DLL中的导出函数--- 
   invoke DecVal, hWnd, IDC_EDIT
        .endif 
    ;----------------------------------------------- 
    ; 如果送到该对话框过程的消息不是上面这些,
    ; 那么返回FALSE让系统的对话框管理器去处理这些消息,
    ; 否则返回TRUE来告诉系统已经处理过该消息。
    ;----------------------------------------------- 
    .ELSE 
        mov eax,FALSE 
        ret 
    .ENDIF 
    mov eax,TRUE 
    ret 
DlgProc endp 
;======================================================================
start: 
 ;----------------------------------------------- 
 ; 主程序段,程序的入口处
 ;----------------------------------------------- 
    invoke GetModuleHandle, NULL 
    invoke DialogBoxParam, eax, IDD_DIALOG_APP, NULL, DlgProc, NULL 
    invoke ExitProcess, NULL 
 ;----------------------------------------------- 
end start

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 这是一个模式对话框程序,该程序用于使用动态链接库程序.
;你也可以直接双击“实例11的程序运行结果”运行该程序的运行结果
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.386 
.model flat, stdcall 
option casemap:none 
;**************头文件和导入库文件****************************
include  windows.inc 
include  user32.inc 
include  kernel32.inc 
includelib  user32.lib 
includelib  kernel32.lib 
;**************用于定义一个函数指针类型************
FUNPROTO typedef proto :DWORD, :DWORD
PFUN  typedef ptr FUNPROTO
;**************equ******************************
IDD_DIALOG_APP  equ 101
IDC_BUTTON_ADD  equ 1000
IDC_BUTTON_DEC  equ 1001
IDC_EDIT   equ 1002
IDC_BUTTON_LOAD  equ 1003
IDC_BUTTON_UNLOAD equ 1004
;**************data?****************************
.data? 
hInstance   HINSTANCE ? 
CommandLine  LPSTR ? 
buffer    db 512 dup(?) 
hLib   DWORD ?
dwFunctionAddr dd ?
pFun   PFUN ?  ;---定义一个函数指针类型的变量.---
;**************常量******************************
.const 
AppName    db  "App1",0 
szFunctionName2  db "DecVal",0
szFunctionName1  db "AddVal",0
szLibName   db "MyDLL.dll",0 
DllNotFound   db "The MyDLL.dll could not be found.",0
FunctionNotFound db "The Function could not be found.",0
;**************代码段****************************
.code 
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
    .if uMsg == WM_INITDIALOG 
        invoke SetDlgItemInt, hWnd, IDC_EDIT, 11, FALSE
    .elseif uMsg == WM_CLOSE 
     .if hLib
         invoke FreeLibrary, hLib
     .endif
        invoke EndDialog, hWnd,NULL
    .elseif uMsg == WM_COMMAND 
        mov eax, wParam 
        .if ax == IDC_BUTTON_ADD
         ;------------------------------------------------------ 
   ; 在得到了动态链接库的句柄后再把您要调用的函数的名称一起
   ; 传给GetProcAddress函数.
   ; 如果成功的话它:会返回想要的函数的地址,失败的话返回NULL。
   ; 除非卸载该动态链接库否则函数的地址是不会改变的,
   ; 所以您可以把它保存到一个全局变量中以备后用。 
         ;------------------------------------------------------ 
         invoke GetProcAddress, hLib , addr szFunctionName1
         .if eax == NULL 
                invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK 
            .else
          ;----------------------------------------------- 
    ; 调用函数时要先把函数的变量压栈,
    ; 并且要把包含函数地址信息的变量用方括号括起来。
    ; 由于这些函数没有经过原型定义,因此不能使用invoke宏来调用函数.
          ;----------------------------------------------- 
             mov dwFunctionAddr,eax 
             push IDC_EDIT
             push hWnd
             call [dwFunctionAddr] 
            .endif
        .elseif ax == IDC_BUTTON_DEC 
         invoke GetProcAddress,hLib,addr szFunctionName2
         .if eax == NULL 
                invoke MessageBox,NULL,addr FunctionNotFound,addr AppName,MB_OK 
            .else
             mov pFun, eax 
             invoke pFun, hWnd, IDC_EDIT
            .endif
        .elseif ax == IDC_BUTTON_LOAD
         ;-----------------------------------------------  
   ; 调用LoadLibrary,其参数是欲加载的动态链接库的名称。
   ; 如果调用成功,将返回该DLL的句柄。 否则返回NULL。
   ; 该句柄可以传给 :library函数和其它需要使用动态链接库句柄的函数。 
         ;-----------------------------------------------  
         invoke LoadLibrary,addr szLibName 
         .if eax == NULL 
                invoke MessageBox,NULL,addr DllNotFound,addr AppName,MB_OK 
            .else
             mov hLib,eax
   .endif 
        .elseif ax == IDC_BUTTON_UNLOAD
         ;-----------------------------------------------  
   ; 调用FreeLibrary卸载动态链接库。
         ;-----------------------------------------------  
   invoke FreeLibrary, hLib
   mov hLib, 0 
        .endif 
    ;----------------------------------------------- 
    ; 如果送到该对话框过程的消息不是上面这些,
    ; 那么返回FALSE让系统的对话框管理器去处理这些消息,
    ; 否则返回TRUE来告诉系统已经处理过该消息。
    ;----------------------------------------------- 
    .ELSE 
        mov eax,FALSE 
        ret 
    .ENDIF 
    mov eax,TRUE 
    ret 
DlgProc endp 
;======================================================================
start: 
 ;----------------------------------------------- 
 ; 主程序段,程序的入口处
 ;----------------------------------------------- 
    invoke GetModuleHandle, NULL 
    invoke DialogBoxParam, eax, IDD_DIALOG_APP, NULL, DlgProc, NULL 
    invoke ExitProcess, NULL 
 ;----------------------------------------------- 
end start

 

;众所周知 汇编是一切高级语言的底层基础,所有高级语言都是由编译器编译成汇编在转换为机

;器语言实现的 VC中强大的MFC库是构架windows程序的神兵利器,但是汇编作为其基础,却

;能从中学到不少东西 今天无意中看见的一小段代码 发现还有些意思

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值