gpt4 book ai didi

c - 如何在 c 中使用 64 位内联汇编?

转载 作者:行者123 更新时间:2023-12-01 22:18:43 28 4
gpt4 key购买 nike

int main(void) {
unsigned long long a = 0x0ab0000000234432;
unsigned long long b = 0x0000000000000001;
unsigned long long c = 0x0000000032123001;
unsigned long long r1;

__asm__ __volatile__(
"mov %1, %%eax \n\t"
"xor %2, %%eax \n\t"
"xor %3, %%eax "
: "=&a" (r1)
: "g" (a), "g" (b), "g"(c));

for(i=63; i>=0; i--) {
printf("%d ", (r1 >> i) & 1 );
if (i%8 == 0) printf(" ");
}
printf("\n");
return 0;
}

二进制值是那个
a = 00001010 10110000 00000000 00000000 00000000 00100011 01000100 00110010
b = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001
c = 00000000 00000000 00000000 00000000 00110010 00010010 00110000 00000001

我想得到 00001010 10110000 00000000 00000000 00110010 00110001 01110100 00110010 的结果。
但是,结果是 00000000 00000000 00000000 00000000 00110010 00110001 01110100 00110010

我认为代码是通过 32 位模式编译的。
我使用 MAC OS X、英特尔 CPU 和 GCC。

如何使用 64 位内联汇编

最佳答案

根据 Greg 的回答,您正在尝试使用 32-bit 寄存器 eax 并想要填充 64-bits进入他们。你不能。 X86_x64 汇编器是 32 位汇编器的扩展(但有许多插件)。出于此处的目的,寄存器大小从 32-bit 增加到 64-bit 并且寄存器也被重命名。就像 16-bit 寄存器增加到 32-bit 并将 ax 重命名为 eax 一样,增加到64-bit,寄存器再次重命名为 eaxrax。这些是唯一需要的更改。示例:

#include <stdio.h>

int main ()
{

unsigned long long a = 0x0ab0000000234432;
unsigned long long b = 0x0000000000000001;
unsigned long long c = 0x0000000032123001;
unsigned long long r1;
int i = 0;

__asm__ __volatile__(
"mov %1, %%rax \n\t"
"xor %2, %%rax \n\t"
"xor %3, %%rax "
: "=&a" (r1)
: "g" (a), "g" (b), "g"(c));

for(i=63; i>=0; i--){

printf("%d", (int)(r1 >> i) & 1 );

if(i%8 == 0 ) printf(" ");
}

printf("\n");

return 0;
}

输出:

00001010 10110000 00000000 00000000 00110010 00110001 01110100 00110010

关于c - 如何在 c 中使用 64 位内联汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26855382/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com