c - 汇编函数不会更改从 c 发送的数组中的值

标签 c assembly x86-16

汇编函数计算给定矩阵 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

最佳答案

new_coal 地址不在 [bp+12] 处,而是在 [bp+10] 处。 (long int *matrix[]) 的大小为 2 个字节,而不是 4 个字节,因为它携带地址。 感谢您的帮助!

关于c - 汇编函数不会更改从 c 发送的数组中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56417638/

相关文章:

c++ - OpenGL 调用锁定/卡住

python - OpenMP、Python、C 扩展、内存访问和邪恶的 GIL

memory - gdb 'x' 命令有什么作用?

assembly - 哔哔声 Bootloader(Intel x86)

assembly - 检查数字是奇数还是偶数(数学奇偶校验)

c - 我不明白为什么我会收到这个 valgrind 错误

c - 我怎样才能使用递归公式来获得幂而不给我段错误?

assembly - 在哪里可以了解我的计算机的低级工作原理?

c++ reinterpret cast和c style cast之间的区别

c - 如何告诉 GCC 为实模式生成 16 位代码