2017-01-22 140 views
-1

我是新來的組裝和我決定實現一些簡單的功能使用內聯彙編圖表,我開始與這是應該的鄰接矩陣的所有元素初始化爲0的構造,但我不明白我做錯了什麼問題與內聯彙編在Visual Studio C++

struct graph { 
int el[MAX_V][MAX_V]; 
int noVert; 
int noEdges; 
bool directed; 

graph() { 
    _asm { 

    mov  ebx, 0 
    mov  esi, MAX_V 
    mov  edi, this 
START_L1: 
    cmp  ebx, MAX_V 
    je  END_L1 

    mov  ecx, 0 
    START_L2: 
    cmp  ecx, MAX_V 
    je  END_L2 

    mov  eax, ebx 
    imul esi 
    add  eax, ecx 
    mov  [edi + eax*4], dword ptr 0 

    inc  ecx 
    jmp  START_L2; 
    END_L2: 

    inc  ebx 
    jmp  START_L1 
END_L1: 

    } 
} 
} 

當我使用調試器我發現,執行該指令後,我更新了el陣列的INT元素包含非零值:

mov  [edi + eax*4], dword ptr 0 

爲什麼我getti放置在el陣列在該指令之後納克非零int值?我期待我正在更新的索引處的整數設置爲零。

+2

因此,[它不工作(http://meta.stackexchange.com/q/147616/333362)? – wally

+0

這是行不通的,在調試它取代了內存的某些部分與一些隨機變量,這就是它 –

+2

什麼是它應該做的?請張貼足夠的信息來複制問題。東西我可以複製並粘貼到Visual Studio,編譯和與你所期望的細節你有什麼調試將使這個問題比較容易回答。 – wally

回答

3

當使用微軟的Intel語法與dword ptr預選賽應指定的內存操作數的大小,而不是直接的價值。

這條線是一個問題:

mov  [edi + eax*4], dword ptr 0 

雖然你對眼前的價值0指定dword ptr微軟編譯器/彙編器會意識到0可以容納一個字節,並會發出指令爲:

mov  byte ptr [edi+eax*4], 0 

你真正想要做的是告訴編譯器/彙編程序,在內存操作數項的大小是32位的DWORD。要做到這一點修改指令是:

mov  dword ptr [edi + eax*4], 0 

的原因,你的代碼似乎有垃圾數組中,因爲只有每個數組元素的最低顯著字節被設置爲0


除非這是一個任務是要你這樣的代碼,你真的應該使用C++代碼零出數組。它也將使這個代碼更易於維護和閱讀。如果使用合理的優化級別,編譯器應該能夠生成高效的代碼來進行調零。