如何在linux

时间:2018-04-23 15:59:57

标签: assembly x86-64

我正在进行AES算法的汇编实现,以了解如何实现/访问sbox和查找表。 从理论上讲,当密钥长度= 128位时,AES会使用10轮。

有一个部分是一行200行代码(AES轮的表示)被执行。

_x86_64_AES_decrypt_compact:


.Ldec_loop_compact:

xorl    0(%r15),%eax
xorl    4(%r15),%ebx
xorl    8(%r15),%ecx
xorl    12(%r15),%edx
leaq    16(%r15),%r15
.
.
.
xorl    %r12d,%ecx
movq    256(%r14),%r13
xorl    %r8d,%ebx
xorl    %r11d,%edx

jmp .Ldec_loop_compact

每次完成一轮AES时,我想将全局变量(即round_var)值增加1。 因此,在1个块(16字节)的AES操作结束时,变量的值将为10和 在2个块(2x16bytes)的AES操作结束时,变量的值将为20.

.globl round_var 
round_var:
.long 0

_x86_64_AES_decrypt_compact:


.Ldec_loop_compact:
.
.
.
;increase round_var by 1 
.
.
.
jmp .Ldec_loop_compact

为了将round_var增加1,我尝试了以下方法

64bit :
        movq    round_var(%rip), %rax
        addq    $1, %rax
        movq    %rax, round_var(%rip)

32bit :
        movl    round_var(%rip), %eax
        addl    $1, %eax
        movl    %eax, round_var(%rip)

由于所有eax,ebx,ecx,edx都在该循环中使用,我只是在更新%eax(或%rax)寄存器之前添加了这些行,因此它不会影响AES操作。

添加这些行之后,我成功地执行了以下命令来构建自定义的openssl。这意味着在编译/组装期间将行添加到正确的位置。

make
sudo make install

但是,我在尝试执行AES解密操作时遇到了分段错误。这表明在运行时这些行代码出错了。

我怀疑movl round_var(%rip), %eax%rip 导致此分段错误。

如果有人帮我解决上述问题或使用汇编指令将全局变量round_var增加1,那将会很棒吗?

我使用的是Ubuntu-16.04,Intel(R)Core(TM)i5-7200U CPU @ 2.50GHz和Openssl-1.0.2n

提前致谢。

1 个答案:

答案 0 :(得分:0)

静态变量应放在.data部分。为此,请写下:

        .data                 # enter the data section
        .align 4              # align to four bytes
var:    .long 1234            # assemble a 32 bit word with value 1234

您可能还需要指定以下内容以帮助调试:

        .type var,@object     # var refers to an object
        .size var,4           # var occupies 4 bytes of storage

如果变量最初的值为零,您可以选择将其放在.bss部分中以节省二进制文件中的空间。 .bss部分不占用二进制文件中的空格,并在运行时填充零。

        .bss                  # enter the bss section
        .align 4              # align to four bytes
var:    .space 4              # allocate four bytes for var

与上一种方法类似,您可能还需要指定符号大小和类型以便更好地进行调试。

作为简写,你可以写

        .lcomm var,4          # align four bytes in .bss for var

第三种选择是将变量定义为公共符号。这会导致其他翻译单元中具有相同名称的所有变量与此合并,并且对于创建全局变量很有用。只需写下

        .comm var,4           # defines var to be a common symbol of size 4