2016-11-07 6 views
3

Сборка структуры ниже с помощью NASM, я получаю следующее сообщение об ошибке:Максимальный размер аргумента count для префикса TIMES в NASM?

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

т.е. значение 0x104 интерпретируется как отрицательное число.

Каков максимальный размер аргумента count для префикса TIMES в NASM, и как бы инициализировать структуру, используя только «маленькие» подсчеты?

_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

ответ

4

Вы можете найти источник NASM here.

оглавлению для "TIMES" находит эти строки 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 

[email protected]: 
    times (.word-teststruc2)-([email protected]) db 0 
    db 5 

Как сказал @Nze, WIN32_FIND_DATA.cFileName определяется как TCHAR cFileName[MAX_PATH] и MAX_PATH равно 32.
Поскольку мы определим cFileName слишком большой, AT WIN32_FIND_DATA.cAlternate имеет ([email protected]) больше его смещения в структуре (.word-teststruc2).
Отсюда ошибка.

+0

Спасибо за подробный ответ. В следующий раз я пойду и посмотрю в источник. Однако я не думал, что это «читаемо» для начинающего. Я не очень понимаю вашу реализацию AT. – Shuzheng

+0

@Shuzheng Вы никогда не знаете, какой код существует за проектом. NASM один довольно читабельный. Реализация 'AT' не моя, это NASM. Я нашел его, используя флаг командной строки '-E', который расширяет макросы, но не обрабатывает файл. Первая скобка вычисляет смещение поля 'word' относительно начала структуры, вторая вычисляет текущую позицию относительно начала экземпляра структуры. Разница заключается в количестве байтов для прохода, чтобы добраться до поля 'word'. –

1

В WIN32N.inc нашел в Интернете, MAX_PATH определяется следующим образом:

... 
DDD_RAW_TARGET_PATH equ 1h 
DDD_REMOVE_DEFINITION equ 2h 
DDD_EXACT_MATCH_ON_REMOVE equ 4h 
MAX_PATH equ 32 
MOVEFILE_REPLACE_EXISTING equ 1h 
MOVEFILE_COPY_ALLOWED equ 2h 
... 

Также WIN32_FIND_DATA.cFileName (часть структуры WIN32_FIND_DATA, найденной в том же файле) определяется как имеющий размер MAX_PATH.

Значение шестнадцатеричного значения 0x104, которое вы указываете как аргумент count для TIMES, имеет десятичное представление 260, и мы видим, что 32 - 260 = -228.

Не могу сказать, почему NASM интерпретирует 0x104 как -228 (за исключением вычислений выше), но, вероятно, имеет какое-то отношение к переходу в следующее поле структуры.

Однако, изменяя определение MAX_PATH на 260 (в WIN32N.inc), структура собирается просто отлично.

+0

Спасибо за отличный ответ. – Shuzheng