【问题标题】:Gcc inline ASM, set EBX to char array address using LEAGcc 内联 ASM,使用 LEA 将 EBX 设置为 char 数组地址
【发布时间】:2014-01-27 21:42:12
【问题描述】:

我正在尝试将内联 asm 代码从 VS 转换为 GCC (AT&T).. 原始代码是这个:

char mystr[] = "Hello world";
_asm mov eax,0
_asm lea ebx, [mystr]

这是我尝试将代码转换为 gcc at&t 语法:

char mystr[] = "Hello world";
asm("mov $0,%%eax\n"
    "leal (%0),%%ebx\n"
    : : "r"(mystr));

这段代码似乎不起作用,知道为什么吗? 非常感谢

【问题讨论】:

  • 您遇到了什么错误? gcc -c -S file.c 生成什么?
  • 好吧,在 lea 行之后有一个对 int 0x80 的调用(我没有在这里写),这个调用调用了一种 printf。 (我正在为大学考试做一些内核材料)。我没有收到错误,但似乎 mystr 的地址没有正确写入 ebx,因为我看不到屏幕上显示的字符串..
  • : : "r"(mystr));告诉 gcc %ebx 已被破坏,之后无法使用其内容。您需要将 mystr 放在输出列表中,而不是 "r"(mystr)) : : ;。顺便说一句,对 %eax 的更改怎么样?
  • 呃,我要把mystr的地址写在ebx里,为什么还要把mystrl放在输出中呢? :/ .. 至于eax,它是正确的,它应该包含0 ;)

标签: gcc assembly inline-assembly


【解决方案1】:

此代码似乎有效:

char* mystr = "Hello world";

asm("mov $0,%%eax\n"
    "leal (%0),%%ebx"
    ::"b"(mystr));

我已将 char mystr[] 更改为 char* mystr,并将 "r" 更改为 "b".. 如果有人知道“b”到底是做什么的,请告诉我...... 非常感谢

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 2012-02-08
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
相关资源
最近更新 更多