为什么移动会导致分割错误



简介

我试着熟悉AES指令,然后更有意识地使用这些技术的库。然而,我不经常在汇编中编程,所以我对语言有一些信心,但我不认为自己是专家。我已经写了一份大约150条装配线的清单,试图使用英特尔提供的文档来使用这些功能。然而,我并没有成功地向前迈出许多步伐。

当我使用指令movaps时,由于主程序中的分段错误,程序崩溃。我尝试过使用gdb和valgrind进行调试,但似乎一切都应该正常,但事实并非如此。以下是导致问题的线路。

代码

main:
start_f
printstr
movaps (string), %xmm15
==> movaps (key), %xmm0
call   aes_encript
movaps %xmm15, string
printstr
end_f

CCD_ 2和CCD_。我还提供了.data部分的代码,以显示如何应该没有问题:

.data
string:
.string "string"
.fill   (128 - (.-string)), 1, 0
newline:
.byte   0x0a
key:
.fill   128, 1, 0
.text
.global _start

调试信息

至于这个错误,无论是通过静态反汇编还是在gdb中,我都无法获得任何有用的信息。Valgrind也没什么帮助,这是意料之中的事,因为我根本不碰它。我在gdb:中显示了一个主要的分解列表

0x0000000000401022 <+0>:     push   %rbp
0x0000000000401023 <+1>:     mov    %rsp,%rbp
0x0000000000401026 <+4>:     mov    $0x402000,%rsi
0x000000000040102d <+11>:    call   0x401156 <write_long>
0x0000000000401032 <+16>:    mov    $0x1,%rax
0x0000000000401039 <+23>:    mov    $0x1,%rbp
0x0000000000401040 <+30>:    mov    $0x402080,%rsi
0x0000000000401047 <+37>:    mov    $0x1,%rdx
0x000000000040104e <+44>:    syscall 
0x0000000000401050 <+46>:    movaps 0x402000,%xmm15
=> 0x0000000000401059 <+55>:    movaps 0x402081,%xmm0
0x0000000000401061 <+63>:    call   0x4010b6 <aes_encript>
0x0000000000401066 <+68>:    movaps %xmm15,0x402000
0x000000000040106f <+77>:    mov    $0x402000,%rsi
0x0000000000401076 <+84>:    call   0x401156 <write_long>

这是地址0x402081的内容(完全可以访问(:

(gdb) x/32x 0x402081
0x402081:       0x00000000      0x00000000      0x00000000      0x00000000
0x402091:       0x00000000      0x00000000      0x00000000      0x00000000
0x4020a1:       0x00000000      0x00000000      0x00000000      0x00000000
0x4020b1:       0x00000000      0x00000000      0x00000000      0x00000000
0x4020c1:       0x00000000      0x00000000      0x00000000      0x00000000
0x4020d1:       0x00000000      0x00000000      0x00000000      0x00000000
0x4020e1:       0x00000000      0x00000000      0x00000000      0x00000000
0x4020f1:       0x00000000      0x00000000      0x00000000      0x00000000

请求

我不排除这个错误是愚蠢的琐碎:我已经有一段时间没有使用as了。不管怎样,如果你能给我小费,我将不胜感激。

如果你想自己尝试这个代码,这里有一个包含整个列表的pastebin:https://paste.debian.net/1194986/

key0x402081内存地址未与16字节对齐。

来自英特尔®;64和IA-32体系结构软件开发人员手册,MOVAPS规范:

MOVAPS—移动对齐压缩单精度浮点值

当源或目标操作数是内存操作数时,该操作数必须在16字节(128位(上对齐版本(、32字节(VEX.256编码版本(或64字节(EVEX.512编码版本(边界或将生成一般保护异常(#GP(。

您可以使用movups,但通常最好对齐常量。

在前一行中,0x402000与16个字节对齐,所以前一行不分段。

CCD_ 10可以定义如下以与16个字节对齐:

.balign 16
key:
.fill   128, 1, 0

还要注意,这是128个字节的零,而不是128位。既然它都是零,你可以把它放在.bss而不是.data

(将newline: .byte 'n'放在之后,这样就不会在对齐上浪费15个字节。或者更好的做法是,将换行符放在.rodata中,或者让write_long在其写入的输出中包含一个换行符。(

相关内容

  • 没有找到相关文章

最新更新