2016-12-30 2 views
-3

Если мне нужно запомнить несколько слов и код, выделенный для каждого из этих слов, можно ли разместить их в структуре?Сборка X86 добавить к структуре

List struct 
word_string db 20 dup(0) 
code1 db 0 
List ends 

     ... 

push offset wd1  ---reading the first word 
push offset format 
push pointer_file1 
call fscanf 

push offset code  ---reading the first code 
push offset format 
push pointer_file1 
call fscanf 

Какой синтаксис позволяет мне добавить wd1 в word_string и код в код1?

ответ

0

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

Смежные вопросы