;运行效果

;win32汇编环境,怎么进行乘法运算的
 ;基础知识,重新复习一下。
 ;首先需明白字节的概念。1个字节是8位,al和ah都是8位的,8位之中每位要么是0,要么是1,假如8位都是1,就是16进制的FF,也就是10进制的255,所以说al或ah最多为255,超过它就会报错。
 ;你输入mov al,256 然后编译,就会报错。但是输入mov al,255 就可以编译。
 ;使用mul指令,让eax乘以某值,结果放eax里面。
 ;我们常使用eax,有4字节,就是32位,一般够用了。
 ;直接抄进RadAsm可编译运行。重要部分加备注。
 ;下面为asm文件
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .386 
 .model flat,stdcall 
 option casemap:none 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; Include 文件定义
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 include    windows.inc 
 include    user32.inc 
 include    kernel32.inc 
 includelib user32.lib 
 includelib kernel32.lib 
; 自定义函数声明
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; 数据段
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .data 
 DlgName    db "MyDialog",0 
szSucceesCap        db "提示",0     
 szCheshi_template   db "结果是 %d",0
 .data? 
 hInstance HINSTANCE             ? 
.const 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; Equ 等值定义
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ICO_MAIN equ 1000    ;图标
 IDB01    equ 21
 IDB02    equ 22
 IDB03    equ 23
 IDB04    equ 24
 ; 代码段
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .code 
 start: 
     invoke GetModuleHandle, NULL 
     mov    hInstance,eax 
     invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL 
     invoke ExitProcess,eax 
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
         LOCAL   @Buffer[256]:byte
         LOCAL   @A:DWORD
         
         .if     uMsg == WM_INITDIALOG 
                 invoke    LoadIcon,hInstance,ICO_MAIN    ;加载图标
             invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
         .elseif uMsg==WM_COMMAND                         
                 mov eax,wParam                         
                 .if     eax == IDB01   
                         ;以下为寄存器相加模式                  
                         mov eax,10 
                         mov ebx,15
                         mul ebx     ;相当于eax * ebx,再把结果放eax里面 
                 invoke wsprintf,addr @Buffer,addr szCheshi_template,eax   ;相乘的结果在eax里,所以这里放eax
                 invoke MessageBox,hWnd,addr @Buffer,addr szSucceesCap,MB_OK or MB_ICONINFORMATION                  
          .elseif eax == IDB02
                 ;以下为存储器相加模式 
                         mov eax,11 
                         mov @A,16      ;@A是前面定义的四字节变量地址,里面的值现在是16,那地址是多少,这个得由系统分配。写外挂的就是专门找这些地址,然后改动它,就可以改数据了。
                         mul @A         ;相当于把eax*@A这个内存地址里的值,结果放eax里      
                 invoke wsprintf,addr @Buffer,addr szCheshi_template,eax      
                 invoke MessageBox,hWnd,addr @Buffer,addr szSucceesCap,MB_OK or MB_ICONINFORMATION  
          .elseif eax == IDB03
                 ;以下为立即数相加模式 
                         mov eax,12 
                         mul eax        ;可以乘以自身,即12*12
                 invoke wsprintf,addr @Buffer,addr szCheshi_template,eax  
                 invoke MessageBox,hWnd,addr @Buffer,addr szSucceesCap,MB_OK or MB_ICONINFORMATION     
                 .endif
         .elseif uMsg == WM_CLOSE 
                 invoke EndDialog, hWnd,NULL 
         .else 
                 mov eax,FALSE 
                 ret 
         .endif 
                 mov eax,TRUE 
         ret 
 DlgProc endp 
end start 
  
;下面为rc文件内容
 #include "resource.h"                   //提示缺少该文件,可以在资源里下载
 #define     ICO_MAIN    1000    //图标
 #define  IDB01       21
 #define  IDB02       22
 #define  IDB03       23
 #define  IDB04       24
ICO_MAIN ICON "Main.ico"
//定义对话框
 MyDialog DIALOG 10, 10, 190, 90 
 STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | 
 WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 
 CAPTION "对话框程序模版" 
BEGIN 
      CTEXT "10 * 15 = ?", -1, 5, 20, 70, 19
      CTEXT "11 * 16 = ?", -1, 5, 40, 70, 19
      CTEXT "12 * 12 = ?", -1, 5, 60, 70, 19
      
      PUSHBUTTON      "点我看寄存器乘法结果", IDB01,  70,18,100,12 
      PUSHBUTTON      "点我看存储器乘法结果", IDB02,  70,37,100,14 
      PUSHBUTTON      "点我看乘自身乘法结果", IDB03,  70,56,100,14 
 END 
  


















