[英]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, %rdi
和ror %cl, %rdi
,您可以使用它們代替循環。 只要mov
您的移位數為%ecx
,像mov %esi, %ecx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.