Assembly MASM计算2D数组中行的偏移量



我在理解如何计算二维数组中行的偏移量时遇到了一些困难。稍后main将使用这些偏移量来访问作业和测验的行。

假设我有

scores DWORD 80,80,100,                 ; midterms, 2 scores
             20,20,20,20,20,20,20,100,  ; assignments, 7 scores
             10,10,10,10,10,10,100      ; quizzes, 6 scores (lowest score dropped)

,其中"100"是前哨值。我理解偏移量是指从数组开始的行有多少字节远。

     mov ecx, sentinelVal
     mov edi, OFFSET scores
     mov eax, sentinelVal
   OffsetLoop:
    repne scasd ; walk through the array until the target value is found.
    jnz endLoop ; if the sentinel value is not found jump from the loop
   ; If the sentinel value if found
   ; edi is pointing to the location after the sentinel value
   ; I am not sure what I should do with the address of the array and edi
   ; to figure out the offset. Any help would be appreciated. Thanks!
  loop OffsetLoop
  endLoop: 

编辑:我知道我的问题出在哪里了。我计算偏移量的方法是正确的,但导致问题的是循环。不可能简单地将ecx设置为任意大的数字,因为scasd也使用ecx作为计数器。通过将ecx设置为一个较大的数字,指令将超出触发异常的数组边界。

  mov ecx, LENGTHOF scores
  OffsetLoop:
    cld
    repne scasd
    jnz endLoop
    mov ebx, edi
    sub ebx, OFFSET scores
    push ebx
    inc ecx
loop OffsetLoop
endLoop: 

假设您的描述是正确的,即edi左指向前哨字以外的一个,您可以简单地执行:

sub  edi, OFFSET scores

获取从表开头开始的字节偏移量。

我有点担心这个:

mov ecx, sentinelVal

ecx寄存器应该是一个长度限制,而100可能是一个体面的值,你应该有一个不同的符号名称,如lenLimit

相关内容

  • 没有找到相关文章

最新更新