x86_64 AT&T 程序集中的旋转函数
Rotate Function in x86_64 AT&T assembly
我在 AT&T 64 位汇编中实现了一个旋转函数,但在我的代码中无法获得正确的输出。
我要实现的功能是
unsigned long rotate(unsigned long val, ul num, ul dir);
Val
是我想要旋转的值,num
是多少次和方向是左还是右,0是右,1是左。
我的汇编代码:
.global rotate
rotate: #value = %rdi
#num = %rsi
#direction = %rdx
mov %rsi, %r10 #puts num into register
test %rdx, %rdx
jz right #if rdx is 0 jump to rotate right
#else go to loop right below which rotates left
loop:
test %r10, %r10 #if num is 0 I am done
jz done
rol , %rdi #rotate left 1 bit
dec %r10 #decrement my count
jmp loop #jump to top of loop
right: #same logic as left
test %r10, %10
jz done
rol , %rdi
dec %r10
jmp loop
done:
mov %rdi, %rax
ret
我的 C 代码:
#include <stdio.h>
extern unsigned long rotate(unsigned long val, unsigned long num, unsigned long direction);
int main()
{
unsigned long v,n,d;
v = 0xDEADBEEFDEADBEEF;
n = 2;
d = 1;
printf("%x\n ", rotate(v,n,d));
}
当我编译和 运行 时,我得到了值 0x7AB6FBBF
,而我应该得到 0x7AB6FBBF7AB6FBBF
。
我的指令没有发送 unsigned long
之类的东西有什么问题吗?
printf("%x", a)
适用于 unsigned int
类型。在 unsigned long
上,您需要使用 "%lx"
作为格式字符串。
您的 asm 中有一个错误:right
中的循环分支执行 jmp loop
而不是 jmp right
。至少这是 一个 的错误,如果还有更多错误,请 IDK。 (更新:@zch 发现了你的 C 中的错误,它解释了你提到的截断。)
如果您使用比 loop
更好的名称,这会更容易被发现。例如left
.
但无论如何你都不应该循环播放。 x86 有 rol %cl, %rdi
和 ror %cl, %rdi
,您可以使用它们代替循环。简单地 mov
你的班次计数为 %ecx
,例如 mov %esi, %ecx
.
我在 AT&T 64 位汇编中实现了一个旋转函数,但在我的代码中无法获得正确的输出。
我要实现的功能是
unsigned long rotate(unsigned long val, ul num, ul dir);
Val
是我想要旋转的值,num
是多少次和方向是左还是右,0是右,1是左。
我的汇编代码:
.global rotate
rotate: #value = %rdi
#num = %rsi
#direction = %rdx
mov %rsi, %r10 #puts num into register
test %rdx, %rdx
jz right #if rdx is 0 jump to rotate right
#else go to loop right below which rotates left
loop:
test %r10, %r10 #if num is 0 I am done
jz done
rol , %rdi #rotate left 1 bit
dec %r10 #decrement my count
jmp loop #jump to top of loop
right: #same logic as left
test %r10, %10
jz done
rol , %rdi
dec %r10
jmp loop
done:
mov %rdi, %rax
ret
我的 C 代码:
#include <stdio.h>
extern unsigned long rotate(unsigned long val, unsigned long num, unsigned long direction);
int main()
{
unsigned long v,n,d;
v = 0xDEADBEEFDEADBEEF;
n = 2;
d = 1;
printf("%x\n ", rotate(v,n,d));
}
当我编译和 运行 时,我得到了值 0x7AB6FBBF
,而我应该得到 0x7AB6FBBF7AB6FBBF
。
我的指令没有发送 unsigned long
之类的东西有什么问题吗?
printf("%x", a)
适用于 unsigned int
类型。在 unsigned long
上,您需要使用 "%lx"
作为格式字符串。
您的 asm 中有一个错误:right
中的循环分支执行 jmp loop
而不是 jmp right
。至少这是 一个 的错误,如果还有更多错误,请 IDK。 (更新:@zch 发现了你的 C 中的错误,它解释了你提到的截断。)
如果您使用比 loop
更好的名称,这会更容易被发现。例如left
.
但无论如何你都不应该循环播放。 x86 有 rol %cl, %rdi
和 ror %cl, %rdi
,您可以使用它们代替循环。简单地 mov
你的班次计数为 %ecx
,例如 mov %esi, %ecx
.