当前位置: 首页 > article >正文

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 


 


http://www.kler.cn/a/473030.html

相关文章:

  • eNSP之家——路由器--入门实例详解
  • BeanFactory与factoryBean 区别,请用源码分析,及spring中涉及的点,及应用场景
  • 如何隐藏 Nginx 版本号 并自定义服务器信息,提升安全性
  • 『SQLite』常见日期时间函数的使用
  • [Linux]redis5.0.x升级至7.x完整操作流程
  • vue3中el-table实现多表头并表格合并行或列
  • (一)使用 WebGL 绘制一个简单的点和原理解析
  • 《计算机视觉解锁图像理解密码:编程实现图片场景文字描述生成》
  • Ungoogled Chromium127 编译指南 MacOS篇(七)- 安装依赖包
  • 【郑大主办、ACM出版、EI稳定检索】第四届密码学、网络安全与通信技术国际会议 (CNSCT 2025)
  • 瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp)
  • spring cloud alibaba-dubbo3 rpc运行原理
  • 最新版Edge浏览器加载ActiveX控件之Adobe PDF阅读器控件
  • 【MySQL高可用】什么时候分库、分表?怎样进行分库分表?
  • 网络安全 | 网络安全的未来趋势
  • 数智大咖谈 | 志邦家居:智慧家居与智慧管理并驾齐驱
  • select下拉框,首次进入页面没有显示value的情况
  • 如何构建多层决策树
  • c#编写基于ffmpeg的视频裁剪
  • 【VBA】【EXCEL】将某列内容横向粘贴到指定行
  • 点击底部的 tabBar 属于 wx.switchTab 跳转方式,目标页面的 onLoad 不会触发(除非是第一次加载)
  • P1909 [NOIP2016 普及组] 买铅笔 题解
  • python初体验: 处理excel数据
  • redis的学习(四)
  • UART串口数据分析
  • 一个海外产品经理的 AI 日常