MASM32连接程序时error A2006: undefined symbol : u

这篇具有很好参考价值的文章主要介绍了MASM32连接程序时error A2006: undefined symbol : u。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为了检测Windows操作系统是32位还是64位的,用MASM32编写了一个调用Windows API函数GetNativeSystemInfo的程序(完整代码附后),GetNativeSystemInfo函数会将指向SYSTEM_INFO结构体的地址存到GetNativeSystemInfo传递的参数中。

微软官网中的STEM_INFO定义为:

typedef struct _SYSTEM_INFO {
  union {
    DWORD dwOemId;
    struct {
      WORD wProcessorArchitecture;
      WORD wReserved;
    } DUMMYSTRUCTNAME;
  } DUMMYUNIONNAME;
  DWORD     dwPageSize;
  LPVOID    lpMinimumApplicationAddress;
  LPVOID    lpMaximumApplicationAddress;
  DWORD_PTR dwActiveProcessorMask;
  DWORD     dwNumberOfProcessors;
  DWORD     dwProcessorType;
  DWORD     dwAllocationGranularity;
  WORD      wProcessorLevel;
  WORD      wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;

SYSTEM_INFO中的wProcessorArchitecture存储了已安装操作系统的处理器体系结构。


访问代码为:               

                 mov  eax, g_lpSI
                 mov  ax,  (SYSTEM_INFO ptr [eax]).DUMMYUNIONNAME.DUMMYSTRUCTNAME.wProcessorArchitecture
                 and  eax, 0ffffh
                 .if (eax==PROCESSOR_ARCHITECTURE_AMD64) || (eax==PROCESSOR_ARCHITECTURE_IA64) || (eax==PROCESSOR_ARCHITECTURE_ARM64)
                     mov eax, OFFSET g_sz64Bit
                 .else
                     mov eax, OFFSET g_sz32Bit
                 .endif

需要注意的两点,一是wProcessorArchitecture是word型数据,只有16位。二是MASM32中没有定义PROCESSOR_ARCHITECTURE_ARM64,在微软网官上其值为12。

PROCESSOR_ARCHITECTURE_ARM64   equ 12     ;ARM64

但是在连接程序时总是提示 32or64.asm(54) : error A2006: undefined symbol : u

masm中出现a2006错误,MASM32,源码解析,原创作品,windows,microsoft,MASM32,error A2006,未定义字符
第54行代码就是
 

mov  ax,  (SYSTEM_INFO ptr [eax]).DUMMYUNIONNAME.DUMMYSTRUCTNAME.wProcessorArchitecture

里面并没有使用符号u。

MASM32中的SYSTEM_INFO结构定义存在windows.inc中,居然跟微软官网上的不同:

SYSTEM_INFO STRUCT
  wProcessorArchitecture        WORD       ?
  wReserved                     WORD       ?
  dwPageSize                    DWORD      ?
  lpMinimumApplicationAddress   DWORD      ?
  lpMaximumApplicationAddress   DWORD      ?
  dwActiveProcessorMask         DWORD      ?
  dwNumberOfProcessors          DWORD      ?
  dwProcessorType               DWORD      ?
  dwAllocationGranularity       DWORD      ?
  wProcessorLevel               WORD       ?
  wProcessorRevision            WORD       ?
SYSTEM_INFO ENDS

MASM32中的SYSTEM_INFO结构定义代码中省略了微软官网其中的DUMMYUNIONNAME联合体和DUMMYSTRUCTNAME结构体,难怪使用.DUMMYUNIONNAME.DUMMYSTRUCTNAME.wProcessorArchitecture来访问在连接时会出错,奇怪的是出错信息里没有提示DUMMYUNIONNAME.DUMMYSTRUCTNAME未定义,而是莫明奇妙的u


将第54行代码改为

mov  ax,  (SYSTEM_INFO ptr [eax]).wProcessorArchitecture

后顺利完成连接,生成了EXE文件,但是更大的麻烦来了……

附完整·代码:文章来源地址https://www.toymoban.com/news/detail-726620.html

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 32or64.asm
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

;sssssssssssssssssssssssssssssssssssssss
;.const
;sssssssssssssssssssssssssssssssssssssss
;PROCESSOR_ARCHITECTURE_INTEL   equ 0      ;x86
;PROCESSOR_ARCHITECTURE_ARM     equ 5      ;ARM
;PROCESSOR_ARCHITECTURE_IA64    equ 6      ;基于 Intel Itanium 的
;PROCESSOR_ARCHITECTURE_AMD64   equ 9      ;x64 (AMD 或 Intel)
PROCESSOR_ARCHITECTURE_ARM64   equ 12     ;ARM64
;PROCESSOR_ARCHITECTURE_UNKNOWN equ 0ffffh ;未知体系结构。


_SYSTEM_INFO STRUCT
   UNION
     dwOemId DWORD ?
     STRUCT
        wProcessorArchitecture        WORD       ?
        wReserved                     WORD       ?
     ENDS
  ENDS
  dwPageSize                    DWORD      ?
  lpMinimumApplicationAddress   DWORD      ?
  lpMaximumApplicationAddress   DWORD      ?
  dwActiveProcessorMask         DWORD      ?
  dwNumberOfProcessors          DWORD      ?
  dwProcessorType               DWORD      ?
  dwAllocationGranularity       DWORD      ?
  wProcessorLevel               WORD       ?
  wProcessorRevision            WORD       ?
_SYSTEM_INFO ENDS

;sssssssssssssssssssssssssssssssssssssss
.data
;sssssssssssssssssssssssssssssssssssssss
g_szCaption               db    "Windows",0
g_sz32Bit                 db    "32位",0
g_sz64Bit                 db    "64位",0
g_szGetNativeSystemInfo   db    "GetNativeSystemInfo", 0
g_szkernel32Dll           db    "kernel32.dll", 0
g_szFailGetModuleHandle   db    "GetModuleHandle失败", 0
g_szFailGetProcAddress    db    "GetProcAddress失败", 0
g_lpfnGetNativeSystemInfo dword ?
g_lpSI                    dword ?  ; SYSTEM_INFO


;sssssssssssssssssssssssssssssssssssssss
.code
;sssssssssssssssssssssssssssssssssssssss
start:
      invoke GetModuleHandle, OFFSET g_szkernel32Dll
      .if    eax==NULL
             mov eax, OFFSET g_szFailGetModuleHandle
      .else
             invoke GetProcAddress, eax, OFFSET g_szGetNativeSystemInfo
             .IF eax==NULL
                 mov eax, OFFSET g_szFailGetProcAddress
             .ELSE
                 mov  g_lpfnGetNativeSystemInfo, eax
                 push OFFSET g_lpSI
                 call g_lpfnGetNativeSystemInfo
                 mov  eax, g_lpSI
                 mov  ax, (SYSTEM_INFO ptr [eax]).wProcessorArchitecture
                 and  eax, 0ffffh 
                 ;mov  eax, (_SYSTEM_INFO ptr [eax]).dwOemId
                 .if (eax==PROCESSOR_ARCHITECTURE_IA64) || (eax==PROCESSOR_ARCHITECTURE_AMD64) || (eax==PROCESSOR_ARCHITECTURE_ARM64)
                     mov eax, OFFSET g_sz64Bit
                 .else
                     mov eax, OFFSET g_sz32Bit
                 .endif
             .ENDIF
      .endif
      invoke MessageBox, NULL, eax, OFFSET g_szCaption, MB_OK
      invoke ExitProcess, NULL
end start

到了这里,关于MASM32连接程序时error A2006: undefined symbol : u的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】symbol lookup error: undefined symbol + nm指令定位错误

    一、undefined symbol错误 今天在运行模块执行文件时,出现了如下报错 \\\"symbol lookup error\\\"、\\\"undefined symbol\\\",提示 cos_getfile_mcd 可执行文件在加载 .so 文件时,出现了无法找到符号的错误,并给出了具体错误:_ZN20CCosGetfileTimerInfoC2Ev 符号未定义。 那么如何定位该错误呢?一般可以先

    2024年02月08日
    浏览(28)
  • MDK编译报错Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.0)

    .ObjectsSTM32_MD.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o). Not enough information to list image symbols. Not enough information to list load addresses in the image map. Finished: 2 information, 0 warning and 1 error messages. “.ObjectsSTM32_MD.axf” - 1 Error(s), 0 Warning(s). Target not created.

    2024年02月16日
    浏览(24)
  • Android Studio里的C/C++返回: ld: error: undefined symbol

    Android Studio里的C/C++进行编译时返回: ld: error: undefined symbol 的错误,进行了解决。 编译环境突然出现了这个问题,尝试解决,终于找到一个解决办法:卸载 ndkVersion = \\\"23.1.7779620\\\" ,再进行重新安装 。 I removed both NDK versions from Android Studio - Tools - SDK Manager - SDK Tools, reinstalled them

    2024年02月03日
    浏览(36)
  • 安装openssl报错:openssl: symbol lookup error: openssl: undefined symbol: EVP_mdc2, version OPENSSL_1_1_0

    首先,安装网上教程对openssl进行了安装 如果Linux系统没网,可现在windows上下载压缩文件,再传到Linux系统 直接在浏览器输入 https://www.openssl.org/source/openssl-1.1.1t.tar.gz 就可以下载下来 然后进行安装 安装完成后执行 验证是否安装成功,结果报错。 网上找了一大推,什么文件复

    2024年01月23日
    浏览(31)
  • Keil5报错:Error: L6218E: Undefined symbol Image$$ARM_LIB_STACK$$ZI$$Limit

    Keil5在创建STM32工程文件后编译报错: Error: L6218E: Undefined symbol Image$$ARM_LIB_STACK$$ZI$$Limit (referred from startup_armcm4.o). 此处考虑到是链接问题,首先点击“魔术棒” → 在“Target”标签下 → 勾选“Use MicroLIB” → 点击”OK“,重新编译。 此时工程报错: Error: L6218E: Undefined symbol __

    2024年04月22日
    浏览(34)
  • Keil 5下出现Error: L6218E: Undefined symbol Delay(unsigned) (referred from main.o).的解决方法

            今天在给stm32f407vgt6点灯时,想实现循环闪烁,于是想从以前的工程中移植一个delay延时函数,移植后编译时发现出现错误: Error: L6218E: Undefined symbol Delay(unsigned) (referred from main.o).的解决方法         在确定了头文件Include路径的包含和.c文件的添加后,想起之前

    2024年02月12日
    浏览(36)
  • HAL库 编译错误:XXX.axf: Error: L6218E: Undefined symbol xxx (referred from xxxx.o)的可能原因之一及解决方法

    我在学习STM32 HAL库版本时遇到了这种编译问题  由于是刚开始学习STM32代码跟例程是一样的,所以代码不可能出错。我去网上寻找答案看到了 (7条消息) (已解决)STM32报错Error: L6218E: Undefined symbol assert_param (referred from misc.o)._老龙QAQ的博客-CSDN博客 于是按照他的方法试验了一下

    2024年02月11日
    浏览(40)
  • 如何用MASM32开发Windows应用程序

    提醒:以下内容仅做参考,可自行发散。在发布作品前,请把不需要的内容删掉。 IT技术日异月异,无论是初学者还是有经验的专业人士,都需要与时俱进,不断学习新技术。在学习一门新的IT技术时,都需要采取一种系统性的学习方法。作为一名技术er,当我想用MASM32开发

    2024年02月08日
    浏览(34)
  • Visual Studio+MASM32写汇编程序——安装和环境配置说明

    写在前面: 如果你之前使用的是Visual Studio 2022(其他版本不清楚,如果是2017版本应该也是行的,如果有uu成功,也可以分享自己的经验),那么建议你立即卸载重新安装(血泪教训,网上能找到的教程基本上都不能解决问题)。 2022版本可能会出现的问题: MSB3721 命令“ml6

    2024年01月18日
    浏览(26)
  • Undefined symbols for architecture arm64

    解决问题之前,先了解清晰涉及到的知识点: iOS支持的指令集包含:armv6、armv7、armv7s、arm64,在项目TARGETS----Build Settings---Architecturs 可以修改对应的指令集,目前Standard Architectures(arm64, armv7)  XCode中可设置: 1、Architectures将制定项目将支持哪些指令集 2、Build Active Architecture

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包