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

问题描述 投票:0回答:1

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

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

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

c assembly
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.