2009-09-10 56 views
4

我有以下一段代碼,它應該在斷點處顯示123在eax和321在ecx。出於某種原因,沒有發生。任何人都在意解釋爲什麼?這段簡單的代碼有什麼問題?

push ebp; 
    mov ebp, esp; 
    sub esp, 8; 
    mov [ebp-4], 123; 
    mov [ebp-8], 321; 
    mov eax, [ebp-4]; 
    mov ecx, [ebp-8]; 
    pop ebp; <------------- breakpoint here 
    retn; 

我猜一定是錯的,我不能做

mov [ebp-4], 123 

其他一切對我來說都很好。

由於

編輯:這些值是: EAX 1505915; ecx 1720129;

+0

你在eax和ecx中看到了什麼值? – Michael 2009-09-10 22:58:25

+0

大(隨機?)值。 – 2009-09-10 22:58:48

+0

eax \t 1505915; ecx 1720129 – 2009-09-10 22:59:36

回答

8

您正在將字節值存儲到內存中。

更改爲

mov dword ptr [ebp - 4], 123 
mov dword ptr [ebp - 8], 321 

EAX = 1505915是0x16FA7B。最後一個字節是十六進制的7B,十進制是123。 ecx = 1720129是0x1A3F41。十六進制中的41是321(141)的最後一個字節。

+0

邁克爾第999次節省了一天的時間。謝謝! – 2009-09-10 23:09:42

+0

很好的回答:) – 2009-09-10 23:11:01

+0

另一個問題。如果我想要做inc [ebp-4],我必須做inc dword ptr [ebp-4]嗎?我想說,如果這個數字很小,那並不重要,但如果這個數字變大,那麼它可能會導致問題。程序集默認的字節大小是多少? – 2009-09-10 23:36:31

1

我的印象(我可能是錯的),你不能將值推入到像這樣的內存地址。你必須通過寄存器:

MOV EAX, 123 
MOV [EBP-4], EAX 

正如我所說,我可能是錯的。但請放手。查看指令集手冊。它會告訴你什麼操作你可以做什麼尋址模式。

+0

這個答案是失敗的:) – 2009-09-10 23:11:52

+1

它是x86-幾乎所有東西都是,將立即數直接存儲到內存中(現代x86 CPU具有加載/存儲體系結構和微代碼,類似於實際執行的內容) – Michael 2009-09-10 23:15:18

+0

感謝Michael 。我需要回到ASM。有時間打破使用說明書。我讚賞反饋:) – 2009-09-10 23:31:06