WIN32汇编-HELLO,WORLD!



 

 我们用WIN32汇编构建第一个WINODWS程序,这个程序完成显示一个带问号的对话框,对话框的内容是现在系统时间。

   首先,打开MASM32Editor(在桌面上可以找到图标),在里面输入以下代码:
     .386
     .model flat, stdcall
     option casemap :none  
;#################################################################
     include windows.inc
     include user32.inc
     include kernel32.inc
     include gdi32.inc
     include masm32.inc
     
     includelib user32.lib
     includelib kernel32.lib
     includelib gdi32.lib
     includelib masm32.lib
;#################################################################
   .data?
      szbuffer db 100 dup(?)
   .data
      szcaptionName db "我的HELLO,WORLD!",0
      szbegin db "现在时间:"
      sztext db 100 dup(?)
;#################################################################  .code
start:
;程序的入口
       call _callgetnow
       invoke MessageBox,NULL,offset szbegin,offsetszcaptionName,MB_ICONQUESTION or MB_OK
       invoke ExitProcess,eax
;#################################################################
_callgetnow proc
    pushad
  invokeGetDateFormat,LOCALE_USER_DEFAULT,DATE_LONGDATE,NULL,NULL,addrsztext,100
    invokeGetTimeFormat,LOCALE_USER_DEFAULT,LOCALE_NOUSEROVERRIDE,NULL,NULL,addrszbuffer,100
   
    invokeszCatStr,addr sztext,addr szbuffer
    popad
    ret
_callgetnow endp
;#################################################################
end start
  将上述代码保存为HELLOWORLD.ASM后,对程序进行编译。
  在编译前参照下图设置好系统的环境变量,path变量加上x:\masm32\bin,lib变量加上x:\masm32\lib,include变量加上x:\masm32\include。
  确环境变量设置好后,进入DOS窗口开始编译。
   首先运行ml,编译成coff文件格式
  然后运行LINK,进行链接,生成EXE文件,


  大功造成,运行一下试试效果吧!


 下面我们接着来做一个有些难度的helloworld,这个程序将系统时间直接显示在桌面上。程序源代码如下:
    .386
     .model flat, stdcall
     option casemap :none  
;#########################################################################
     include windows.inc
     include user32.inc
     include kernel32.inc
     include gdi32.inc
     include masm32.inc
     
     includelib user32.lib
     includelib kernel32.lib
     includelib gdi32.lib
     includelib masm32.lib
;#########################################################################
   .data?
      szbuffer db 100 dup(?)
   .data
      szmssucesscap db "HELLO,WORLD!深入",0
      szmssucesstext db "在桌面的(300,300)处显示了当前时间",0
      szmscap db "错误",0
      szmstext1 db "无法在桌面上显示!",0
      szmstext2 db "无法得到全屏DC!",0
      szbegin db "现在时间:"
      sztext db 100 dup(?)
;#########################################################################
    .code
start:
;程序的入口
       _showtext  proto :DWORD
       call _callgetnow
       invoke _showtext,offset szbegin
       invoke ExitProcess,eax
;#########################################################################
_callgetnow proc
    pushad
  invokeGetDateFormat,LOCALE_USER_DEFAULT,DATE_LONGDATE,NULL,NULL,addrsztext,100
    invokeGetTimeFormat,LOCALE_USER_DEFAULT,LOCALE_NOUSEROVERRIDE,NULL,NULL,addrszbuffer,100
   
    invokeszCatStr,addr sztext,addr szbuffer
    popad
    ret
_callgetnow endp
;#########################################################################
_showtext proc  lpsztext:DWORD
    LOCAL@Desktopdc:HDC
    LOCAL@dwcolor:DWORD
   
    pushad
    mov@dwcolor,00FF0000h
    invokeGetWindowDC,NULL
    cmpeax,0
    jne @f
    invokeMessageBox,NULL,offset szmstext2,offset szmscap,MB_ICONERROR
    @@:
    mov@Desktopdc,eax
    invokelstrlen,lpsztext
    movebx,eax
    invokeSetBkMode,@Desktopdc,TRANSPARENT
    invokeSetTextColor,@Desktopdc,@dwcolor
    invokeTextOut,@Desktopdc,300,300,lpsztext,ebx
    invokeMessageBox,NULL,offset szmssucesstext,offsetszmssucesscap,MB_ICONINFORMATION
    cmpeax,0
    jne @f
    invokeMessageBox,NULL,offset szmstext1,offset szmscap,MB_ICONERROR
    @@:
    popad
    ret
_showtext endp
;#########################################################################
end start
 
以上程序中有几个重要的GDI相关的API,下面简要介绍一下
(1)
invoke SetBkMode,@Desktopdc,TRANSPARENT
设置背景方式为透明
(2)
invoke SetTextColor,@Desktopdc,@dwcolor
设置字体颜色为蓝色
(3)
invoke TextOut,@Desktopdc,300,300,lpsztext,ebx
在300,300处显示文本
(4)
invoke GetWindowDC,NULL
取得桌面DC
(5)
mov @dwcolor,00FF0000h
设置颜色为蓝色。@dwcolor是一个DWORD型的变量,
  可以在相关头文件中找到这样的定义:
typedef DWORD COLORREF;
因此COLORREF类型的变量就是DWORD型变量。
 COLORREF变量如何表示颜色呢,只有一个双字大小,它的表示格式是(16进制):
0x00bbggrr
bb表示蓝色,gg表示绿色,rr表示红色
00FF0000h:蓝
0000ff00h:绿
000000FFh:红
程序运行效果如下:

笔者几年前用WIN32汇编做的几个小作品,欢迎大家试用
掂花即时朗读王
  http://skycn.net/soft/36318.html
掂花反键盘鼠标记录器
Windows下DOSbox的使用,及编写一个简单的Hello World DOSbox的使用,汇编环境的配置,写一个简单的汇编hello world 阅读详情

相关推荐

VS2015下使用纯WIN32 API写的Hello World代码及程序!(C/C++最小版本)

VS2015下使用纯WIN32 API写的Hello World!基本上算是C/C++能写到的最小版本。资源包含工程文件、源代码文件及生成的32/64位的EXE文件

开始Win32汇编

win32汇编入门,第一个win32汇编程序

weixin_43754657的博客 586

【Python&RS】Rasterio库安装+基础函数使用教程

Rasterio是一个Python库,专门用于栅格数据的读写操作。它支持多种栅格数据格式,如GeoTIFF、ENVI和HDF5,为处理和分析栅格数据提供了强大的工具。RasterIO适用于各种栅格数据应用,如卫星遥感、地图制作等。这篇文章跟大家介绍一下Rasterio库的安装以及一些基本函数的使用教程,附带源码。

Remote Sensing迷途小书童 1万+

"hello,world!"win32汇编小程序

  "hello,world!"win32汇编小程序szText    db "Hello, world!",0szCaption db "Win32

Thinking > Coding >Think 1952

用Proteus8.9自带STM32F401VE的Controller仿真STM32F407ZGT6,F429IGT6

@用Proteus8.9自带STM32F401VE的Controller仿真STM32F407ZGT6,F429IGT6 一, 目前得到的 Proteus8.9版本软件能够支持的Cortex-M4固件库项目,只能到达STM32F401VE (如下图1所示)。 (图1) 作为ST公司Cortex-M4更为广泛应用的F407,F429系列芯片;现在的Proteus8.9版本软件还没有固件库支持,不能...

kaillen的博客 3万+

【PyBind11+anaconda+opencv+windows11+cmake+wsl+vscode】从入门到跑通。构建基于opencv c++的python package

如何安装请详见上文 【PyBind11+anaconda+opencv+windows11+cmake+wsl+vscode】从入门到跑通。构建基于opencv c++的python接口_子韵如初的博客-优快云博客w不需要安装啥x11 、 xming直接mobxterm可以搞定点击右上角的X server打开可视化服务器然后 apt install x11-apps -yxclock 搞定从mobxterm可以看到display的端口X11显示可视化的原理是就是通过X协议,类似于http对linux于w

weixin_43953700的博客 3万+

Win32汇编:基础知识入门

汇编语言是所有程序设计语言中最古老的,它与计算机机器语言最为接近,通过汇编语言可以直接访问计算机的硬件,能够直接与CPU对话,可以说汇编语言是所有编程语言中语法格式最自由的,但自由的代价就是需要了解计算机体系结构和操作系统的大量细节,每编写一段程序都需要考虑各种硬件的状态,从而导致使用汇编写程序效率非常低.

微软技术分享 7607

FlashAttention 快速安装指南(避免长时间编译)

FlashAttention 编译太慢?本篇提供无需编译的预编译 wheel 快速安装方案,适配多版本 Python、PyTorch 和 CUDA,极大节省部署时间!

Junseer的博客 9721

《WINDOWS 环境下32位汇编语言程序设计》第3章 使用MASM

本章主要介绍MASM的使用,内容包括:Win32汇编源程序的结构、调用API、标号,变量和数据结构、使用子程序、高级语法和代码风格。

chenyijun的专栏 975

机器人手眼标定快速精度验证方法

机器人手眼标定快速精度验证方法

laoli_的博客 1万+

MATLAB实战:5分钟搞定雷达信号分选SDIF算法(附完整源码下载)

本文详细介绍了如何在MATLAB中快速实现雷达信号分选的SDIF算法,通过序列差直方图统计高效识别脉冲重复间隔(PRI)。文章包含完整源码下载,从算法原理到实战调优技巧,帮助工程师在5分钟内掌握核心实现方法,显著提升雷达信号处理效率。

info6的博客 614

win32汇编:环境变量配置和Hello,World!例子

1.环境变量配置可以写一个bat文件,每次运行。也可以直接把下面的几项添加到系统变量里,我用的系统是Vista。@echo offset masmhome=D:/masm32set path=%masmhome%/bin;%masmhome%;.;set include=%masmhome%/include;%include%set lib=%masmhome%/lib;%

albon arith 5084

[DevExpress]GridControl拖拽行记录排序

DevExpress的GridControl拖拽行记录排序需求效果代码 需求 现在用户对按钮点击排序不满意了, 希望拖拽排序。 重载GridControl控件,对MouseMove、MouseDown、MouseUp事件修改一下。 效果 代码 using System; using System.Drawing; using System.Windows.Forms; using xiaoid.forms; using System.Data; using System.Collections.Gener

德仔 1561

简单win32汇编程序,无窗体,直接画在桌面上。

我前面有介绍 组建 win32汇编IDE,现在写个东西练一下。这个程序是 《Windows Graphics Programming: Win32 GDI and DirectDraw》   这本书里面 hello2 的asm 仿照版。============================源代码开始==================================.386.

dkink的专栏 1948

YOLOv11改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 779

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

win32汇编入门了解(1)环境搭建

说明:本系列内容不会详细讲解汇编的知识,只是记录我自己学习的一个过程,而且,我学习的目标不是打算写汇编,而是了解一点点win32汇编的知识,只是为了让自己能读懂最基本的汇编。另外,win32汇编的核心应该还是在windows API的学习,这个不是我的重点,可以认为我只是打算学习一下http://book.51cto.com/art/200907/133699.htm这本书的第三章的内容!:)

。。。。 2550

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VS2022 Win32汇编环境·Assembly · Hello World

VS2022 Win32汇编环境配置下载MASM32vs2022配置新建项目 下载MASM32 下载地址:http://www.masm32.com/download.htm 安装 vs2022配置 创建新项目 修改依赖项 配置MASM32 子系统:控制台 入口点设置好 新建项目 .386 .model flat,stdcall option casemap:none; includelib msvcrt.lib printf PROTO C:ptr sbyte,:VARARG

zhj12399的博客 2334

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Win32汇编下Hello World程序

.386 .model flat, stdcall option casemap:none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;          Incude 文件定义 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include     windows

LDWJ2016的博客 1143

Win32下AT&T汇编Hello world教程

因为复试的需要,学习了下和汇编相关的东西,虽然当年学过微机原理,不过没下功夫[其实是老师水,教材水啊....]现在只能恶补了这两天玩了下masm,nasm,gas,当然只是搭建了基本的环境,跑了下基本的实例因为gas相关文档比较稀缺,所以本篇日志记录一些和其相关的主要目的是备份一下,省的以后忘了顺便说一下,我用的是和谐的WinXP系统1.环境搭建,从sf下MinGW套件,这一步不在赘述2.基本的程序先来一个最简单的hello world,不过用到了c运行时,当然也可以写那种纯粹的保护模式的,不过比较麻烦,现

424

WIN32汇编学习笔记(一)

win32汇编入门级

aak1247的博客 920

nasm的Hello, World!程序应该这么写(Win32控制台)

;hello.asm 仅仅适用于win32控制台程序 ;nasm -f win32 -o hello.o hello.asm ;gcc -o hello.exe hello.o bits 32 ;这似乎不是必须的,但nasm还可以编译16位程序及16、32位 ;混合编程的程序,所以在32位程序中习惯上加上这个 ;这里定义了一个宏,以模拟enter指令,nasm似乎没有这个指令 %if...

weixin_39410618的博客 921

自己第一个汇编程序:Hello World !

      也许是一种兴趣,也许是一种执着,也许是一种追求,所以选择学习汇编。在这之前看过部分汇编的视频,讲到CPU结构、寄存器之类头蒙了,有种当初连Windows API都没掌握一点的前提下去看MFC的那种感觉,当初确实很傻,现在终于能深刻体会候俊杰的话了:“勿在浮沙筑高台”,严重“受挫碰壁”后当时便把汇编撂那儿了。如今重拾,便下定决心了!       因为朋友、爱人、亲人他们的笑脸永远

Koma的主页 1万+

汇编程序的结构——Hello World !

; Win32汇编中,注释以( ; )开始;换行是在一行的最后用( / )做换行符。;-----------------------------------------------------------------------------------------------------; 一、模式定义; ①指令集:告诉编译器在本程序中使用的指令集。Win32环境工作在8086及;                    以上的处理器中,所以.386这句比不了少!而后面带p,如 .386p;         

Jay Chu's News 664

lib不是有效的win32应用程序_Win32汇编开篇、Hello World

下载MASM32地址:http://www.masm32.com/MASM32并不是微软官方发布的软件,是国外的MASM爱好者自行整理和编写的一个软件包,最高版本为11.0版,另外下载了MASM32 ,还要下载一个开发工具RadASM,RadASM下不下载都行,如果没有,需要我们手动编译(ml)、链接(exe)。有了RadASM,可以一键编译、链接、运行。注意的是,MASM32 安装只能...

weixin_35644453的博客 534

我的第一個ASM Hello World

本文介紹如何在WINDOW平台下寫一個WIN32的asm程序 --ADDRESS 0100 //AH register is used on DOS Interrupt to define what function should call ADDRESS 0100 MOV AH,09 //Make Register AH (8-Bits Register...

aojiazhifang61415的博客 144
上一篇: 保护模式下段寄存器的作用
下一篇: win32汇编快速入门
deepfuture
博客等级 码龄17年 210粉丝 1287原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值