【问题标题】:Initializing a struct in yasm x86 assembly在 yasm x86 程序集中初始化结构
【发布时间】:2016-12-29 12:57:47
【问题描述】:

我正在尝试初始化一个 WIN32_FIND_DATA 结构,在该结构中存储有关使用 FindFirstFile 和 FindNextFile 窗口函数找到的文件的信息。问题是我不知道如何在 yasm 中初始化一个结构。 这是我的代码:

    struc FILETIME
.dwLowDateTime resd 1
.dwHighDateTime resd 1
endstruc

struc WIN32_FIND_DATA
.dwFileAttributes   resd 1
.ftCreationTime     resb FILETIME_size
.ftLastAccessTime   resb FILETIME_size
.ftLastWriteTime    resb FILETIME_size
.nFileSizeHigh      resd 1
.nFileSizeLow       resd 1
.dwReserved0        resd 1
.dwReserved1        resd 1
.cFileName          resb 260
.cAlternateFileName resb 14
endstruc

[bits 32]

section .text 

extern _exit

global  _main 

_main: 

        push    0
        call    _exit
        ret 

section .data

dataWin32: 
    istruc WIN32_FIND_DATA 
        at a, dd     0
        at b, db     0
        at c, db     0
        at d, db     0
        at e, dd     0
        at f, dd     0
        at g, dd     0
        at h, dd     0
        at i, db     0
        a
    iend

我得到的错误是:

testStruct.asm:38: error: undefined symbol `b' (first use)
testStruct.asm:38: error:  (Each undefined symbol is reported only once.)
testStruct.asm:39: error: undefined symbol `c' (first use)
testStruct.asm:40: error: undefined symbol `d' (first use)
testStruct.asm:41: error: undefined symbol `e' (first use)
testStruct.asm:42: error: undefined symbol `f' (first use)
testStruct.asm:43: error: undefined symbol `g' (first use)
testStruct.asm:44: error: undefined symbol `h' (first use)
testStruct.asm:45: error: undefined symbol `i' (first use)

【问题讨论】:

  • 你期望a,b等会做什么?结构中没有该名称的字段!
  • 你的意思是我应该有而不是'a','.dwFileAttributes'?
  • @WeeBey:汇编器猜不出你想要什么。您必须使用正确的标识符。而且您必须完全限定它们:WIN32_FIND_DATA.dwFileAttributes 等。

标签: windows assembly struct x86 yasm


【解决方案1】:
dataWin32: 
istruc  WIN32_FIND_DATA 
at WIN32_FIND_DATA.dwFileAttributes,dd 0
at WIN32_FIND_DATA.ftCreationTime,db 0
at WIN32_FIND_DATA.ftLastAccessTime, db 0
at WIN32_FIND_DATA.ftLastWriteTime, db 0
at WIN32_FIND_DATA.nFileSizeHigh, dd 0
at WIN32_FIND_DATA.nFileSizeLow, dd 0
at WIN32_FIND_DATA.dwReserved0, dd 0
at WIN32_FIND_DATA.dwReserved1, dd 0
at WIN32_FIND_DATA.cFileName, db 0
at WIN32_FIND_DATA.cAlternateFileName,db 0
iend

你必须指定结构名称,否则汇编器无法知道你指的是哪些字段。

【讨论】:

  • 谢谢,这就是我要找的!
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 2016-03-20
  • 2023-03-08
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多