You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MASM中ReadFile读取文件后如何解引用缓冲区获取4字节整数值?

解决MASM中读取文件缓冲区4字节整数的问题

你的核心问题是没有正确对缓冲区地址做间接寻址,buffer变量存储的是GlobalLock返回的内存块起始地址,要获取这个地址指向的4字节内容,需要用方括号[]做间接引用。

修正后的关键代码

把你代码中这一行:

mov ebx, DWORD PTR buffer   ; Don't know what to do here

替换成:

mov ebx, DWORD PTR [buffer]  ; 间接寻址,读取buffer指向的内存中的4字节值

为什么原来的代码不对?

  • mov ebx, buffer 或者 mov ebx, DWORD PTR buffer:都是把buffer这个变量本身的值(也就是内存块的起始地址)加载到ebx,所以你打印的是地址,不是文件内容。
  • mov ebx, OFFSET buffer:取的是buffer变量自身在数据段的地址,自然是固定值,和文件内容无关。

额外的验证建议

为了确保读取操作正常,建议在ReadFile后检查返回值和读取字节数:

; 提前在.DATA段定义提示字符串
szReadError DB "读取文件失败或字节数不符", 0
szAppTitle DB "错误提示", 0

; ReadFile之后添加检查逻辑
invoke ReadFile, hFile, buffer, dwFileSize, ADDR dwBytesRead, 0
.IF eax == 0 || dwBytesRead != 4
    invoke MessageBox, 0, ADDR szReadError, ADDR szAppTitle, MB_OK
.ENDIF

字节序注意事项

如果你的文件内容是大端字节序(比如00 00 00 60),直接读取后得到的ebx值会是0x60000000而不是0x00000060,这时候需要手动转换字节序:

mov ebx, DWORD PTR [buffer]
bswap ebx  ; 反转ebx的字节顺序,将大端转小端

如果文件是小端存储(60 00 00 00),则不需要转换,直接读取即可得到正确的0x00000060(十进制96)。


内容的提问来源于stack exchange,提问作者GreatCorn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:00:08