Параметры для 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
Теперь для доступа к п-й список вы можете сделать, например, этого (это Виль л чтения 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
Я не» t иметь MASM для проверки моего синтаксиса (или даже для отладки моего кода), поэтому для его компиляции может потребоваться некоторое исправление, и, возможно, даже ошибка попала в ... Но я надеюсь, что вы получите эту идею и разработаете ее.