簡體   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