易语言 int64 位运算

前情提要

易语言那个位运算全部都是整数型32位的,没辙了,自己写个64位的,当做备忘吧,希望能帮到大家。

汇编内容是用VC写的,然后用OD反编译后自己重新写的,也许不够精炼,但应该比较稳定。

源代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
.版本 2

.程序集 位运算

.子程序 右移_, 长整数型, 公开, 将某整数的数据位右移指定位数,返回移动后的结果。本命令为中级命令。
.参数 欲移动的整数, 长整数型
.参数 欲移动的位数, 整数型

' push ebp
置入代码 ({ 137, 229, 139, 69, 8, 139, 85, 12, 139, 77, 16, 232, 4, 0, 0, 0, 93, 194, 12, 0, 128, 249, 64, 115, 22, 128, 249, 32, 115, 6, 15, 173, 208, 211, 250, 195, 137, 208, 193, 250, 31, 128, 225, 31, 211, 248, 195, 193, 250, 31, 137, 208, 195 })
' mov ebp,esp
' mov eax,[ebp+8h]
' mov edx,[ebp+Ch]
' mov ecx,[ebp+10h]
' call a0
' pop ebp
' retn Ch
' a0:
' cmp cl,40h
' jnb short a1
' cmp cl,20h
' jnb short a2
' shrd eax,edx,cl
' sar edx,cl
' retn
' a2:
' mov eax,edx
' sar edx,1Fh
' and cl,1Fh
' sar eax,cl
' retn
' a1:
' sar edx,1Fh
' mov eax,edx
' retn
返回 (0)

.子程序 左移_, 长整数型, 公开, 将某整数的数据位左移指定位数,返回移动后的结果。本命令为中级命令。
.参数 欲移动的整数, 长整数型
.参数 欲移动的位数, 整数型

' push ebp
置入代码 ({ 137, 229, 139, 69, 8, 139, 85, 12, 139, 77, 16, 232, 4, 0, 0, 0, 93, 194, 12, 0, 128, 249, 64, 115, 21, 128, 249, 32, 115, 6, 15, 165, 194, 211, 224, 195, 137, 194, 49, 192, 128, 225, 31, 211, 226, 195, 49, 192, 49, 210, 195 })
' mov ebp,esp
' mov eax,[ebp+8h]
' mov edx,[ebp+Ch]
' mov ecx,[ebp+10h]
' call a0
' pop ebp
' retn 0xC
' a0:
' cmp cl,40h
' jnb a1
' cmp cl,20h
' jnb a2
' shld edx,eax,cl
' shl eax,cl
' retn
' a2:
' mov edx,eax
' xor eax,eax
' and cl,1Fh
' shl edx,cl
' retn
' a1:
' xor eax,eax
' xor edx,edx
' retn
返回 (0)

.子程序 位与_, 长整数型, 公开, 如两个数值有某共同比特位为1,则返回值的对应位也为1,否则为0。返回计算后的结果。本命令为中级命令。命令参数表中最后一个参数可以被重复添加。
.参数 位运算数值一, 长整数型
.参数 位运算数值二, 长整数型

' push ebp
置入代码 ({ 137, 229, 139, 69, 8, 35, 69, 16, 139, 85, 12, 35, 85, 20, 93, 194, 16, 0 })
' mov ebp,esp
' mov eax,[ebp+8h]
' and eax,[ebp+10h]
' mov edx,[ebp+Ch]
' and edx,[ebp+14h]
' pop ebp
' retn 10h
返回 (0)

.子程序 位或_, 长整数型, 公开, 如两个数值中有一个数值的某一比特位不为零,则返回值的对应位就为1,否则为0。返回计算后的结果。本命令为中级命令。命令参数表中最后一个参数可以被重复添加。
.参数 位运算数值一, 长整数型
.参数 位运算数值二, 长整数型

' push ebp
置入代码 ({ 137, 229, 139, 69, 8, 11, 69, 16, 139, 85, 12, 11, 85, 20, 93, 194, 16, 0 })
' mov ebp,esp
' mov eax,[ebp+8h]
' or eax,[ebp+10h]
' mov edx,[ebp+Ch]
' or edx,[ebp+14h]
' pop ebp
' retn 10h
返回 (0)