不能使用部件更改阵列的值


.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作为,它是从数组开始以字节为单位测量的偏移量

相关内容

  • 没有找到相关文章

最新更新