.586 ;Target processor. Use instructions for Pentium class machines
.MODEL FLAT, C ;Use the flat memory model. Use C calling conventions
.CODE ;Indicates the start of the code segment.
PUBLIC binarize
binarize PROC
push ebp
mov ebp,esp
;-------Variaveis----------
mov eax ,0; Counter
mov ebx, [ebp+8]; Limite
mov ecx, [ebp+12];ArrayChars
mov edx, [ebp+18];Tamanho
mov edi, 0
;--------------------------
LoopVer:
cmp [ecx+eax], ebx
jle elseloop
mov edi, 0
mov [ecx+eax], edi
jmp end_if
elseloop:
mov edi, 255
mov [ecx+eax], edi
end_if:
inc eax
cmp eax, edx
jne LoopVer
pop ebp
ret
binarize ENDP
END
}
在行中的表达式中获取语法错误mov[ecx+eax],edi
我制作了一个无符号的char数组、一个无签名的char和一个要循环的整数。我尝试将十六进制中的0移动到edi,将十六进制的255移动到edi,仍然是相同的错误
在
mov [ecx+eax], edi
行的表达式中获取语法错误
对于具有.586
的程序,上述指令是正确的。
更令人担忧的是您使用尺寸。
您使用3个参数调用二进制化过程:无符号字符(Limite(、无符号字符数组(ArrayChars
数组由字节组成,我们看到您使用inc eax
,但您比较并存储双字。这意味着您的代码是错误的,并且在访问经过数组的3个字节时可能会触发分段错误。
还要注意,这可能是一个拼写错误,第三个参数位于[ebp+16]
(而不是[ebp+18]
(。
我的重写如下:
mov dh, [ebp+8] ; Limite
mov ecx, [ebp+12] ; ArrayChars
xor eax, eax ; Offset in the array
LoopVer:
mov dl, 0
cmp [ecx+eax], dh ; DH is Limite
jg elseloop
not dl
elseloop:
mov [ecx+eax], dl ; DL == {0,255}
inc eax
cmp eax, [ebp+16] ; Tamanho
jb LoopVer
请记住,您使用EAX
作为,它是从数组开始以字节为单位测量的偏移量。