MASM сравнивает неинициализированные буферы - PullRequest
0 голосов
/ 03 октября 2010

Я застрял при написании своей программы Вот что я хотел, чтобы она сделала:

  1. отображение приветственного сообщения в консоли
  2. Подождите, пока пользователь введет число от 09]
  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), оно показывает точное введенное мной значение. Так почему бы и нет?работает?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 03 октября 2010

Попробуйте это:

cmp al, '0'

-или-

cmp al, 48

Почему? Поскольку вас интересует символ «0», а не цифра 0. Символ «0» в большинстве кодировок кодируется как 48.

1 голос
/ 03 октября 2010

Возможно, вы как-то перемещаете адрес из данных в al.Попробуйте mov al, [data], чтобы получить значение, хранящееся в data .

...