【问题标题】:Where is the counter?柜台在哪里?
【发布时间】:2022-11-04 03:03:48
【问题描述】:

对于我的装配任务,我应该划分柜台。我需要帮助的只是试图在此处指出这一点,以便我可以继续这样做。

.686
.model flat

.code

_max PROC; named _max because C automatically prepends an underscode, it is needed to interoperate

push ebp
mov ebp, esp; stack pointer to ebp

mov ebx, [ebp + 8]; address of first array element
mov ecx, [ebp + 12]
mov ebp, 0
mov edx, 0
mov eax, [ebx]

loopMe:
cmp ebp, ecx
je allDone

cmp eax, [ebx + edx]
jg continue

mov eax, [ebx + edx]

continue:
add edx, 4
add ebp, 1
jmp loopMe

allDone :

pop ebp
ret
_max ENDP

END

【问题讨论】:

  • 您正在将长度加载到 ECX 中。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如它目前所写的那样,很难准确地说出你在问什么。
  • 我不明白您所说的“划分柜台”是什么意思。请更详细地解释您的问题。

标签: assembly x86 counter masm


【解决方案1】:
mov ebx, [ebp + 8]; address of first array element
mov ecx, [ebp + 12]

如果第二个参数包含数组元素的数量,则代码是正确的,不需要更改优化当然!


但是如果第二个参数包含数组的总长度,例如。 28 对于具有 7 个 dword 元素的数组,您需要将 ECX 除以 4 以获得正确运行的代码。无需使用div 指令,只需向右移动两次:

  mov ebx, [ebp + 8]  ; address of first array element
  mov ecx, [ebp + 12] ; total length of the array
  shr ecx, 2          ; DIVIDE THE COUNTER
  mov ebp, 0
  mov edx, 0
  mov eax, [ebx]
loopMe:
  cmp ebp, ecx
  je  allDone
  cmp eax, [ebx + edx]
  jg  continue
  mov eax, [ebx + edx]
continue:
  add edx, 4
  add ebp, 1
  jmp loopMe
allDone :

“划分柜台”不是您唯一的选择。相反,您可以使用 EDX 中的偏移作为停止标准:

  mov ebx, [ebp + 8]  ; address of first array element
  mov ecx, [ebp + 12] ; total length of the array
  xor edx, edx
  mov eax, [ebx]
loopMe:
  cmp edx, ecx
  je  allDone
  cmp eax, [ebx + edx]
  jg  continue
  mov eax, [ebx + edx]
continue:
  add edx, 4
  jmp loopMe
allDone :

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多