2010-10-03 36 views
0

Je suis coincé écrire mon programme Voici ce que je voulais faire:MASM comparer les tampons non initialisées

    affichage
  1. un message de bienvenue dans une console
  2. Attendez que l'utilisateur imput un nombre de 0 à 9]
  3. comparer ce nombre à 0
  4. affichage d'un message si elle est, sortie autre

Voici ce que je actuellement ont:

.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 

Le programme rassemble & liens parfaitement sans avertissements ou des erreurs Mais cmp renvoie toujours 1, si j'imprime la valeur des données (avec StdOut), il me montre la valeur exacte que j'ai mis. Alors pourquoi ça ne marche pas?

Merci à l'avance

+0

Qu'est-ce que StdIn et StdOut? Sont-ils des macros ou des fonctions de la distribution MASM? Je n'ai pas de distribution MASM moderne à portée de main. – atzz

+0

Je suggère d'utiliser NASM, il a une sintax plus claire. – ruslik

Répondre

2

Essayez ceci:

cmp al, '0' 

-ou-

cmp al, 48 

Pourquoi? Parce que le caractère '0' vous intéresse, pas le 0 numérique. Le caractère '0' est codé 48 dans la plupart des encodages.

+0

Merci !!, qui a travaillé # résolu # – Rick

+0

@Rick N'oubliez pas d'accepter la réponse. –

+0

@Jens Bjornhager, Fait – Rick

1

Vous êtes probablement le déplacement de la adresse de données à al en quelque sorte. Essayez mov al, [data] pour obtenir la valeur stockée à données.

+0

Non, dans MASM, la notation d'origine est correcte. – atzz

+0

Votre solution n'a pas d'effet, mon programme ne prend toujours pas le saut j'ai couru aussi bien ollydbg (un débogueur) je vois cette ligne, en quelque sorte la valeur stockée dans al est 01 au lieu de 00 0040101B |. A0 30304000 MOV AL, BYTE PTR DS: [403030] ps: Je suis désolé pour le format horrible de mes messages, je ne suis pas habitué à la façon dont stackoverflow enveloppe son texte – Rick