繁体   English   中英

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 $1, %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 $1, %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的loop分支执行jmp loop而不是jmp right 至少,这是你的错误之一 ,IDK如果有更多的。 (更新:@zch发现了C语言中的错误,该错误解释了您提到的截断。)

如果您使用比loop更好的名称,这将更容易发现。 例如left

但是无论如何,您都不应该循环播放。 x86具有rol %cl, %rdiror %cl, %rdi ,您可以使用它们代替循环。 只要mov您的移位数为%ecx ,像mov %esi, %ecx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM