我在程序集8086中的索引出现问题,我在程序集中有一个程序,我从C调用,并且该过程采用类型为long int
的指针数组,如long int *arr_ptr[3]
所示,代码是这样的(我认为我的SI
是我的行指针而DI
是我的列指针):
MOV SI,[BP+6] ;now si points to the first row
MOV DI,[SI] ;now DI is pointing to the first row
; and at the first column column
ADD SI,2 ;here i can move the SI pointer to the next row,
; but i want to do this in a loop so i thought
; ill define a variable cnt in my data and do this
MOV DI,[SI+cnt]
cnt
为2时的最后一行与ADD SI,2
不同,我该怎么办?我只想简单地遍历我的矩阵。
答案 0 :(得分:1)
首先,您必须传递行数(假设变量),或者使用NULL
ptr(我的首选项)终止行指针。或者构建一个包含所有需要信息的结构 - 行计数,数据地址 - 并将其ptr传递给您的处理程序。
假设您NULL
终止了行ptrs,汇编代码可能如下所示:
mov si,[bp+6]
jmp short rowloopentry
rowloop:
<< process row data pointed to by di >>
rowloopentry:
mov di,[si] ;get next row data ptr, and advance index
add si,2
test di,di ;process next row if not at end
jnz rowloop
或者,如果行计数作为参数传递,则原型可能变为func(long int *arr_ptr[], unsigned rowcnt);
,处理代码可循环如下:
mov cx,[bp+8]
mov si,[bp+6]
test cx,cx
jz zerorows
rowloop:
mov di,[si] ;get next row data ptr, and advance index
add si,2
<< process row data pointed to by di >>
loop rowloop ;process next row if not at end
zerorows:
以上忽略了对特定处理器架构的优化。