我怎样才能在__asm__中使用int?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我怎样才能在__asm__中使用int?相关的知识,希望对你有一定的参考价值。

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

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

但是当我使用它时,它表示字符串文字是预期的。我该如何施展它?此外,我使用此代码来制作我自己的操作系统,因此不会有标准库。

答案

您的内联汇编程序行有两个问题:

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

mov $'c', %ah

据我所知,当使用内联汇编时,%必须写成%% - 类似于printf()。所以正确的程序看起来像这样:

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

2)仅当c是一个字符串常量时才会起作用。

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

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

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

如果c实际上是一个变量(可以改变它的值)或编译器无法弄清楚c有一个常数值,你将不得不这样做:

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

这将导致像movb 7(%rsp), %ah(或32位代码情况下的movb 3(%esp), %ah)这样的指令。

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

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

以上是关于我怎样才能在__asm__中使用int?的主要内容,如果未能解决你的问题,请参考以下文章

gcc编译,出现错误:expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ........

我怎样才能让 C++0x 和 __STRICT_ANSI__ 相处融洽?

(操作系统)如何在 c 中使用 __asm mfence

__asm__ gcc 调用内存地址

ARM嵌入式开发中的GCC内联汇编__asm__

clang __asm__在case statment中使用标签,得到错误:指令操作数无效。