win32汇编环境,怎么进行乘法运算的
;运行效果
;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