fscanf的參數是FILE* file, const char* format_string, ...
其中「...」基本上是格式字符串中特定類型說明符的特定變量的指針。
結構不分配任何內存,只定義數據的抽象「結構」。
所以,你應該已經展示了你的結構所在的位置(當一些ASM程序員沒有在代碼之前處理數據時,我特別不喜歡它,因爲數據在Assembly中更重要,但是你展示了更多的代碼比你的數據...這很可能會讓你隨着時間的推移而出現問題,當你在精神上將你的數據視爲一等公民,並且只將代碼作爲旁邊的代碼時,會更容易避免),考慮「words 「用法,你可能會有幾個人,讓我們說了簡單的固定陣列,在.DATA節:
tenLists List 10 DUP (<>)
; and formatting string to read data like "oneWord 123"
list_scanf_format DB "%19s %hhu",0
現在進入第n個表中,可以例如該做的(這WIL我讀出了從固定陣列5列表):
mov eax,4 ; "input" index of 5th list in array
; calculate addresses of struct/fields when index is known
imul eax,SIZEOF List ; eax = offset of 5th struct in array
add eax,OFFSET tenLists ; eax = absolute address of tenLists[4]
lea ebx,(List PTR [eax]).code1
push ebx ; pointer to tenLists[4].code1
lea ebx,(List PTR [eax]).word_string
push ebx ; pointer to tenLists[4].word_string
push OFFSET list_scanf_format
push pointer_file1
call fscanf
如果你這樣做,例如在某些類型的循環,就像讀十年的名單,然後你可以這樣做:
mov ebx,OFFSET tenLists ; absolute address of tenLists[0]
mov ecx,10
readLoop:
push ecx ; preserve ecx from fscanf
lea eax,(List PTR [ebx]).code1
push eax ; pointer to tenLists[i].code1
lea eax,(List PTR [ebx]).word_string
push eax ; pointer to tenLists[i].word_string
push OFFSET list_scanf_format
push pointer_file1
call fscanf ; does preserve ebx, if IIRC ABI correctly
add esp,16 ; remove arguments from stack
pop ecx ; restore loop counter
; validate fscanf did match 2 items
cmp eax,2
jne inputDataNotFormattedWellOrEOF
; advance to next array element and loop
add ebx,SIZEOF List ; advance to next tenLists[i]
dec ecx
jnz readLoop
我不沒有MASM來驗證我的語法(或者甚至是爲了調試我的代碼),所以它可能需要一些補丁才能編譯,甚至有些錯誤可能會漏掉......但是我希望你能明白並解決它。