汇编_字节集异或
本帖最后由 爱飞的猫 于 2023-8-17 08:48 编辑
如果要优化性能,还是直接传引用然后改比较好,可以纯汇编实现:
```text
.版本 2
.子程序 汇编__字节集_XOR, , , [爱飞的猫 @ 52pojie] 使用汇编对两个字节集进行 XOR 处理
.参数 内容, 字节集, 参考, 直接更改该参数传参值
.参数 密钥, 字节集, , 若短于内容,则重复处理密钥
置入代码 ({ 86, 87, 83, 139, 117, 8, 139, 54, 131, 198, 8, 139, 126, 252, 1, 247, 57, 254, 116, 35, 139, 77, 12, 139, 9, 131, 193, 8, 139, 81, 252, 1, 202, 137, 203, 57, 209, 116, 16, 138, 1, 65, 48, 6, 70, 57, 209, 117, 2, 137, 217, 57, 254, 117, 240, 91, 95, 94 })
```
汇编代码如下,使用 FASM 编译即可。
```x86asm
use32 ; 爱飞的猫制作
; [易语言] 置入代码 - 汇编__字节集_XOR
push esi
push edi
push ebx
p_input equ esi
p_input_end equ edi
p_key equ ecx
p_key_end equ edx
p_key_start equ ebx
temp equ al
mov p_input, dword
mov p_input, dword
add p_input, 0x08
mov p_input_end,
add p_input_end, p_input
cmp p_input, p_input_end
je __end
mov p_key, dword
mov p_key, dword
add p_key, 0x08
mov p_key_end,
add p_key_end, p_key
mov p_key_start, p_key
cmp p_key, p_key_end
je __end
__loop:
mov temp, byte
inc p_key
xor byte, temp
inc p_input
cmp p_key, p_key_end
jne @f
mov p_key, p_key_start
@@:
cmp p_input, p_input_end
jne __loop
__end:
pop ebx
pop edi
pop esi
```
测试代码:
```text
.版本 2
.子程序 _启动子程序, 整数型, , [爱飞的猫] 制作
.局部变量 数据, 字节集
.局部变量 密钥, 字节集
数据 = 到字节集 (“A0 测试内容”)
密钥 = { 255, 0, 0 }
密钥 = 二进制 (“01010101”)
密钥 = 二进制 (“10101010”)
标准输出 (#标准输出设备, “原始数据 (十六进制): ”)
标准输出 (#标准输出设备, 汇编_字节集到十六进制 (数据, 真))
标准输出 (#标准输出设备, #换行符)
标准输出 (#标准输出设备, “ 密钥 (十六进制): ”)
标准输出 (#标准输出设备, 汇编_字节集到十六进制 (密钥, 真))
标准输出 (#标准输出设备, #换行符)
汇编__字节集_XOR (数据, 密钥)' 第一次处理
标准输出 (#标准输出设备, “第一次处理 (十六进制): ”)
标准输出 (#标准输出设备, 汇编_字节集到十六进制 (数据, 真))
标准输出 (#标准输出设备, #换行符)
汇编__字节集_XOR (数据, 密钥)' 第二次处理
标准输出 (#标准输出设备, “第二次处理 (十六进制): ”)
标准输出 (#标准输出设备, 汇编_字节集到十六进制 (数据, 真))
标准输出 (#标准输出设备, #换行符)
标准输出 (#标准输出设备, “第二次处理 (字 符 串): ”)
标准输出 (#标准输出设备, 到文本 (数据))
标准输出 (#标准输出设备, #换行符)
标准输入 (假)
返回 (0)' 可以根据您的需要返回任意数值
```
输出:
```text
原始数据 (十六进制): 41 30 20 B2 E2 CA D4 C4 DA C8 DD
密钥 (十六进制): FF 55 AA
第一次处理 (十六进制): BE 65 8A 4D B7 60 2B 91 70 37 88
第二次处理 (十六进制): 41 30 20 B2 E2 CA D4 C4 DA C8 DD
第二次处理 (字 符 串): A0 测试内容
```
---
来跑个测速,测速代码:
```text
.版本 2
.子程序 测速
.局部变量 数据, 字节集
.局部变量 数据副本, 字节集
.局部变量 密钥, 字节集
.局部变量 开始时间, 整数型
.局部变量 耗时毫秒, 整数型
.局部变量 耗时记录, 双精度小数型, , "1"
.局部变量 次数, 整数型
.局部变量 耗时最高, 整数型
.局部变量 耗时最低, 整数型
.局部变量 累计耗时, 整数型
.局部变量 平均耗时, 整数型
.局部变量 切尾均值, 双精度小数型
数据副本 = 到字节集 (“A1 测试内容”)
密钥 = { 255, 0, 0, 0 }
密钥 = 二进制 (“01010101”)
密钥 = 二进制 (“10101010”)
' #采样次数 = 10
重定义数组 (耗时记录, 假, #采样次数)
.计次循环首 (#采样次数, 次数)' 取样 10 次
开始时间 = 取启动时间 ()
.计次循环首 (100 × 10000, )
数据 = 数据副本
汇编__字节集_XOR (数据, 密钥)
.计次循环尾 ()
耗时毫秒 = 取启动时间 () - 开始时间
累计耗时 = 累计耗时 + 耗时毫秒
耗时记录 [次数] = 耗时毫秒
printf__siis_v (“百万次执行耗时 [%02d] -- %dms%s”, 次数, 耗时毫秒, #换行符)
.计次循环尾 ()
数组排序 (耗时记录, 真)
' 切尾均值: 去掉两个最低和最高的成绩,再次计算
平均耗时 = 累计耗时 ÷ #采样次数
切尾均值 = (累计耗时 - 耗时记录 - 耗时记录 - 耗时记录 [#采样次数 - 0] - 耗时记录 [#采样次数 - 1]) ÷ (#采样次数 - 4)
printf__dds_v (“平均耗时: %.2fms (切尾均值=%.2fms)%s”, 平均耗时, 切尾均值, #换行符)
printf__is_v (“最佳成绩: %dms%s”, 耗时记录 , #换行符)
printf__is_v (“最差成绩: %dms%s”, 耗时记录 [#采样次数 + 0], #换行符)
.DLL命令 printf__siis_v, , "msvcrt.dll", "@printf"
.参数 fmt, 文本型
.参数 i1, 整数型
.参数 i2, 整数型
.参数 s1, 文本型
.DLL命令 printf__dds_v, , "msvcrt.dll", "@printf"
.参数 fmt, 文本型
.参数 d1, 双精度小数型
.参数 d2, 双精度小数型
.参数 s1, 文本型
.DLL命令 printf__is_v, , "msvcrt.dll", "@printf"
.参数 fmt, 文本型
.参数 i1, 整数型
.参数 s1, 文本型
.常量 采样次数, "10"
```
测速结果(静态编译):
```text
百万次执行耗时 -- 62ms
百万次执行耗时 -- 78ms
百万次执行耗时 -- 63ms
百万次执行耗时 -- 63ms
百万次执行耗时 -- 62ms
百万次执行耗时 -- 63ms
百万次执行耗时 -- 78ms
百万次执行耗时 -- 63ms
百万次执行耗时 -- 62ms
百万次执行耗时 -- 63ms
平均耗时: 65.00ms (切尾均值=62.83ms)
最佳成绩: 62ms
最差成绩: 78ms
```
然后测测你的(静态编译):
```text
百万次执行耗时 -- 156ms
百万次执行耗时 -- 141ms
百万次执行耗时 -- 141ms
百万次执行耗时 -- 156ms
百万次执行耗时 -- 140ms
百万次执行耗时 -- 141ms
百万次执行耗时 -- 141ms
百万次执行耗时 -- 156ms
百万次执行耗时 -- 141ms
百万次执行耗时 -- 140ms
平均耗时: 145.00ms (切尾均值=143.50ms)
最佳成绩: 140ms
最差成绩: 156ms
```
感觉应该是 `参与异或的字节集 = 取重复字节集 (参与异或的字节集长度, 参与异或的字节集)` 这一行对性能的影响最大。
易语言代码(附赠一个 `汇编_字节集到十六进制` 的实现):
这个是。。。。 这以前下载过,再支持一下! 感谢分享 爱飞的猫 发表于 2023-8-17 07:15
如果要优化性能,还是直接传引用然后改比较好,可以纯汇编实现:
```text
能不能在这里加一个返回值 本帖最后由 爱飞的猫 于 2023-8-17 09:38 编辑
20230713G001133 发表于 2023-8-17 08:49
能不能在这里加一个返回值
速度会慢一倍,因为易语言会申请一样大的内存然后重新拷贝过去。
```text
.版本 2
.子程序 汇编__字节集_XOR_拷贝1, 字节集, , 不更改参数,返回新的字节集。
.参数 内容, 字节集
.参数 密钥, 字节集, , 若短于内容,则重复处理密钥
.局部变量 内容副本, 字节集, , , ebp - 4
内容副本 = 内容' 申请内存,会变慢
汇编__字节集_XOR (内容副本, 密钥)
返回 (内容副本)
.子程序 汇编__字节集_XOR_拷贝2, 字节集, , 不更改参数,返回新的字节集。
.参数 内容, 字节集
.参数 密钥, 字节集, , 若短于内容,则重复处理密钥
.局部变量 内容副本, 字节集, , , ebp - 4
内容副本 = 内容' 申请内存,会变慢
置入代码 ({ 86, 87, 83, 139, 117, 252, 131, 198, 8, 139, 126, 252, 1, 247, 57, 254, 116, 35, 139, 77, 12, 139, 9, 131, 193, 8, 139, 81, 252, 1, 202, 137, 203, 57, 209, 116, 16, 138, 1, 65, 48, 6, 70, 57, 209, 117, 2, 137, 217, 57, 254, 117, 240, 91, 95, 94 })
返回 (内容副本)
```
测试结果
```text
性能测试_无拷贝
百万次执行耗时 -- 78ms
百万次执行耗时 -- 62ms
百万次执行耗时 -- 63ms
百万次执行耗时 -- 62ms
百万次执行耗时 -- 63ms
百万次执行耗时 -- 47ms
百万次执行耗时 -- 62ms
百万次执行耗时 -- 63ms
百万次执行耗时 -- 62ms
百万次执行耗时 -- 63ms
平均耗时: 62.00ms (切尾均值=62.50ms)
最佳成绩: 47ms
最差成绩: 78ms
性能测试_拷贝1
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 171ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 187ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
平均耗时: 173.00ms (切尾均值=172.00ms)
最佳成绩: 171ms
最差成绩: 187ms
性能测试_拷贝2
百万次执行耗时 -- 172ms
百万次执行耗时 -- 156ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 156ms
百万次执行耗时 -- 172ms
百万次执行耗时 -- 172ms
平均耗时: 168.00ms (切尾均值=172.00ms)
最佳成绩: 156ms
最差成绩: 172ms
```
这个代码我就不打包了… 如果真的需要就直接复制来用吧
牛逼牛逼
感谢分享
页:
[1]