gpt4 book ai didi

assembly - NASM 中 TIMES 前缀的计数参数的最大大小?

转载 作者:行者123 更新时间:2023-12-01 11:22:37 25 4
gpt4 key购买 nike

使用 NASM 组装下面的结构,我得到以下错误:

test.asm:65: error: TIMES value -228 is negative

即值 0x104 被解释为负数。

NASM 中 TIMES 前缀的计数参数的最大大小是多少?我如何仅使用“小”计数来初始化结构?

_stWin32FindData:
istruc WIN32_FIND_DATA
at WIN32_FIND_DATA.dwFileAttributes, dd 0x00
at WIN32_FIND_DATA.ftCreationTime, times 0x08 db 0x00
at WIN32_FIND_DATA.ftLastAccessTime, times 0x08 db 0x00
at WIN32_FIND_DATA.ftLastWriteTime, times 0x08 db 0x00
at WIN32_FIND_DATA.nFileSizeHigh, dd 0x00
at WIN32_FIND_DATA.nFileSizeLow, dd 0x00
at WIN32_FIND_DATA.dwReserved0, dd 0x00
at WIN32_FIND_DATA.dwReserved1, dd 0x00
at WIN32_FIND_DATA.cFileName, times 0x104 db 0x00
at WIN32_FIND_DATA.cAlternate, times 0x0e db 0x00
iend

我使用 NASM 版本 2.12.02 @ Windows 10。

最佳答案

您可以找到 NASM 源 here .

“TIMES”的 Grepping 在 parser.c 上找到这些行:

result->times = value->value;
if (value->value < 0 && pass0 == 2) {
nasm_error(ERR_NONFATAL, "TIMES value %"PRId64" is negative",
value->value);
result->times = 0;
}

这表明 TIMES 采用 64 位值,但是查看 nasm.h 我们发现

typedef struct insn { /* an instruction itself */
char *label; /* the label defined, or NULL */

...

int32_t times; /* repeat count (TIMES prefix) */
bool forw_ref; /* is there a forward reference? */

...
} insn;

将参数的大小设置为 32 位。


然而,您面临的问题来自于 AT 是一个隐式使用 TIMES 来移动指定字段的宏。

The function of the AT macro is to make use of the TIMES prefix to advance the assembly position to the correct point for the specified structure field, and then to declare the specified data. Therefore the structure fields must be declared in the same order as they were specified in the structure definition.

AT是这样实现的

istruc teststruc2
at .word, db 5
iend

..@12.strucstart:
times (.word-teststruc2)-($-..@12.strucstart) db 0
db 5

正如@Nze 所说,WIN32_FIND_DATA.cFileName 被定义为 TCHAR cFileName[MAX_PATH]MAX_PATH 是 32。
由于您定义的 cFileName 太大,AT WIN32_FIND_DATA.cAlternate($-..@12.strucstart) 大于其偏移量在结构 (.word-teststruc2).
因此错误。

关于assembly - NASM 中 TIMES 前缀的计数参数的最大大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40473111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com