2016-11-07 56 views
3

組裝下面使用NASM的結構中,我得到以下錯誤:NASM中TIMES前綴的count參數的最大大小是多少?

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

即,值0x104被解釋爲一個負數。

NASM中前綴TIMES的count參數的最大大小是多少?我將如何僅使用「小」計數初始化結構?

_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版本02年12月2日@視窗10

回答

4

你可以找到NASM來源here

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 

[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'相對於結構開始的偏移量,第二個計算相對於結構實例開始的當前位置。不同之處在於要達到「字」字段的字節數。 –

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

您指定爲TIMES的計數參數的十六進制值0x104具有十進制表示形式260,我們可以看到32-260 = -228。

我不能說爲什麼NA​​SM將0x104解釋爲-228(上面的計算除外),但它可能與繼續到結構的下一個字段有關。

但是,將MAX_PATH的定義更改爲260(在WIN32N.inc中),結構組裝得很好。

+0

感謝您的一個很好的答案。 – Shuzheng

相關問題