小甲鱼 发表于 2013-7-4 23:39:06

高级语法 结构体 的使用

说明:汇编语言中的结构体和公用体与C语言中的基本类似。

汇编语言的结构体定义格式如下:
名字 struct
      成员列表
名字 ends

请仔细阅读以下两个实例,看看如何实现:

实例一:

.386
         .model flat, stdcall
         option casemap :none
include                windows.inc
include                kernel32.inc
includelib             kernel32.lib
include                user32.inc
includelib             user32.lib
include                masm32.inc                  
includelib             masm32.lib
      .data
;COORD STRUCT      ;windows.inc 文件中有定义
;xWORD   ?
;yWORD   ?
;COORD ENDS

buffer db      100 dup(0)
szFmtdb      'stPos.x 的和 = %d, stPos.y 的和 = %d',0   
stPos COORD 10 dup(<0,0>)      ;定义结构体数组
         .code
start:
         mov ecx,10
         mov edi,offset stPos      ;edi指向结构体变量
         mov eax,1
         mov ebx,11
@@:
         mov (COORD ptr).x, ax
         mov (COORD ptr).y, bx
         add edi,type COORD      ;指向下一个结构体
         inc ax
         inc bx
         loop short @B
         
         xor eax,eax
         xor ebx,ebx
         mov ecx,10
         mov edi,offset stPos      ;edi指向结构体变量
@@:
         add ax,(COORD ptr).x
         add bx,(COORD ptr).y
         add edi,type COORD      ;指向下一个结构体
         loop short @B
         
         invokewsprintf,      ;格式化信息串
                addr buffer,      ;信息串格式化后的存放地
                addr szFmt,      ;信息串的格式
                eax,
                ebx
                        
      invoke ClearScreen          ;清屏
      invoke locate,10,10          ;光标定位(x,y)      
      invoke StdOut,addr buffer ;显示串
      invoke ExitProcess,0          ;结束进程
      end start
实例二:

    .386
    .model flat, stdcall
    option casemap:none
   
include      windows.inc
include      kernel32.inc
includelib   kernel32.lib
include      user32.inc
includelib   user32.lib

    .data
sysTime    SYSTEMTIME    <>      ; 定义结构体变量

CapMsg    db    '系统当前时间', 0
szFmt   db    '%d年%2d月%2d日', 0Dh, 0Ah, 0Dh, 0Ah
          db    '%2d:%2d:%2d', 0
buffer    db    80 dup(0)

    .code
start:
    invoke    GetLocalTime, offset sysTime    ; 调用API函数获取系统时间(返回放在sysTime结构体)
    movzx esi, sysTime.wYear
    movzx edi, sysTime.wMonth
    movzx edx, sysTime.wDay
    movzx eax, sysTime.wHour
    movzx ebx, sysTime.wMinute
    movzx ecx, sysTime.wSecond
   
    invoke    wsprintf, addr buffer, addr szFmt, esi, edi, edx, eax, ebx, ecx
    invoke    MessageBox, NULL, offset buffer, offset CapMsg, MB_ICONQUESTION
    invoke    ExitProcess, 0
   
    end start

lsh華 发表于 2013-7-5 00:45:10

无回帖,不论坛,这才是人道。

大娱乐家_╮ 发表于 2013-7-24 19:29:53

楼主加油,鱼C加油!我们都看好你哦!

岁月如歌 发表于 2013-11-18 09:47:40

楼主加油,鱼C加油!我们都看好你哦!

yhg123060 发表于 2015-3-31 14:34:33

真是难得给力的帖子啊。

土豆丝 发表于 2017-12-4 12:18:45

这是基础知识??

18647293236QQ 发表于 2021-1-9 20:23:29

学习了
页: [1]
查看完整版本: 高级语法 结构体 的使用