gpt4 book ai didi

c - 如何在 __asm__ 中使用 int?

转载 作者:行者123 更新时间:2023-11-30 14:50:18 25 4
gpt4 key购买 nike

我想在 c 中使用 char 变量并将其添加到汇编代码中。

char c = 'X';
__asm__ __volatile__("movb '"c"', %ah\n");

但是当我使用它时,它说需要一个字符串文字。我该如何转换它?另外,我使用此代码来制作我自己的操作系统,因此不会有标准库。

最佳答案

您的内联汇编器生产线有两个问题:

1) 您正在使用 AT&T 语法。在 AT&T 语法中,常量值使用 $:

mov $'c', %ah

据我所知,使用内联汇编时,% 必须写为 %% - 类似于 printf()。所以一个正确的程序应该是这样的:

#define c "X"
__asm__ __volatile__("movb $'" c "', %%ah\n");

2) 仅当 c 是字符串常量时才有效。

如果要使用参数,则必须使用内联汇编器操作数。如果 c 是一个常量,则以下内容将起作用:

__asm__ __volatile__("movb %0, %%ah\n"::"i" (c));

这将生成指令 movb $'x', %ah 但这仅在编译器优化打开时才有效,这样编译器就知道 c 具有该值'x' 在这里。

如果 c 确实是一个变量(可以更改其值)或者编译器无法确定 c 具有常量值,则您必须执行类似的操作这个:

__asm__ __volatile__("movb %0, %%ah\n"::"m" (c));

这将产生类似 movb 7(%rsp), %ah 的指令(或者在 32- 的情况下为 movb 3(%esp), %ah)位代码)。

在互联网上搜索有关内联汇编的信息时,我发现以下页面包含更多信息:

https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

关于c - 如何在 __asm__ 中使用 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49077999/

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