Управление указателями в сборке - PullRequest
0 голосов
/ 13 января 2019

У меня есть указатель на матрицу, которую я получил от функции C, и мне нужно заполнить другой массив, который я получил от той же функции C, и мне нужно заполнить его суммами каждого столбца матрицы. Проблема заключается в том, что после заполнения массива он возвращается к функции C и при попытке печати массива приводит к печати несвязанных чисел (возможно, адресов) вместо фактической суммы столбцов.

Вот код из функции C:

#include <stdio.h>
#include <stdlib.h>
extern void sum_col(int n, int m, long int *matrix[], long int new_col[]);
int main() {
    int n = 4, m = 3, i, j;
    long int *matrix[4];
    long int new_col[3];
    for (i = 0; i < n; i++)
        matrix[i] = (long int *)malloc(m * sizeof(long int));
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
            matrix[i][j] = 100 * i + j;
    sum_col(n, m, matrix, new_col);
    printf("matrix:\n");
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++)  printf("%8ld", matrix[i][j]);
        printf("\n");
    } // for
    printf("new_col:\n");
    for (i = 0; i < m; i++)
        printf("%8ld", new_col[i]);
    return 0;
} // main

А вот код сборки:

.MODEL SMALL
.DATA
SUM DW ?
I   DW ?
J   DW ?
K   DW ?
.CODE

PUBLIC _sum_col
_sum_col PROC NEAR
PUSH BP
MOV BP,SP
PUSH SI
PUSH DI

MOV I,0
MOV J,0
MOV K,0
MOV CX,[BP+6]   ; CX = m
MOV BX,[BP+4]   ; BX = n
MOV SI,[BP+8]   ; SI = matrix
MOV DI,[BP+12]  ; DI = new_col


L1:
MOV SUM,0
PUSH CX
MOV CX,BX
MOV I,0
L2:
MOV SI,[BP+8]
ADD SI,I
MOV AX,[SI]
MOV SI,AX
ADD SI,J
MOV AX,[SI]
ADD SUM,AX
ADD I,2
LOOP L2
MOV AX,SUM
ADD DI,K
MOV [DI],AX
ADD J,4
ADD K,4
POP CX
LOOP L1

POP DI
POP SI
POP BP
RET
_sum_col ENDP
END

Может кто-нибудь сказать мне, где я ошибся?

...