2010-10-03 83 views
0

我堅持寫我的程序 這裏就是我想要它做的事:MASM比較未初始化的緩衝區

  1. 顯示歡迎信息控制檯內
  2. 等待用戶從0開關輸入一個數字9]
  3. 比較,這個數字爲0
  4. 顯示,如果它是一個消息,否則退出

這裏是我目前什麼有:

.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 
include \masm32\include\user32.inc 
includelib \masm32\lib\user32.lib 
include \masm32\include\masm32.inc 
includelib \masm32\lib\masm32.lib 

.data 
capt db "SCHiM says: ",0 
txt  db "Enter a number 0-9:",0 

.data? 

data db ? 

.code 

start: 


call AllocConsole 

push offset txt 
call StdOut 

push 1 
push offset data 
call StdIn 

mov al, data 

cmp al, 0h 
jz eqzero 

invoke ExitProcess, NULL 

eqzero: 

push offset capt 
call StdOut 
push offset data 
call StdOut 

endloop: 
jmp endloop 

invoke ExitProcess, NULL 
end start 

程序完全組裝&鏈接沒有任何警告或錯誤 但CMP始終返回1,如果我打印數據的值(與STDOUT)它顯示了我,我已經把準確的數值。那爲什麼它不工作?

在此先感謝

+0

什麼是StdIn和StdOut?它們是來自MASM發行版的宏還是函數?我沒有任何現代的MASM分配方便檢查。 – atzz 2010-10-03 13:53:13

+0

我會建議使用NASM,它有一個更清晰的sintax。 – ruslik 2010-10-03 13:54:33

回答

2

試試這個:

cmp al, '0' 

- 或 -

cmp al, 48 

爲什麼?因爲你對字符'0'感興趣,而不是數字0.字符'0'在大多數編碼中被編碼爲48。

+0

謝謝!!,工作#solved # – Rick 2010-10-03 13:52:18

+0

@瑞克不要忘記接受答案。 – 2010-10-03 13:56:49

+0

@Jens Bjornhager,完成 – Rick 2010-10-03 14:00:27

1

的數據可能移動地址不知何故人。嘗試使用 mov al, [data] 以獲得存儲在數據處的值。

+0

不,在MASM中原始符號是正確的。 – atzz 2010-10-03 13:45:31

+0

您的解決方案沒有效果,我的程序仍不能採取跳躍 我也運行它雖然OllyDbg的(調試) 我看到這條線,莫名其妙地存儲在人的價值是01而不是00 0040101B |。 A0 30304000 MOV AL,BYTE PTR DS:[403030] ps:我很抱歉我的帖子的可怕格式,我不習慣的方式stackoverflow包裝它的文本 – Rick 2010-10-03 13:45:44