您的位置:首页 > 新闻 > 会展 > 扬州又出现一例_网站设计网站公司_成都seo招聘信息_搜外友链

扬州又出现一例_网站设计网站公司_成都seo招聘信息_搜外友链

2025/2/25 3:15:41 来源:https://blog.csdn.net/iltokyo/article/details/145532836  浏览:    关键词:扬州又出现一例_网站设计网站公司_成都seo招聘信息_搜外友链
扬州又出现一例_网站设计网站公司_成都seo招聘信息_搜外友链

;运行效果

;win32汇编环境,结构体的使用示例一
;举例说明结构体的定义,如何访问其中的成员,使用assume指令指向某个结构体,利用偏移得到成员值等
;直接抄进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 
szCaption  db "提示",0
szFormat   db "%d",0
szYES      db "Yes",0    

;比如,以下定义一个有4个成员的结构体
Aligned_student struct 
   m_Age          DWORD    ?                             ;不初始化,DWORD是4字节  
   m_Name         BYTE     30    DUP(0)                  ;大小为30字节的字符串数组,即将BYTE重复30次的意思,初始化为0  
   m_Score        DWORD    0                             ;整型变量,初始化为0,因为是DWORD型,即4个字节  
   m_Interests    BYTE     "No",0                        ;初始化为 "No\0",N是1个字节,o是1个字节,0是1个字节,共3个字节。如果后面改变它的值,又不止3个字节,则为溢出。一样可以读取,但却成了bug
Aligned_student ends

hData01    Aligned_student          <>                   ;定义1个结构,按其默认值初始化
hData02    Aligned_student    2 dup(<>)                  ;定义2个结构,按其默认值初始化
hData03    Aligned_student          <20,"你好",138>      ;定义1个自已初始化的Aligned_student结构,第4个成员已经初始化,不可再初始化。可以在后面改变它。
.data? 
hInstance HINSTANCE             ? 

.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义

ICO_MAIN   equ 1000    ;图标 
IDB        equ 10      ;按钮控件标识符
IDB01      equ 11 
IDB02      equ 12  
IDB03      equ 13  
IDB04      equ 14
IDB05      equ 15  
IDB06      equ 16  
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 @szBuffer[256]:byte 
       
       .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              
                        invoke  wsprintf,addr @szBuffer,addr szFormat,sizeof Aligned_student      ;Aligned_student结构,里面4个成员,分别是4字节、30字节、4字节、3字节,加起来就是41字节,下面将显示41
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCaption,MB_OK 
                .elseif ax == IDB02 
                        invoke  wsprintf,addr @szBuffer,addr szFormat,sizeof hData02              ;hData02是2个Aligned_student结构组成的数组,每个结构41字节,所以2个应该是82字节,下面将显示82
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCaption,MB_OK
                .elseif ax == IDB03                                                               ;显示结构的第2个成员 
                        invoke  MessageBox,NULL,addr hData03.m_Name,addr szCaption,MB_OK                     
                .elseif ax == IDB04
                        invoke  lstrcpy,addr hData03.m_Interests,addr szYES                       ;改变hData03里面结构中第4个成员的值。
                        invoke  MessageBox,NULL,addr hData03.m_Interests,addr szCaption,MB_OK 
                .elseif ax == IDB05 
                        mov ebx,offset hData03                                                    ;把定义的第3个结构的地址给ebx,即ebx成为指向hData03结构的指针值
                        assume  ebx:ptr Aligned_student                                           ;用assume指令让ebx指向Aligned_student结构
                        invoke  MessageBox,NULL,addr [ebx].m_Interests,addr szCaption,MB_OK       ;得到hData03结构的第4个成员
                        assume  ebx:nothing 
                .elseif ax == IDB06         
                        mov ebx,offset hData03  
                        mov eax,[ebx+Aligned_student.m_Score]                                     ;通过偏移量得到第3个成员的值
                        invoke  wsprintf,addr @szBuffer,addr szFormat,eax 
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCaption,MB_OK                         
                .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       11         
#define    IDB02       12
#define    IDB03       13
#define    IDB04       14
#define    IDB05       15
#define    IDB06       16
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    ICON        "Main.ico"

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//定义对话框
MyDialog DIALOG 10, 10, 140, 140 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 
CAPTION "对话框程序模版"
FONT 11, "宋体"
BEGIN
     PUSHBUTTON      "查看结构有多少字节", IDB01,  10,10,120,14 
     PUSHBUTTON      "查看2个结构有多少字节", IDB02,  10,30,120,14 
     PUSHBUTTON      "显示结构的第2个成员", IDB03,  10,50,120,14 
     PUSHBUTTON      "改变结构中第4个成员的值", IDB04,  10,70,120,14 
     PUSHBUTTON      "得到结构中第4个成员的值", IDB05,  10,90,120,14 
     PUSHBUTTON      "通过偏移量得到第3个成员的值", IDB06,  10,110,120,14 
END 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com