我怎样才能在__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 ........