hdxzd12 发表于 2023-8-16 17:53

汇编_字节集异或



爱飞的猫 发表于 2023-8-17 07:15

本帖最后由 爱飞的猫 于 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
```

感觉应该是 `参与异或的字节集 = 取重复字节集 (参与异或的字节集长度, 参与异或的字节集)` 这一行对性能的影响最大。

易语言代码(附赠一个 `汇编_字节集到十六进制` 的实现):


tly111222 发表于 2023-8-16 19:00

这个是。。。。

gjdir 发表于 2023-8-16 19:26

这以前下载过,再支持一下!

moruye 发表于 2023-8-16 20:51

lixiong627 发表于 2023-8-16 22:31

感谢分享

hdxzd12 发表于 2023-8-17 08:49

爱飞的猫 发表于 2023-8-17 07:15
如果要优化性能,还是直接传引用然后改比较好,可以纯汇编实现:

```text


能不能在这里加一个返回值

爱飞的猫 发表于 2023-8-17 08:51

本帖最后由 爱飞的猫 于 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
```

这个代码我就不打包了… 如果真的需要就直接复制来用吧

zxmkji 发表于 2023-10-2 12:46

牛逼牛逼
感谢分享
页: [1]
查看完整版本: 汇编_字节集异或