【问题标题】:Cant change Values of Array using assembly无法使用程序集更改数组的值
【发布时间】:2021-04-27 18:43:37
【问题描述】:
.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

我制作了一个 unsigned char 数组、一个 unsigned char 和一个要循环的整数。 我尝试将十六进制的 0 移动到 edi,将十六进制的 255 移动到 edi,仍然是同样的错误

【问题讨论】:

  • 语法错误或运行时错误?如果 ecx 在某种程度上是一个坏指针,我会在运行时看到异常。如果 cmp/mov [ecx+eax] 指向只读的内存部分(如果 ArrayChars 是常量),我可以看到您在 mov 指令上遇到异常。
  • 据我所知没有语法错误。嗯,} 很奇怪,但 MASM 似乎忽略了它,因为它出现在 END 之后。

标签: assembly x86 masm


【解决方案1】:

mov [ecx+eax], edi行中的表达式中出现语法错误

对于一个有.586的程序,上面的指令是正确的。

更令人担忧的是你对sizes的使用。

您使用 3 个参数调用 binarize 过程:一个无符号字符 (Limite)、一个无符号字符数组 (ArrayChars) 和一个要循环的整数 (Tamanho)。
该数组由 bytes 组成,我们看到您使用 inc eax,但您比较并存储 dwords。这意味着您的代码是错误的,并且在访问数组之后的 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 作为从数组开始处以字节为单位测量的偏移量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 2015-03-20
    • 2021-10-28
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多