Функция сборки не будет изменять значения в массиве, отправленном с - PullRequest
0 голосов
/ 02 июня 2019

функция ассемблера вычисляет значения заданной матрицы col, все прекрасно вычисляет, но все равно выводит забавный результат.не могу найти проблему.

проверил все, и расчет работает просто отлично, единственная проблема - значения в строке, которые, кажется, не были изменены

  ; void sum_col(int n , int m , long int*matrix[], long int new_col[])
  ;               [BP+4]  [BP+6]       [BP+8]             [BP+12]
    .MODEL SMALL
    .STACK 100h
    .DATA 


    .CODE 
    .386
    PUBLIC _lab9c
    _lab9c proc near 

    PUSH BP
    MOV BP,SP
    ;; used registers push
    PUSH SI
    PUSH DI


    MOV DI , [BP+8] ;DI POINTS TO MATRIX
    MOV SI , [BP+12] ;SI POINTS TO NEW COL 
    MOV BX , [DI] ;POINT TO A CERTIAN ROW

    MOV CX,[bp+6]
    Nullify:
    MOV DWORD PTR [SI],0
    ADD SI,4
    loop Nullify

    MOV DX,[BP+4]
    MAT_ROW:
    MOV SI,[BP+12] ;SI POINTS TO NEW COL
    MOV CX,[BP+6]
    L1:
    MOV EAX , [BX]
    ADD EAX , [SI]
    MOV [SI],EAX
    ADD SI,4
    ADD BX,4
    MOV EAX,0
    LOOP L1
    SUB DX,1
    CMP DX,0
    JE END1
    ADD DI,2
    MOV EBX,[DI] ;POINT TO A CERTIAN ROW
    JMP MAT_ROW


    END1:
    MOV SI , [BP+12] ;SI POINTS TO NEW COL 

    POP DI
    POP SI
    POP BP
    RET

    ENDP _lab9c
    end

, и этоэто код c

#include <stdio.h>
#include <stdlib.h>
extern void lab9c(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;
  lab9c(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

1 Ответ

1 голос
/ 02 июня 2019

адрес new_coal не в [bp + 12], а в [bp + 10].(long int * matrix []) имеет размер 2 байта, а не 4, потому что он содержит адреса.спасибо за помощь!

...