2012-04-29 24 views
-1

パスワードを入力する場所にパスワードファイルを作成しようとしていますが、すべてのパスワードが表示されます。私の現在のコードは、このですが、それは誤りがあります。x86 assembly-masm32:無効な命令のオペランド

.386 
.model flat,stdcall 
option casemap:none 

include  \masm32\include\windows.inc 
include  \masm32\include\kernel32.inc 
include  \masm32\include\masm32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\masm32.lib 

.data 
     input db 'Enter the password:',13,10,0 
     string db 'The passwords are:',0 
     space db '  ',0 
     pass1 db 'example password 1',0 
     pass2 db 'example password 2',0 
     pass3 db 'example password 3',0 
     pass4 db 'example password 4',0 
     ermsg db 'Incorrect Password. Exiting....',0 
     count dd 0 
      comp dd 13243546 

.data? 
     buffer db 100 dup(?) 
.code 
start: 
_top: 
     invoke StdOut,ADDR input 
     invoke StdIn,ADDR buffer,100 ; receive text input 
     cmp buffer, comp ;sorry for not pointing this out - this is line 32 
     jz _next 
     jmp _error 
_next: 
     invoke StdOut, ADDR string 
     invoke StdOut, ADDR space 
     invoke StdOut, ADDR pass1 
     invoke StdOut, ADDR pass2 
     invoke StdOut, ADDR pass3 
     invoke StdOut, ADDR pass4 
     invoke ExitProcess,0 
_error: 
     invoke StdOut, ADDR ermsg 
     mov eax, 1 
      mov count, eax 
      cmp count, 3 
      jz _exit 
      jmp _top: 
_exit: 
      invoke ExitProcess, 0 

これはエラーです:

test.asm(32) : error a2070: invalid instruction operands 

なぜそれが起こるん。私はエラーが32行目であることを理解していますが、エラーの内容を理解できません。

+0

'cmp buffer、comp' - ここで何をしようとしていますか? – DCoder

+0

@Soohjun - 私は行32を表示するために投稿を編集しました – Progrmr

+0

@DCoder - 私はバッファを13243546(これはプログラムに格納されている他のパスワードを表示するのに必要なパスワードになります) – Progrmr

答えて

3

cmpは、compare two bytes/words/dwords, not stringsに使用されます。したがって、基本的にはbufferの最初の4バイトとcompの4バイトを比較するよう無効な構文を使用して比較するよう求めています。

文字列を比較するには、cmpsまたは手動ループを使用する必要があります。

さらに、compcomp db '13243546', 0と宣言する必要があります。あなたが今宣言したところでは、Cの文字列"\x9A\x14\xCA"に相当する00CA149Aのdwordになります。かなり複雑です。

+0

ああ、私は参照してください....私は 'バッファ'から入力を取得するとき、それは文字列形式です。だから私はそれを一致させるための文字列として 'comp'を宣言する必要があります。ありがとうございました。 – Progrmr

関連する問題