如何在大型模型装配 8086 中使用矩阵?

How to do you work with a matrix in large model assembly 8086?

我有一个从程序集调用过程的 C 程序,我正在使用大型模型,我不明白如何访问我从 C 发送的矩阵。 在我调用装配程序后,我执行以下操作, C代码:

extern long int f1(long int *arr_ptr[]);
void main()
{
  long int arr1[4]= {113891, 319762, 987431, 765437}; 
  long int arr2[4]= {567434, 988885, 654329, 999990}; 
  long int arr3[4]= {123456, 999999, 888880, 498766}; 
  long int *arr_ptr[3];
  arr_ptr[0] = arr1;
  arr_ptr[1] = arr2;
  arr_ptr[2] = arr3;
  f1(arr_ptr);}

汇编代码:

PUBLIC _f1
    _f1 PROC FAR
    .386
    PUSH BP
    MOV BP,SP
    PUSH BP
    PUSH ES
    PUSH DI


    MOV DI,[BP+6];take the offset
    MOV ES,[BP+8];take the segment

    MOV EDX,DWORD PTR [ES:DI];store the first value at row 1 and col 1
    POP DI
    POP ES
    POP BP
    RET
    _f1 ENDP

END

MOV DX,[BX] 等同于 MOV DX,[DS:BX]。换句话说,假设矩阵值在 DS: 中。

但是如果矩阵到达 FAR 指针,其段在 ES: 中加载,那么矩阵值在 DS: 中的可能性很小。

因此,以下情况之一为真:

  • 要么在[ES:DI]中找到第一行的segment:address,要么在

  • [ES:DI]中你会找到第一行的第一个值而不是第一行的地址。

为了说明,您应该向我们展示矩阵是如何在 C 中定义的。

编辑

因此,您正在使用 arr_ptr 的地址加载 ES:DI。然后需要获取arr1的地址。为此,您需要以下内容:

MOV AX, [ES:DI]
MOV DI, [ES:DI + 2]
MOV ES, AX

然后,可以用MOV EDX,DWORD PTR [ES:DI]得到arr1[0]的值。