我在理解如何计算二维数组中行的偏移量时遇到了一些困难。稍后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
。