鱼C论坛

 找回密码
 立即注册
查看: 6181|回复: 6

[技术交流] 高级语法 结构体 的使用

[复制链接]
发表于 2013-7-4 23:39:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
说明:汇编语言中的结构体和公用体与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 文件中有定义
;  x  WORD   ?
;  y  WORD   ?
;COORD ENDS

 buffer db        100 dup(0)
 szFmt  db        '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[edi]).x, ax
         mov (COORD ptr[edi]).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[edi]).x
         add bx,(COORD ptr[edi]).y
         add edi,type COORD        ;指向下一个结构体
         loop short @B
         
         invoke  wsprintf,        ;格式化信息串
                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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-5 00:45:10 | 显示全部楼层
无回帖,不论坛,这才是人道。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-24 19:29:53 | 显示全部楼层
楼主加油,鱼C加油!我们都看好你哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-18 09:47:40 | 显示全部楼层
楼主加油,鱼C加油!我们都看好你哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-3-31 14:34:33 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 12:18:45 | 显示全部楼层
这是基础知识??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-9 20:23:29 From FishC Mobile | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 08:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表