RadASM环境,win32汇编入门教程之六

;运行效果

;RadASM环境,win32汇编入门教程之六
;在上一个教程里面,我们学习了如何定义数据,那么在这一章节里面,我们来学习一下,再说明怎么把这些数据显示出来
;下列就是显示出这些数据的示例程序,可以直接复制下来,然后编译运行看看效果
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
include      windows.inc 
include      user32.inc 
include      kernel32.inc 
include      gdi32.inc         ;增加的内容

includelib   user32.lib        
includelib   kernel32.lib 
includelib   gdi32.lib         ;增加的内容
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD       
                                                
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA                                   
ClassName           db "SimpleWinClass",0        
AppName             db "窗口程序的模版",0
   
sF db "%d",0
     
hA dd 168 
hD db "世界,你好!",0  
.DATA?                                  
hInstance   HINSTANCE  ?                
CommandLine LPSTR      ?
hB          dd ?
.const;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
hC          equ 16800                                         
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.CODE                      

start:                      
invoke GetModuleHandle, NULL                                                    
mov hInstance,eax 
invoke GetCommandLine                                                                                       
mov CommandLine,eax 
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT        
invoke ExitProcess, eax                                          
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
        LOCAL wc:WNDCLASSEX                                          
        LOCAL msg:MSG 
        LOCAL hwnd:HWND 
        
        mov   wc.cbSize,SIZEOF WNDCLASSEX                            
        mov   wc.style, CS_HREDRAW or CS_VREDRAW                     
        mov   wc.lpfnWndProc, OFFSET WndProc                        
        mov   wc.cbClsExtra,NULL 
        mov   wc.cbWndExtra,NULL 
        push  hInstance 
        pop   wc.hInstance 
        mov   wc.hbrBackground,COLOR_WINDOW 
        mov   wc.lpszMenuName,NULL 
        mov   wc.lpszClassName,OFFSET ClassName 
        invoke LoadIcon,NULL,IDI_APPLICATION                          
        mov   wc.hIcon,eax 
        mov   wc.hIconSm,eax 
        invoke LoadCursor,NULL,IDC_ARROW                              
        mov   wc.hCursor,eax 
        invoke RegisterClassEx, addr wc                              
        invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,400,300, NULL,NULL,hInst, NULL 
        mov   hwnd,eax 
        invoke ShowWindow, hwnd,CmdShow                              
         invoke UpdateWindow, hwnd                                    

        .while TRUE                                                   
                invoke GetMessage, ADDR msg,NULL,0,0 
                .break .if (!eax) 
                invoke TranslateMessage, ADDR msg 
                invoke DispatchMessage, ADDR msg 
        .endw 
        mov     eax,msg.wParam                                         
        ret 
WinMain endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
         LOCAL @stPs:PAINTSTRUCT
         LOCAL @szBuffer[256]:byte 
         LOCAL @hDc
        
         .if uMsg == WM_CREATE                

        .elseif uMsg == WM_PAINT       
                invoke BeginPaint,hWnd,addr @stPs
                mov    @hDc,eax 
                ;下面显示168
                invoke wsprintf,addr @szBuffer,addr sF,hA           
                invoke lstrlen,addr @szBuffer
                invoke TextOut,@hDc,100,30,addr @szBuffer,eax       ;显示函数
                ;下面显示1680
                mov hB,1680
                invoke wsprintf,addr @szBuffer,addr sF,hB
                invoke lstrlen,addr @szBuffer
                invoke TextOut,@hDc,100,60,addr @szBuffer,eax
                ;下面显示16800
                invoke wsprintf,addr @szBuffer,addr sF,hC
                invoke lstrlen,addr @szBuffer
                invoke TextOut,@hDc,100,90,addr @szBuffer,eax
                ;下面显示"世界,你好!"
                invoke lstrlen,addr hD
                invoke TextOut,@hDc,100,120,addr hD,eax
                
                invoke EndPaint,hWnd,addr @stPs  
        .elseif uMsg == WM_DESTROY                                           
                invoke PostQuitMessage,NULL                               
        .else 
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam             
        ret 
    .endif 
    xor eax,eax 
    ret 
WndProc endp 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start   

;在这个示例里面,我们显示4个东西,分别是数字168、1680、16800和字符串"世界,你好!"
;首先,需要增加1个头文件和库文件,就是上面添加的
include      gdi32.inc
includelib   gdi32.lib
;这些文件里面定义了一些基本的数据结构之类的,就是微软公司先把一些最基础的定义好了,后面就可以直接调用一些函数。
;经常编译不过的时候,提示没有定义某个函数之类的,往往就是缺少了这些头文件。gdi32文件是关于一些绘画的函数。

;先看这句: hA dd 168 ,这就是定义一个叫hA的4字节数字168,hA是名称,dd是dword的简称,即4字节,就是32位的意思,因为每个字节是8位
;可不可以定义成hA db 168 呢,也可以,这样定义的话就是定义1个单字节的值。但很少这样做,因为后面调用的函数参数基本是32位的,如果定义成1个字节的话
;后面要转成32位的值,还要保证高位字节都是零,才能当做参数调用函数,所以默认的都是定义成dd类型。
;上面有个单词 .DATA,这个指的是数据区,设定初值的数据放在这个区里面。

;看第2个定义:  hB dd ?
;它放在 .DATA? 这里,这是未初始化的数据区,就是先定义,不赋值先。

;看第3个定义:  hC equ 16800 
;它放在 .const ,这个是固定数据区,就是放在这儿的是不能改变的数据。这里用了一个命令equ,它是等同的意思。就是说hC就是16800,但不能说16800就是hC,因为在程序中或程序运行中,可能也会产生16800的值。

;看第4个定义: hD db "世界,你好!",0 
;它放在 .DATA,即放在数据区,是设定了初值的,在程序中也可以改变
;它是定义1个字符串,db是dword byte的缩写,就是4字节作为地址值。我们需要这样理解,hD并不等于这个字符串,而是这个字符串的地址,也叫指针值。

;后面研究一下,在窗口函数WndProc中有哪些内容
;先定义1个名叫@stPs的PAINTSTRUCT结构变量,这个名字@stPs随便取的,一般约定成俗的局部变量前面加@而已。
;那什么叫局部变量,局部变量就是在函数运行期内,它是有效的,离开函数时就被电脑收回了。
;那什么时候离开?当程序运行时,走到最后一个命令ret,就是返回上一层,即调用它的那一层,就是离开了这个函数了。
;像@stPs这个变量,它定义在WndProc函数内,当WndProc函数运行完,返回上一层后,它就不能再被其它的函数调用了,不能再使用了。

;PAINTSTRUCT这个结构是什么东西,看它的字面意思就知道,它是画的结构
;简单地说,就是重新画这个窗口时,根据这个结构内的设定值重新画它。
;为什么要重画它?
;很多情况要重画,比如里面要显示的内容发生变化,或最小化状态恢复原状,或被其它窗口挡住又恢复了等等。
;具体的我们以后再研究,这里可以先定义,当然,只是定义,结构内的成员还没有实际值的。

;@szBuffer是准备中转用的字符串数组的变量。因为前面定义的像hA,hB,hC是数值,不是字符串,后面在显示前要转化为字符串才行。
;我们要知道,数值是不能直接显示出来的,就算你看到窗口上写着123之类的这些东西,它并不是数值,而是字符串。
;就像你拍了一张文档,看起来是文字,但其实它是相片。

;@hDc是为后面储值用的变量,也可以这样写 @hDc:dword,只是后面的dword省略了,后面没有像:dword这样或类似的类型说明的,都是默认为dword型,即4字节型。

;看.elseif uMsg == WM_PAINT 这句,这句的意思是,当要重绘时,要干什么
;就是说,当重绘消息来时,要怎么画这个窗口
;比如电脑刚把程序运行起来,需要重绘
;比如最小化之后又恢复原状,怎么重新画出来,需要重绘等等
;电脑要怎么重绘时,就在WM_PAINT下面找这些代码


;invoke BeginPaint,hWnd,addr @stPs 这句的意思是,得到窗口原来的设定,并把它保存到@stPs里面去。
;就是把窗口有多长,有多宽,要不要在重绘之前,把原来没被挡住的部分保存原样,或者要不要原来显示的擦除掉等等。
;这些具体的我们不用管它,让电脑自已处理。我们要做的就是把我们需要增加上去的内容,告诉电脑,一起画出来。
;这些内容,就是我们想显示的4个东西了。

;mov    @hDc,eax 就是把得到的设定保存起来,可以理解为把这个程序窗口保存下来。后面要显示什么的,告诉电脑,把要显示的东西显示到这个程序窗口上去,而不是其它的程序窗口。

;invoke wsprintf,addr @szBuffer,addr sF,hA 这句的意思是,因为hA是个数字,不能直接显示,要先通过格式化函数wsprintf把hA转化为字符串,并保存到@szBuffer里面去。
;invoke lstrlen,addr @szBuffer 这句的意思是,得到@szBuffer这个字符串的长度,后面紧跟着的eax就是这个函数的返回值,即字符串的长度
;invoke TextOut,@hDc,100,30,addr @szBuffer,eax 这句的意思是在坐标为100.30的地方把字符串@szBuffer显示出来,坐标从左上角开始算。

;显示1680时,因为前面是未初始化的,就是没有给定值的,所以这里要赋值给它。mov hB,1680
;显示16800时,前面也相当于初始化了,所以同样操作进行显示。
;而显示"世界,你好!"时,因为它是已经初始化了的,且定义的是字符串,所以可以直接使用函数TextOut把它显示在窗口上。

;invoke EndPaint,hWnd,addr @stPs  这一句的意思是,在指定窗口中标记绘制的结束
;BeginPaint与EndPaint是配对出现在,在它们的之间是重绘的内容。

;以上是显示数字或字符串的示例,当然,仅仅是显示了内容。
;看起来还是不太好看,还有一些东西可以改变,比如字体、字体大小、前景色或文本色等。这些我们在下一个教程里再学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/20085.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter

项目文件目录结构介绍 注:创建 Flutter 项目名称不要包含特殊字符,不要使用驼峰标识 // TODO 开发中运行一个 Flutter 三种启动方式: Run 冷启动从零开始启动Hot Reload 热重载执行 build 方法Hot Restart 热重启重新运行整个 APP 代码分析…

【基础架构篇十一】《DeepSeek日志体系:ELK+Prometheus监控方案》

各位被日志淹没的工程师们,是否经历过这些抓狂时刻?——凌晨三点被报警短信吵醒,打开系统却看到: 日志文件以每秒100MB的速度疯狂膨胀关键报错信息在10TB日志里玩捉迷藏监控图表像心电图一样上蹿下跳服务器硬盘在报警声中发出垂死呻吟今天我们不聊什么基础的日志收集,直接…

JavaEE -JDBC池化思想 与 IDEA导包

1.JDBC概述 1.JDBC 的概述 * Java DataBase Connectivity Java数据库的连接。 * 目的使用 Java 的代码来操作数据库 * 需要使用 JDBC ( Java 数据库的连接)规范来操作数据。 2.JDBC 的规范 * JDBC是一套接口规范 * JDBC的实现类都是由各个数据库的…

Pycharm打开的jupyter notebook无法在pycharm中关闭怎么解决

首先你可以先看一下你的pycharm的jupyter界面的输出: 可以看到第一行有个启动命令 找到这个–port的端口号,现在我们可以走下面的步骤,假设你找到的是–port47187 : 步骤 1:定位占用端口的进程(Linux/Mac…

电磁铁的磁芯材质

电磁铁的磁芯通常采用软铁材质,因其具有高磁导率和低矫顽力,使得电磁铁能够在通电时迅速产生强磁场,断电后磁场又能迅速消失。 一、电磁铁与磁芯材质 电磁铁是一种利用电流产生磁场的装置。其核心部件——磁芯,对电磁铁的性能有着…

网络安全等级保护测评(等保测评):全面指南与准备要点

等保测评,全称为“网络安全等级保护测评”,是根据《网络安全法》及《网络安全等级保护条例》等法律法规,对信息系统进行安全等级划分,并依据不同等级的安全保护要求,采用科学方法和技术手段,全面评估信息系…

24蓝桥省赛B-数字接龙

#include<bits/stdc.h> using namespace std; const int N13; int mp[N][N],flag,n,k; bool vis[N][N]; int f[N][N][N][N];//存储路径,用于判断是否斜着走,是本题剪枝的难点 vector<int>ans; vector<int>res; int dx[]{-1,-1,0,1,1,1,0,-1}; int dy[]{0,1,1…

基于豆瓣2025电影数据可视化分析系统的设计与实现

✔️本项目旨在通过对豆瓣电影数据进行综合分析与可视化展示&#xff0c;构建一个基于Python的大数据可视化系统。通过数据爬取收集、清洗、分析豆瓣电影数据&#xff0c;我们提供了一个全面的电影信息平台&#xff0c;为用户提供深入了解电影产业趋势、影片评价与演员表现的工…

React实现自动滚动表格

在 React 中实现一个自动滚动的表格&#xff0c;可以通过 CSS 动画和 JavaScript 定时器来实现。以下是一个完整的示例代码&#xff0c;包含示例数据和自动滚动功能。 实现思路&#xff1a; ** 自动滚动&#xff1a;** 使用 setInterval 实现表格的自动滚动。 手动滚动&…

2024年GESP09月认证Scratch一级试卷

2024年GESP09月认证Scratch一级试卷分数&#xff1a;100 题数&#xff1a;17 一、单选题(共10题&#xff0c;每题3分&#xff0c;共30分) 01020304050607080910AACBCABCDD 1、据有关资料&#xff0c;山东大学于1972年研制成功DJL-1计算机&#xff0c;并于1973年投入运行&…

Qt常用控件之按钮QPushButton

按钮QPushButton QPushButton 在 Qt 中用于表示一个按钮控件&#xff0c;它继承自抽象 QAbstractButton 类。 QPushButton属性 属性说明text按钮中的文本。icon按钮中的图标。iconSize按钮中图标的大小。shortCut按钮对应的快捷键。autoRepeat按钮是否会重复触发&#xff08…

【PHP】php+mysql 活动信息管理系统(源码+论文+数据库+数据库文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【PHP】php 活动信息管理系统&#xff08;源码论文…

搭建一个 Spring Boot 项目,解决jdk与springboot版本不匹配

搭建一个 Spring Boot 项目 方式一&#xff1a;使用 Spring Initializr Spring Initializr 是一个基于 Web 的工具&#xff0c;用于快速生成 Spring Boot 项目的基础结构。 访问 Spring Initializr 网站&#xff1a;https://start.spring.io/配置项目信息&#xff1a; …

基于SpringBoot的小区运动中心预约管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

WPF快速创建DeepSeek本地自己的客户端-基础思路版本

开发工具&#xff1a;VS 2015 开发环境&#xff1a;.Net 4.0 使用技术&#xff1a;WPF 本篇文章内容&#xff1a; 本地部署DeepSeek以后一般使用网页工具&#xff08;如Chatbox&#xff09;或者DOS窗口与其对话。本篇文章使用WPF创建一个基础版的对话工具。 一、搭建本地DeepS…

【怎么使用Redis实现一个延时队列?】

怎么使用Redis实现一个延时队列? 详细说明Java代码示例解释注意事项使用Redis实现延时队列通常通过有序集合(Sorted Set)来实现,利用Redis的ZSET类型及其相关命令可以很方便地实现这一功能。 有序集合中的每个元素都有一个分数(score),我们可以利用这个分数来存储消息需…

Blackbox.AI:高效智能的生产力工具新选择

前言 在当今数字化时代&#xff0c;一款高效、智能且功能全面的工具对于开发者、设计师以及全栈工程师来说至关重要。Blackbox.AI凭借其独特的产品特点&#xff0c;在众多生产力工具中脱颖而出&#xff0c;成为了我近期测评的焦点。以下是我对Blackbox.AI的详细测评&#xff0…

第2章 信息技术发展(一)

2.1 信息技术及其发展 2.1.1 计算机软硬件 计算机硬件(Computer Hardware)是指计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称。 计算机软件 (Computer Software)是指计算机系统中的程序及其文档&#xff0c;程序是计算任务的处理对象和处理规则的描述; 文档…

AI工作流

AI 工作流 是什么&#xff1f; AI 工作流 是一种利用人工智能技术设计的一系列任务或步骤序列&#xff0c;用于完成特定目标的过程。它将一系列AI相关的操作整合在一起&#xff0c;形成一个高效的、结构化的流程&#xff0c;从而实现预定的目标。 AI 工作流 的组成部分 目标定…

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…