【发布时间】:2014-05-30 21:36:46
【问题描述】:
我有两个矩阵 nxn,A 和 B。
A=[1 2 3 4 ; 5 6 7 8 ; 9 10 11 12; 13 14 15 16]
B=[1 1 1 1 ; 1 1 1 1 ; 1 1 1 1 ; 1 1 1 1 ]
这两个矩阵的分配方式与 C 中的 float* 相同。 从 main.c ,我在程序集中调用程序集 'exportRow(A,B,n);'
在汇编中,
...
mov eax,[ebp+a]
mov ebx,[ebp+b]
mov [xa],eax
mov [xb],ebx
printps [xa],1
printps [xb],1
movaps xmm0,[xa]
movaps [xb],xmm0 ;casuses segmentation fault
...
printps 是一个宏,它只用于打印 xa 和 xb 的一个位置内存(它们是 dword)。 我想用 xa 和 xb 作为矩阵的指针。
输出:
[1,2,3,4]
[1,1,1,1]
SEGMENTATION FAULT
为什么最后一条指令会导致分段错误?哪里有问题? 如果我在最后一条指令中将 [xb] 替换为 [xa](仅用于测试),我没有任何错误。
---编辑---
如果我修改[xb],修改应该不会影响B?
不过,稍作修改:(实际上 xa 和 xb 是 resd 并在 32 字节处对齐。)
movaps xmm0,[xa+16]
movaps [xb],xmm0
printps [xb],1
分段错误....
---编辑----
这是一个小例子的代码:
int main(){
int m=4;
int n=4;
float* A=malloc(sizeof(float)*m*n);
float* B=malloc(sizeof(float)*m*n);
for(int i=0;i<m*n;i++){
A[i]=i;
B[i]=1;
}
printMatrix(A,m,n);
printMatrix(B,m,n);
exportRow(A,B,n); //procedure assembly
printMatrix(B,m,n);
}
汇编代码:
section .data
A equ 8
B equ 12
n equ 16
section .bss
alignb 32
xa resd 1
alignb 32
xb resd 1
section .text
global exportRow
exportRow: push ebp
mov ebp,esp
push ebx
push esi
push edi
mov eax,[ebp+a]
mov ebx,[ebp+b]
mov [xa],eax
mov [xb],ebx
printps [xb],1
printps [xa+16],1
movaps xmm0,[xa+16]
movaps [xb],xmm0
printps [xb],1
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
输出:
A=[1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ; 13 14 15 16]
B=[1 1 1 1 ; 1 1 1 1 ; 1 1 1 1 ; 1 1 1 1 ]
[1,1,1,1]
SEGMENTATION FAULT
案例 alignb 32: 如果我得到 [xa+16] ,我有分段错误。
案例 alignb 16: 如果我得到 [xa+16],我有 [1 1 1 1],为什么?我在想结果是 [5 6 7 8]。
还有一个问题(我认为这两个问题是相关的): 使用帖子顶部的代码:
mov eax,[ebp+a]
mov ebx,[ebp+b]
mov [xa],eax
mov [xb],ebx
printps [xa],1
printps [xb],1
movaps xmm0,[xa]
movaps [xb],xmm0
printps [xb],1
输出:
A=[1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ; 13 14 15 16]
B=[1 1 1 1 ; 1 1 1 1 ; 1 1 1 1 ; 1 1 1 1 ]
[ 0.000000 1.000000 2.000000 3.000000 ]
[ 1.000000 1.000000 1.000000 1.000000 ]
[ 0.000000 1.000000 2.000000 3.000000 ]
B=[1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000
1.000000 1.000000 1.000000 1.000000]
我已经修改了 xb,但是矩阵 B 是完整的。为什么?
【问题讨论】:
-
可能只是内存错位。
-
如何对齐?我测试一下
-
是的,问题就在这里!改变 [xb],因为这些改变对矩阵 B 也没有影响?