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

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.mrgr.cn/news/83375.html

相关文章:

  • css面试常考布局(圣杯布局、双飞翼布局、三栏布局、两栏布局、三角形)
  • priority_queue优先队列
  • web前端第三次作业
  • 结构型模式4.装饰器模式
  • VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案
  • Qt 界面外观
  • 测试开发之面试宝典
  • 01 springboot集成mybatis后密码正确但数据库连接失败
  • JVM与Java体系结构
  • SQL从入门到实战-2
  • 【华为云开发者学堂】基于华为云 CodeArts CCE 开发微服务电商平台
  • Mysql进阶篇
  • 01 Oracle自学环境搭建
  • Lambda expressions in C++ (C++ 中的 lambda 表达式)
  • L1G5000 XTuner 微调个人小助手认知
  • Microsoft 已经弃用了 <experimental/filesystem> 头文件
  • 力扣算法题(基于C语言)
  • 2025年第三届“华数杯”国际赛B题解题思路与代码(Python版)
  • Qt学习笔记第81到90讲
  • 油猴支持阿里云自动登陆插件
  • SpringBoot3
  • java开发springoot
  • 金融项目实战 02|接口测试分析、设计以及实现
  • 鼠标自动移动防止锁屏的办公神器 —— 定时执行专家
  • 【traefik】forwadAuth中间件跨namespace请求的问题
  • 【FPGA】时序约束与分析