Question

I am experiencing some difficulties with understanding of how I can calculate the offset to the row in two dimensional array. The offsets will be used by main later to access the rows for the assignments and quizzes.

Assuming that I have,

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)

where "100" is a sentinel value. I understand that the offset is how many bytes away is the row from the start of array.

     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: 

edited: I figured out what was my problem. My approach to calculate the offset was right, but it was the loop that caused the problem. It's not possible to simply set ecx to any arbitrary large numbers because scasd also uses ecx as a counter. By setting ecx to a large number, the instruction goes beyond the array boundary which triggers the exception.

  mov ecx, LENGTHOF scores

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

endLoop: 
Était-ce utile?

La solution

Assuming your descriptions are correct in that edi is left pointing one beyond the sentinel word, you can simply do:

sub  edi, OFFSET scores

to get the byte offset from the beginning of the table.

I'd be a little worried about this though:

mov ecx, sentinelVal

The ecx register is supposed to be a length limit and, while 100 may be a decent value, you should have a different symbolic name for it such as lenLimit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top