【问题标题】:x64 assembly, ret register and variablesx64 程序集、ret 寄存器和变量
【发布时间】:2014-03-23 18:17:37
【问题描述】:

我对 x64 程序集比较陌生,我将它与 VS2010 结合使用。 我正在努力处理来自 proc 的返回值,我真的找不到适合初学者的高质量文档。

.data
 MyByte db 10

 .code
GetValueFromASM proc
mov rax, 28
mov rbx , 19
lea rax, MyByte
mov rax, 10
mov eax, 11
mov ecx, 100

ret
GetValueFromASM endp
end

Ret 指令在我的 c++ 前端打印出 eax 的值,是否有某种默认返回寄存器,或者你可以指定它吗?

#include <iostream>

using namespace std;

extern "C" int GetValueFromASM();

int main()
{
    cout << "sup, asm said " <<GetValueFromASM()<<endl;

    cin.get();
    return 0;
}

此外,指令 mov [reg], MyByte 产生错误,否则您如何将变量放入寄存器?

【问题讨论】:

标签: c++ assembly 64-bit


【解决方案1】:

ret 不会更改寄存器,它不像 C 语言中的 return 语句需要一个操作数。根据调用约定,调用者期望寄存器eax 中的返回值。在msdn 上阅读它。

mov [reg], MyByte 将是内存到内存的移动,不受支持,无论如何也不会做你想做的事。您可能希望 mov reg, MyByte 不带括号,以便将值放入寄存器中。

【讨论】:

  • mov reg, mybyte不把mybyte的地址移动到reg吗?
  • 啊,感谢您的链接,让我们深入了解寄存器,(mov al,MyByte 有效)。我将变量设置为寄存器的错误大小。定义 MyByte dword 11 并使用 mov eax,MyByte 可以正确编译和输出。谢谢!
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 2015-04-20
相关资源
最近更新 更多