I am trying to make a password file where you enter the password and it shows you all your passwords. My current code is this, but it has an error:
.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
This is the error:
test.asm(32) : error a2070: invalid instruction operands
Why does that happen. I understand that the error is on line 32 but I don’t understand what the error is.
cmpis used to compare two bytes/words/dwords, not strings. So you’re basically asking it to compare the first four bytes ofbufferto the four bytes ofcompand using invalid syntax to do this.To compare strings, you need to use
cmpsor a manual loop.Additionally,
compshould be declared ascomp db '13243546', 0. The way you declared it now makes it into a dword00CA149A, which is equivalent to the C string"\x9A\x14\xCA"– quite complex to type 🙂