我正在进行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
提前致谢。
答案 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