如何在程序集8086中进行索引工作?

时间:2017-06-07 19:52:59

标签: assembly parameter-passing x86-16

我在程序集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不同,我该怎么办?我只想简单地遍历我的矩阵。

1 个答案:

答案 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:

以上忽略了对特定处理器架构的优化。