2016-12-30 83 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並將代碼添加到code1?

回答

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 

現在進入第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來驗證我的語法(或者甚至是爲了調試我的代碼),所以它可能需要一些補丁才能編譯,甚至有些錯誤可能會漏掉......但是我希望你能明白並解決它。